@lichens-innovation/ts-common 1.18.0 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,27 +5,32 @@ Reusable generic typescript utilities, types, constants, helpers
5
5
  > **Note:** The default export is **pure TypeScript** and **environment-agnostic**—it has no dependency on Node.js, browser, or React Native APIs, so the same code runs in any of these runtimes. Subpath imports such as `@lichens-innovation/ts-common/web` target a specific environment and rely on its APIs.
6
6
 
7
7
  <!-- Package & Status -->
8
+
8
9
  [![npm version](https://img.shields.io/npm/v/@lichens-innovation/ts-common.svg?style=flat-square)](https://www.npmjs.com/package/@lichens-innovation/ts-common)
9
10
  [![npm downloads](https://img.shields.io/npm/dm/@lichens-innovation/ts-common.svg?style=flat-square)](https://www.npmjs.com/package/@lichens-innovation/ts-common)
10
11
  [![Build Status](https://img.shields.io/github/actions/workflow/status/Lichens-Innovation/ts-common/create-release.yml?branch=main&style=flat-square&logo=github)](https://github.com/Lichens-Innovation/ts-common/actions)
11
12
  [![License](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](LICENSE)
12
13
 
13
14
  <!-- Tech Stack -->
15
+
14
16
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg?style=flat-square&logo=typescript)](https://www.typescriptlang.org/)
15
17
  [![Node.js](https://img.shields.io/badge/Node.js-LTS-green.svg?style=flat-square&logo=node.js)](https://nodejs.org/)
16
- [![Yarn](https://img.shields.io/badge/Yarn-1.22+-2C8EBB.svg?style=flat-square&logo=yarn)](https://yarnpkg.com/)
18
+ [![Bun](https://img.shields.io/badge/Bun-1.2+-FBF0DF.svg?style=flat-square&logo=bun)](https://bun.sh/)
17
19
 
18
20
  <!-- Code Quality -->
21
+
19
22
  [![Vitest](https://img.shields.io/badge/Vitest-4.0-6E9F18.svg?style=flat-square&logo=vitest)](https://vitest.dev/)
20
23
  [![ESLint](https://img.shields.io/badge/ESLint-9.x-4B32C3.svg?style=flat-square&logo=eslint)](https://eslint.org/)
21
24
  [![Prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square&logo=prettier)](https://prettier.io/)
22
25
 
23
26
  <!-- Standards -->
27
+
24
28
  [![Semantic Versioning](https://img.shields.io/badge/semver-2.0.0-blue.svg?style=flat-square)](https://semver.org/)
25
29
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://makeapullrequest.com)
26
30
  [![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme)
27
31
 
28
32
  Table of content
33
+
29
34
  - [ts-common](#ts-common)
30
35
  - [Prerequisites](#prerequisites)
31
36
  - [Scripts](#scripts)
@@ -46,23 +51,23 @@ Table of content
46
51
 
47
52
  ## Prerequisites
48
53
 
49
- - Node.js (LTS or higher)
50
- - Yarn
54
+ - Node.js (>=20.x)
55
+ - Bun (>=1.2.0)
51
56
 
52
57
  ## Scripts
53
58
 
54
- | Command | Description |
55
- |------------------------------|-----------------------------------------------------------------------------|
56
- | `yarn prepare` | Configures Husky (Git hooks). Runs automatically after `yarn install`. |
57
- | `yarn build` | Compiles the project with tsup (outputs to `dist/`). |
58
- | `yarn clean:node` | Removes `node_modules` and `yarn.lock`. |
59
- | `yarn clean:dist` | Removes the `dist` directory. |
60
- | `yarn typecheck` | Type-checks TypeScript without emitting files (`tsc --noEmit`). |
61
- | `yarn lint` | Runs ESLint on the project. |
62
- | `yarn lint:fix` | Runs ESLint and applies automatic fixes. |
63
- | `yarn test` | Runs tests with Vitest and coverage report. |
64
- | `yarn test:watch` | Runs tests in watch mode with Vitest. |
65
- | `yarn test:coverage` | Runs tests with coverage report using Vitest. |
59
+ | Command | Description |
60
+ | ----------------------- | --------------------------------------------------------------------- |
61
+ | `bun run prepare` | Configures Husky (Git hooks). Runs automatically after `bun install`. |
62
+ | `bun run build` | Compiles the project with tsup (outputs to `dist/`). |
63
+ | `bun run clean:node` | Removes `node_modules` and `bun.lockb`. |
64
+ | `bun run clean:dist` | Removes the `dist` directory. |
65
+ | `bun run typecheck` | Type-checks TypeScript without emitting files (`tsc --noEmit`). |
66
+ | `bun run lint` | Runs ESLint on the project. |
67
+ | `bun run lint:fix` | Runs ESLint and applies automatic fixes. |
68
+ | `bun run test` | Runs tests with Vitest and coverage report. |
69
+ | `bun run test:watch` | Runs tests in watch mode with Vitest. |
70
+ | `bun run test:coverage` | Runs tests with coverage report using Vitest. |
66
71
 
67
72
  ## Optional modules
68
73
 
@@ -120,14 +125,14 @@ npm install pino-pretty
120
125
  **Usage example:**
121
126
 
122
127
  ```ts
123
- import { logger, setLoggerMinimumLevel, type Level } from "@lichens-innovation/ts-common/logger";
128
+ import { logger, setLoggerMinimumLevel, type Level } from '@lichens-innovation/ts-common/logger';
124
129
 
125
130
  // Minimum level (optional): "trace" | "debug" | "info" | "warn" | "error" | "fatal"
126
- setLoggerMinimumLevel("debug");
131
+ setLoggerMinimumLevel('debug');
127
132
 
128
- logger.info("Simple message");
129
- logger.debug("Debug", { userId: "123", action: "login" });
130
- logger.error("Error", { code: 500 });
133
+ logger.info('Simple message');
134
+ logger.debug('Debug', { userId: '123', action: 'login' });
135
+ logger.error('Error', { code: 500 });
131
136
  ```
132
137
 
133
138
  ### RJSF (`@lichens-innovation/ts-common/rjsf`)
@@ -142,7 +147,7 @@ npm install @rjsf/core @rjsf/utils @rjsf/validator-ajv8 ajv-i18n i18next react-i
142
147
 
143
148
  ## Contributions
144
149
 
145
- Contributions to the project are made by simply improving the current codebase and then creating a Pull Request. If the version field in `package.json` is incremented, the build will be automatically triggered when the PR is merged into the `main` branch, and the new version will be published to our enterprise Git repository.
150
+ Contributions to the project are made by simply improving the current codebase and then creating a Pull Request. When the PR is merged into `main`, the CI pipeline runs automatically. [semantic-release](https://semantic-release.gitbook.io/) determines the next version from conventional commit messages, updates `CHANGELOG.md` and `package.json`, and publishes the new version to the GitHub Packages registry no manual version bump required.
146
151
 
147
152
  ## Unit tests
148
153
 
@@ -150,22 +155,27 @@ Test coverage must be maintained at 80% or higher. It is therefore important to
150
155
 
151
156
  ## Library semantic versioning
152
157
 
153
- When there is a breaking change, [Semantic Versioning](https://semver.org/#summary) must be used to indicate that a major behavior has changed. Semantic Versioning follows the `MAJOR.MINOR.PATCH` format:
158
+ Versioning is automated by [semantic-release](https://semantic-release.gitbook.io/) using [Conventional Commits](https://www.conventionalcommits.org/). The release type is derived from commit message prefixes:
159
+
160
+ | Commit prefix | Release type |
161
+ | ----------------------------- | ----------------------------------------------- |
162
+ | `fix:` | `PATCH` — backward-compatible bug fix |
163
+ | `feat:` | `MINOR` — new backward-compatible functionality |
164
+ | `feat!:` / `BREAKING CHANGE:` | `MAJOR` — incompatible API change |
154
165
 
155
- * `MAJOR` version when you make incompatible API changes
156
- * `MINOR` version when you add functionality in a backward compatible manner
157
- * `PATCH` version when you make backward compatible bug fixes
166
+ Follow [Semantic Versioning](https://semver.org/#summary) (`MAJOR.MINOR.PATCH`) when writing commit messages the tooling takes care of the rest.
158
167
 
159
168
  ## Project coding guidelines
160
169
 
161
170
  Adhering to established coding guidelines is essential for developing efficient, maintainable, and scalable software. These guidelines promote consistency across codebases, making it easier for teams to collaborate and for new developers to understand existing code. By following standardized patterns, such as those outlined in the [Coding guidelines](https://github.com/amwebexpert/chrome-extensions-collection/blob/master/packages/coding-guide-helper/public/markdowns/table-of-content.md), developers can reduce errors and enhance code readability.
162
171
 
163
- * [Coding guidelines](https://github.com/amwebexpert/chrome-extensions-collection/blob/master/packages/coding-guide-helper/public/markdowns/table-of-content.md)
172
+ - [Coding guidelines](https://github.com/amwebexpert/chrome-extensions-collection/blob/master/packages/coding-guide-helper/public/markdowns/table-of-content.md)
164
173
 
165
174
  ## TODOs
166
175
 
167
176
  This section list remaining tasks (not yet completed)
168
- * RJSF-001: find a way to dynamically resolve the rjsf-i18n.utils "%1 Key" pattern
177
+
178
+ - RJSF-001: find a way to dynamically resolve the rjsf-i18n.utils "%1 Key" pattern
169
179
 
170
180
  ## License
171
181
 
@@ -44,4 +44,4 @@ interface Dimensions {
44
44
  height: number;
45
45
  }
46
46
 
47
- export { type Dimensions as D, type NormalizedRgb as N, type RgbColor as R, type RgbaColor as a, rgbaToHex as b, rgbaToHexWithAlpha as c, rgbToString as d, rgbaToString as e, getLuminance as f, getOpacityHexValue as g, hexToRgb as h, getContrastTextColor as i, hexToNormalizedRgb as j, isLightColor as k, getColorForPercentage as l, rgbToHex as r };
47
+ export { type Dimensions as D, type NormalizedRgb as N, type RgbColor as R, type RgbaColor as a, getContrastTextColor as b, getLuminance as c, getOpacityHexValue as d, hexToRgb as e, rgbToString as f, getColorForPercentage as g, hexToNormalizedRgb as h, isLightColor as i, rgbaToHex as j, rgbaToHexWithAlpha as k, rgbaToString as l, rgbToHex as r };
@@ -44,4 +44,4 @@ interface Dimensions {
44
44
  height: number;
45
45
  }
46
46
 
47
- export { type Dimensions as D, type NormalizedRgb as N, type RgbColor as R, type RgbaColor as a, rgbaToHex as b, rgbaToHexWithAlpha as c, rgbToString as d, rgbaToString as e, getLuminance as f, getOpacityHexValue as g, hexToRgb as h, getContrastTextColor as i, hexToNormalizedRgb as j, isLightColor as k, getColorForPercentage as l, rgbToHex as r };
47
+ export { type Dimensions as D, type NormalizedRgb as N, type RgbColor as R, type RgbaColor as a, getContrastTextColor as b, getLuminance as c, getOpacityHexValue as d, hexToRgb as e, rgbToString as f, getColorForPercentage as g, hexToNormalizedRgb as h, isLightColor as i, rgbaToHex as j, rgbaToHexWithAlpha as k, rgbaToString as l, rgbToHex as r };
package/dist/index.cjs CHANGED
@@ -359,6 +359,18 @@ var truncate = (str, maxLength, ellipsis = "...") => {
359
359
  if (!str || str.length <= maxLength) return str;
360
360
  return str.slice(0, maxLength - ellipsis.length) + ellipsis;
361
361
  };
362
+ var toKebabCase = (value) => {
363
+ if (isBlank(value)) return "";
364
+ return value.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2").replace(/[\s_]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").toLowerCase();
365
+ };
366
+ var toCamelCase = (value) => {
367
+ if (isBlank(value)) return "";
368
+ return value.trim().replace(/[-_\s]+(.)/g, (_, char) => char.toUpperCase()).replace(/^[A-Z]/, (char) => char.toLowerCase());
369
+ };
370
+ var slugify = (value) => {
371
+ if (!value) return "";
372
+ return removeDiacriticalMarks(value).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
373
+ };
362
374
  var parseCommaSeparatedList = (raw) => {
363
375
  if (isBlank(raw)) {
364
376
  return [];
@@ -535,6 +547,13 @@ var formatDuration = (ms) => {
535
547
  }
536
548
  return `${(ms / 1e3).toFixed(1)}s`;
537
549
  };
550
+ var formatWithSpaceSeparator = (val) => {
551
+ if (isNullish(val)) return "";
552
+ return String(val).replace(/\B(?=(\d{3})+(?!\d))/g, "\xA0");
553
+ };
554
+ var parseWithSpaceSeparator = (val) => {
555
+ return Number(val?.replace(/\u00a0/g, ""));
556
+ };
538
557
  var getOrderOfMagnitudeExponent = (n) => {
539
558
  if (isNullish(n)) return 0;
540
559
  if (!isNumber(n)) return 0;
@@ -554,6 +573,20 @@ var isRuntimeEnvNodeJs = () => {
554
573
  return true;
555
574
  };
556
575
 
576
+ // src/utils/text.utils.ts
577
+ var firstSentence = (s) => {
578
+ const m = s.match(/^[^.!?]+[.!?]/);
579
+ return m ? m[0].trim() : s.trim();
580
+ };
581
+ var titleFromName = ({ name, fallback = "" }) => {
582
+ return (name || fallback).split("-").map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
583
+ };
584
+ var joinOxford = (items) => {
585
+ if (items.length === 0) return "";
586
+ if (items.length === 1) return items[0];
587
+ return items.slice(0, -1).join(", ") + " or " + items.slice(-1)[0];
588
+ };
589
+
557
590
  // src/utils/thread.utils.ts
558
591
  var sleep = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
559
592
  var yieldToMainThread = () => sleep(0);
@@ -687,12 +720,14 @@ exports.encodeBase64 = encodeBase64;
687
720
  exports.encodeUrl = encodeUrl;
688
721
  exports.escapeHtml = escapeHtml;
689
722
  exports.extractBase64FromDataUri = extractBase64FromDataUri;
723
+ exports.firstSentence = firstSentence;
690
724
  exports.formatCount = formatCount;
691
725
  exports.formatDataUri = formatDataUri;
692
726
  exports.formatDuration = formatDuration;
693
727
  exports.formatIntegerDisplay = formatIntegerDisplay;
694
728
  exports.formatJson = formatJson;
695
729
  exports.formatUnixTimestamp = formatUnixTimestamp;
730
+ exports.formatWithSpaceSeparator = formatWithSpaceSeparator;
696
731
  exports.fromHzToRpm = fromHzToRpm;
697
732
  exports.fromM3psToGPM = fromM3psToGPM;
698
733
  exports.fromMToInches = fromMToInches;
@@ -733,6 +768,7 @@ exports.isValidDataUri = isValidDataUri;
733
768
  exports.isValidJson = isValidJson;
734
769
  exports.isWsClosable = isWsClosable;
735
770
  exports.isWsOpenOrConnecting = isWsOpenOrConnecting;
771
+ exports.joinOxford = joinOxford;
736
772
  exports.minifyJson = minifyJson;
737
773
  exports.nowAsDate = nowAsDate;
738
774
  exports.nowAsDateTime = nowAsDateTime;
@@ -740,6 +776,7 @@ exports.nowAsDateTimeForFilename = nowAsDateTimeForFilename;
740
776
  exports.nowAsTime = nowAsTime;
741
777
  exports.parseCommaSeparatedList = parseCommaSeparatedList;
742
778
  exports.parseOptionalFormNumber = parseOptionalFormNumber;
779
+ exports.parseWithSpaceSeparator = parseWithSpaceSeparator;
743
780
  exports.prettifyJson = prettifyJson;
744
781
  exports.removeDiacriticalMarks = removeDiacriticalMarks;
745
782
  exports.rgbToHex = rgbToHex;
@@ -752,12 +789,16 @@ exports.roundUpToNearest10 = roundUpToNearest10;
752
789
  exports.safeJsonParse = safeJsonParse;
753
790
  exports.safeJsonStringify = safeJsonStringify;
754
791
  exports.sleep = sleep;
792
+ exports.slugify = slugify;
755
793
  exports.sortObjectKeys = sortObjectKeys;
756
794
  exports.tickFormatter = tickFormatter;
795
+ exports.titleFromName = titleFromName;
796
+ exports.toCamelCase = toCamelCase;
757
797
  exports.toError = toError;
758
798
  exports.toFixed = toFixed;
759
799
  exports.toFormString = toFormString;
760
800
  exports.toFormStringInteger = toFormStringInteger;
801
+ exports.toKebabCase = toKebabCase;
761
802
  exports.toToleranceLabel = toToleranceLabel;
762
803
  exports.tooltipValueFormatter = tooltipValueFormatter;
763
804
  exports.truncate = truncate;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/base64.utils.ts","../src/utils/types.utils.ts","../src/utils/chart.utils.ts","../src/utils/color.utils.ts","../src/utils/date.utils.ts","../src/utils/errors.utils.ts","../src/utils/regex.ts","../src/utils/string.utils.ts","../src/utils/filename.utils.ts","../src/utils/form.utils.ts","../src/utils/html.utils.ts","../src/utils/http.utils.ts","../src/utils/json.utils.ts","../src/utils/number.utils.ts","../src/utils/runtime-env.utils.ts","../src/utils/thread.utils.ts","../src/utils/time.utils.ts","../src/utils/units.utils.ts","../src/utils/uri.utils.ts","../src/utils/websocket.utils.ts"],"names":["format"],"mappings":"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","file":"index.cjs","sourcesContent":["const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nconst encodeUtf8ToBytes = (text: string): number[] => {\n const codePoints: number[] = [];\n\n for (let i = 0; i < text.length; i++) {\n const codeUnit = text.charCodeAt(i);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff && i + 1 < text.length) {\n const next = text.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n codePoints.push(0x10000 + ((codeUnit - 0xd800) << 10) + (next - 0xdc00));\n i++;\n continue;\n }\n }\n codePoints.push(codeUnit);\n }\n\n const bytes: number[] = [];\n for (const codePoint of codePoints) {\n if (codePoint < 0x80) {\n bytes.push(codePoint);\n } else if (codePoint < 0x800) {\n bytes.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f));\n } else if (codePoint < 0x10000) {\n bytes.push(0xe0 | (codePoint >> 12), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));\n } else {\n bytes.push(\n 0xf0 | (codePoint >> 18),\n 0x80 | ((codePoint >> 12) & 0x3f),\n 0x80 | ((codePoint >> 6) & 0x3f),\n 0x80 | (codePoint & 0x3f),\n );\n }\n }\n\n return bytes;\n};\n\nconst decodeUtf8FromBytes = (bytes: number[]): string => {\n let result = '';\n let i = 0;\n\n while (i < bytes.length) {\n const b0 = bytes[i]!;\n let codePoint: number;\n\n if (b0 < 0x80) {\n codePoint = b0;\n i += 1;\n } else if ((b0 & 0xe0) === 0xc0) {\n codePoint = ((b0 & 0x1f) << 6) | (bytes[i + 1]! & 0x3f);\n i += 2;\n } else if ((b0 & 0xf0) === 0xe0) {\n codePoint = ((b0 & 0x0f) << 12) | ((bytes[i + 1]! & 0x3f) << 6) | (bytes[i + 2]! & 0x3f);\n i += 3;\n } else {\n codePoint =\n ((b0 & 0x07) << 18) |\n ((bytes[i + 1]! & 0x3f) << 12) |\n ((bytes[i + 2]! & 0x3f) << 6) |\n (bytes[i + 3]! & 0x3f);\n i += 4;\n }\n\n if (codePoint <= 0xffff) {\n result += String.fromCharCode(codePoint);\n } else {\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xd800 + (adjusted >> 10), 0xdc00 + (adjusted & 0x3ff));\n }\n }\n\n return result;\n};\n\nconst encodeBytesToBase64 = (bytes: number[]): string => {\n let output = '';\n\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i]!;\n const b1 = i + 1 < bytes.length ? bytes[i + 1]! : 0;\n const b2 = i + 2 < bytes.length ? bytes[i + 2]! : 0;\n const triplet = (b0 << 16) | (b1 << 8) | b2;\n\n output += BASE64_CHARS[(triplet >> 18) & 0x3f];\n output += BASE64_CHARS[(triplet >> 12) & 0x3f];\n output += i + 1 < bytes.length ? BASE64_CHARS[(triplet >> 6) & 0x3f] : '=';\n output += i + 2 < bytes.length ? BASE64_CHARS[triplet & 0x3f] : '=';\n }\n\n return output;\n};\n\nconst decodeBase64ToBytes = (base64: string): number[] => {\n const sanitized = base64.replace(/[^A-Za-z0-9+/=]/g, '');\n const bytes: number[] = [];\n\n for (let i = 0; i < sanitized.length; i += 4) {\n const c0 = BASE64_CHARS.indexOf(sanitized[i]!);\n const c1 = BASE64_CHARS.indexOf(sanitized[i + 1]!);\n const c2 = sanitized[i + 2] === '=' ? 0 : BASE64_CHARS.indexOf(sanitized[i + 2]!);\n const c3 = sanitized[i + 3] === '=' ? 0 : BASE64_CHARS.indexOf(sanitized[i + 3]!);\n\n if (c0 < 0 || c1 < 0 || (sanitized[i + 2] !== '=' && c2 < 0) || (sanitized[i + 3] !== '=' && c3 < 0)) {\n throw new Error('Invalid base64 character');\n }\n\n const triplet = (c0 << 18) | (c1 << 12) | (c2 << 6) | c3;\n\n bytes.push((triplet >> 16) & 0xff);\n if (sanitized[i + 2] !== '=') bytes.push((triplet >> 8) & 0xff);\n if (sanitized[i + 3] !== '=') bytes.push(triplet & 0xff);\n }\n\n return bytes;\n};\n\nexport const encodeBase64 = (text: string): string => {\n try {\n return encodeBytesToBase64(encodeUtf8ToBytes(text));\n } catch {\n return '';\n }\n};\n\nexport const decodeBase64 = (base64: string): string => {\n try {\n return decodeUtf8FromBytes(decodeBase64ToBytes(base64));\n } catch {\n return '';\n }\n};\n","export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { isNullish } from \"./types.utils\";\n\nexport interface ToleranceArea {\n flow: number;\n toleranceRange: [number, number];\n}\n\n/**\n * A chart point with required x and y coordinates.\n */\nexport interface ChartPoint {\n x: number;\n y: number;\n}\n\n/**\n * A chart point with optional nullable x and y coordinates.\n */\nexport interface NullableChartPoint {\n x?: number | null;\n y?: number | null;\n}\n\nexport const getTickDomain = (ticks: number[]): [number, number] => [0, ticks.at(-1) ?? 0];\n\nexport const tickFormatter = (value: number): string => value.toFixed(0);\n\nexport const toToleranceLabel = (value: number): string => `±${(value * 100).toFixed(0)}%`;\n\nexport const tooltipValueFormatter = (data?: unknown | null): string => {\n if (isNullish(data)) {\n return '';\n }\n\n if (typeof data === 'number') {\n return data.toFixed(2);\n }\n\n if (Array.isArray(data) && data.length >= 2) {\n const [min, max] = data;\n if (typeof min === 'number' && typeof max === 'number') {\n return `[${min.toFixed(2)} … ${max.toFixed(2)}]`;\n }\n }\n\n return String(data ?? '');\n};\n\n/**\n * Rounds a raw value to a \"nice\" number for chart axis increments.\n * Nice numbers are easy to read: 1, 2, 2.5, 5, or 10 multiplied by a power of 10.\n *\n * @param rawValue - The raw value to round to a nice number\n * @returns A nice number close to the raw value\n *\n * @example\n * roundToNiceNumber(0.7) // returns 1\n * roundToNiceNumber(3) // returns 5\n * roundToNiceNumber(17) // returns 20\n * roundToNiceNumber(80) // returns 100\n */\nexport const roundToNiceNumber = (rawValue: number): number => {\n if (rawValue <= 0) return 0;\n\n // Get order of magnitude\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawValue)));\n\n // Normalize to find the multiplier (between 1 and 10)\n const normalized = rawValue / magnitude;\n\n // Round to nice values: 1, 2, 2.5, 5, 10\n let niceMultiplier: number;\n if (normalized <= 1) niceMultiplier = 1;\n else if (normalized <= 2) niceMultiplier = 2;\n else if (normalized <= 2.5) niceMultiplier = 2.5;\n else if (normalized <= 5) niceMultiplier = 5;\n else niceMultiplier = 10;\n\n return niceMultiplier * magnitude;\n};\n\nconst roundToPrecision = (value: number, precision = 10): number => {\n const factor = 10 ** precision;\n return Math.round(value * factor) / factor;\n};\n\n/**\n * Builds an array of \"nice\" tick values for a chart axis.\n * The algorithm aims for approximately `targetTickCount` ticks with clean, readable values.\n *\n * @param max - The maximum value to display on the axis\n * @param targetTickCount - The desired number of ticks (default: 10)\n * @returns An array of tick values from 0 to at least `max`\n */\nexport const buildTicksForChart = (max: number, targetTickCount = 10): number[] => {\n if (max <= 0) return [0];\n\n // Calculate raw increment for desired tick count and round to nice value\n const rawIncrement = max / targetTickCount;\n const niceIncrement = roundToNiceNumber(rawIncrement);\n\n // Build ticks from 0 to just past max\n const ticks: number[] = [];\n for (let value = 0; value <= max + niceIncrement * 0.5; value += niceIncrement) {\n // Round to avoid floating point precision issues\n ticks.push(roundToPrecision(value));\n }\n\n // Ensure we have at least one tick >= max\n const lastTick = ticks[ticks.length - 1];\n if (lastTick < max) {\n ticks.push(roundToPrecision(lastTick + niceIncrement));\n }\n\n return ticks;\n};\n","export interface RgbColor {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface RgbaColor extends RgbColor {\n a: number;\n}\n\nexport const rgbToHex = (r: number, g: number, b: number): string => {\n if (r > 255 || g > 255 || b > 255) {\n throw new Error(\"Invalid color component\");\n }\n\n return ((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\");\n};\n\nexport const hexToRgb = (hex: string): RgbColor => {\n const cleanHex = hex.replace(\"#\", \"\");\n\n const r = parseInt(cleanHex.substring(0, 2), 16);\n const g = parseInt(cleanHex.substring(2, 4), 16);\n const b = parseInt(cleanHex.substring(4, 6), 16);\n\n return { r, g, b };\n};\n\nexport const rgbaToHex = (color: RgbaColor): string => {\n return \"#\" + rgbToHex(color.r, color.g, color.b);\n};\n\nexport const getOpacityHexValue = (opacity: number): string => {\n if (opacity < 0 || opacity > 1) {\n throw new Error(\"Invalid opacity value\");\n }\n\n return Math.round(opacity * 255)\n .toString(16)\n .padStart(2, \"0\");\n};\n\nexport const rgbaToHexWithAlpha = (color: RgbaColor): string => {\n return rgbaToHex(color) + getOpacityHexValue(color.a);\n};\n\nexport const rgbToString = (color: RgbColor): string => {\n return `rgb(${color.r}, ${color.g}, ${color.b})`;\n};\n\nexport const rgbaToString = (color: RgbaColor): string => {\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`;\n};\n\nexport const getLuminance = (r: number, g: number, b: number): number => {\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n};\n\nexport const getContrastTextColor = (hexColor: string): string => {\n const { r, g, b } = hexToRgb(hexColor);\n return getLuminance(r, g, b) > 0.5 ? \"#000000\" : \"#ffffff\";\n};\n\n/**\n * Normalized RGB color with values between 0 and 1.\n * Useful for graphics libraries like Three.js.\n */\nexport interface NormalizedRgb {\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Convert a hex color string to normalized RGB values (0-1 range).\n * @param hex - Hex color string (with or without # prefix)\n * @returns Normalized RGB object with values between 0 and 1\n */\nexport const hexToNormalizedRgb = (hex: string): NormalizedRgb => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16) / 255,\n g: parseInt(result[2], 16) / 255,\n b: parseInt(result[3], 16) / 255,\n }\n : { r: 0, g: 0, b: 0 };\n};\n\n/**\n * Determine if a color is light or dark based on relative luminance.\n * Useful for choosing contrasting text colors.\n * @param hex - Hex color string\n * @returns True if the color is considered light (luminance > 0.5)\n */\nexport const isLightColor = (hex: string): boolean => {\n const rgb = hexToNormalizedRgb(hex);\n // Calculate relative luminance using standard coefficients\n const luminance = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n return luminance > 0.5;\n};\n\nconst PERCENT_COLORS = [\n { pct: 0.0, color: { r: 0xff, g: 0x00, b: 0 } },\n { pct: 0.5, color: { r: 0xff, g: 0xff, b: 0 } },\n { pct: 1.0, color: { r: 0x00, g: 0xff, b: 0 } },\n] as const;\n\n// https://stackoverflow.com/a/7128796/704681\nexport const getColorForPercentage = (percent: number): string => {\n if (percent < 0 || percent > 1) {\n throw new Error(`Percentage must be between 0 and 1: ${percent}`);\n }\n\n let i = 1;\n for (; i < PERCENT_COLORS.length - 1; i++) {\n if (percent < PERCENT_COLORS[i].pct) {\n break;\n }\n }\n\n const lower = PERCENT_COLORS[i - 1];\n const upper = PERCENT_COLORS[i];\n const range = upper.pct - lower.pct;\n const rangePct = (percent - lower.pct) / range;\n const pctLower = 1 - rangePct;\n const pctUpper = rangePct;\n const color = {\n r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper),\n g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper),\n b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper),\n };\n\n return \"rgb(\" + [color.r, color.g, color.b].join(\",\") + \")\";\n};\n","import { format } from \"date-fns\";\nimport { isNullish } from \"./types.utils\";\n\nexport type DateInput = Date | string | number | null;\n\nexport const dateAs_HHMMSS = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"HH:mm:ss\");\n};\n\nexport const dateAs_YYYYMMDD = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"yyyy-MM-dd\");\n};\n\nexport const dateAs_YYYYMMDD_HHMMSS = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"yyyy-MM-dd HH:mm:ss\");\n};\n\nexport const nowAsTime = () => dateAs_HHMMSS(new Date());\nexport const nowAsDate = () => dateAs_YYYYMMDD(new Date());\nexport const nowAsDateTime = () => dateAs_YYYYMMDD_HHMMSS(new Date());\n\nexport const nowAsDateTimeForFilename = () => {\n return format(new Date(), \"yyyy-MM-dd_HH-mm-ss\");\n};\n\nconst DEFAULT_DATE_FORMAT = \"yyyy-MM-dd HH:mm:ss\";\n\n/**\n * Format a Unix timestamp (seconds since epoch) to a human-readable string.\n * @param timestamp - Unix timestamp in seconds\n * @param dateFormat - Date format string (default: \"yyyy-MM-dd HH:mm:ss\")\n * @returns Formatted date string or \"N/A\" if invalid or zero.\n */\nexport const formatUnixTimestamp = (\n timestamp: number,\n dateFormat: string = DEFAULT_DATE_FORMAT\n): string => {\n if (!timestamp) return \"N/A\";\n try {\n return format(new Date(timestamp * 1000), dateFormat);\n } catch {\n return \"Invalid date\";\n }\n};\n\n/**\n * Get the current Unix timestamp in seconds.\n * @returns Current Unix timestamp\n */\nexport const getCurrentUnixTimestamp = (): number => {\n return Math.floor(Date.now() / 1000);\n};\n\n/**\n * Check if a Unix timestamp has expired (is in the past).\n * @param timestamp - Unix timestamp in seconds\n * @returns True if the timestamp is in the past\n */\nexport const isExpiredTimestamp = (timestamp: number): boolean => {\n const now = getCurrentUnixTimestamp();\n return timestamp < now;\n};\n\n/**\n * Check if a Unix timestamp is active (current or past).\n * @param timestamp - Unix timestamp in seconds\n * @returns True if the timestamp is current or in the past\n */\nexport const isActiveTimestamp = (timestamp: number): boolean => {\n const now = getCurrentUnixTimestamp();\n return timestamp <= now;\n};\n","export const getErrorMessage = (error: unknown): string => {\n if (!error) {\n return \"\";\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n if (typeof error === \"object\" && \"message\" in error) {\n return (error as { message: string }).message;\n }\n\n return JSON.stringify(error);\n};\n\nexport const toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error;\n }\n\n return new Error(getErrorMessage(error));\n};\n","export const REGEX_ALPHANUMERIC = /^[a-zA-Z0-9-_ $%#(){}:/.]+$/;\n\nexport const REGEX_IPV4 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = \"...\"): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(\",\")\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { isBlank } from \"./string.utils\";\n\nexport const getFileExtension = (filename?: string | null): string => {\n if (isBlank(filename)) {\n return \"\";\n }\n\n const lastDotIndex = filename.lastIndexOf(\".\");\n if (lastDotIndex <= 0) {\n // No dot (-1), or dot is at start (0)\n // hidden file without extension\n return lastDotIndex === 0 ? filename.slice(1).toLowerCase() : \"\";\n }\n\n return filename.slice(lastDotIndex + 1).toLowerCase();\n};\n","import { isBlank } from \"./string.utils\";\nimport { isNullish } from \"./types.utils\";\n\nexport const parseOptionalFormNumber = (value?: string | null): number | null => {\n if (isBlank(value)) return null;\n\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n};\n\nexport const toFormString = (n?: number | null): string => {\n if (isNullish(n)) return \"\";\n\n return Number.isFinite(n) ? String(n) : \"\";\n};\n\n/**\n * Converts a number to a form string, rounded to integer.\n * Avoids floating-point display noise (e.g. 3700.0000000000005).\n */\nexport const toFormStringInteger = (n?: number | null): string => {\n if (isNullish(n)) return \"\";\n if (!Number.isFinite(n)) return \"\";\n\n return String(Math.round(n));\n};\n","const HTML_ESCAPE_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\n\nconst HTML_UNESCAPE_MAP: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n '&#x27;': \"'\",\n};\n\nexport const escapeHtml = (text: string): string => {\n return text.replace(/[&<>\"']/g, (char) => HTML_ESCAPE_MAP[char] ?? char);\n};\n\nexport const unescapeHtml = (text: string): string => {\n return text.replace(/&(?:amp|lt|gt|quot|#39|#x27);/g, (entity) => HTML_UNESCAPE_MAP[entity] ?? entity);\n};\n","import { isNullish } from './types.utils';\n\nexport const isHttpSuccessStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 200 && status < 300;\n};\n\nexport const isHttpClientErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 400 && status < 500;\n};\n\nexport const isHttpServerErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 500;\n};\n","export const safeJsonParse = <T>(value: string, fallback?: T): T | undefined => {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n};\n\nexport const safeJsonStringify = (obj: unknown, space: number = 2): string => {\n if (!obj) return '';\n try {\n return JSON.stringify(obj, null, space);\n } catch {\n return '';\n }\n};\n\nexport const sortObjectKeys = (_key: string, value: unknown): unknown =>\n value instanceof Object && !(value instanceof Array)\n ? Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce(\n (sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n },\n {} as Record<string, unknown>,\n )\n : value;\n\ninterface FormatJsonArgs {\n value?: string;\n space?: number;\n sortKeys?: boolean;\n}\n\nexport const formatJson = ({ value, space = 2, sortKeys = false }: FormatJsonArgs): string => {\n if (!value) return '';\n\n try {\n const obj: unknown = JSON.parse(value);\n return JSON.stringify(obj, sortKeys ? sortObjectKeys : undefined, space);\n } catch {\n return value;\n }\n};\n\nexport const prettifyJson = (value?: string): string => {\n return formatJson({ value, space: 4, sortKeys: true });\n};\n\nexport const minifyJson = (value?: string): string => {\n return formatJson({ value, space: 0, sortKeys: true });\n};\n\nexport const isValidJson = (value: string): boolean => {\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const isMinifiedJson = (value: string): boolean => {\n return value === minifyJson(value);\n};\n","import { isBlank } from './string.utils';\nimport { isNullish, isNumber } from \"./types.utils\";\n\n/**\n * Returns true if the input string is a valid number (blank and non-numeric strings are invalid).\n */\nexport const isInputValidNumber = (value: string): boolean => {\n if (isBlank(value)) return false;\n const num = Number(value.trim());\n return Number.isFinite(num);\n};\n\n/**\n * Returns true if the input string is a valid integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidInteger = (value: string): boolean => {\n if (!isInputValidNumber(value)) return false;\n const num = Number(value.trim());\n return Number.isInteger(num);\n};\n\n/**\n * Returns true if the input string is a valid positive integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidPositiveInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num > 0;\n};\n\n/**\n * Returns true if the input string is a valid negative integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidNegativeInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num < 0;\n};\n\n/**\n * Formats a number as an integer display string (removes decimals).\n */\nexport const formatIntegerDisplay = (value?: number | null): string =>\n String(toFixed(value, 0));\n\n// Example: toFixed(3.14159, 3) // 3.142\nexport const toFixed = (value?: number | null, decimals = 0): number => {\n if (isNullish(value)) return 0;\n if (decimals < 0) throw new Error(\"[toFixed] decimals must be >= 0\");\n if (decimals === 0) return Math.round(value);\n\n const multiplier = Math.pow(10, decimals);\n return Math.round(value * multiplier) / multiplier;\n};\n\nexport const roundUpToNearest10 = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n return Math.ceil(value / 10) * 10;\n};\n\n/**\n * Format a number with K (thousands) or M (millions) suffix.\n */\nexport const formatCount = (count: number): string => {\n if (count >= 1_000_000) {\n return `${(count / 1_000_000).toFixed(1)}M`;\n }\n if (count >= 1_000) {\n return `${(count / 1_000).toFixed(1)}K`;\n }\n return count.toString();\n};\n\n/**\n * Format a duration in milliseconds to a human-readable string.\n */\nexport const formatDuration = (ms: number): string => {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n};\n\nexport const getOrderOfMagnitudeExponent = (n?: number | null): number => {\n if (isNullish(n)) return 0;\n if (!isNumber(n)) return 0;\n\n const absValue = Math.abs(n); \n if (absValue === 0) {\n return 0;\n }\n \n const integerPart = Math.floor(absValue);\n return Math.floor(Math.log10(integerPart));\n}\n","import { isNullish } from \"./types.utils\";\n\n/**\n * Returns true when running in Node.js.\n * Checks for process.versions.node to avoid false positives in Web Workers.\n */\nexport const isRuntimeEnvNodeJs = (): boolean => {\n if (typeof window !== \"undefined\") return false;\n if (typeof process === \"undefined\") return false;\n if (isNullish(process?.versions?.node)) return false;\n\n return true;\n};\n","export const sleep = (milliseconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\n\n/**\n * Yields to the main thread so the UI can process events and repaint.\n * Use during long-running synchronous work (e.g. report generation) to keep the app responsive.\n */\nexport const yieldToMainThread = (): Promise<void> => sleep(0);\n","const ONE_SECOND_IN_MS = 1000;\nconst ONE_MINUTE_IN_MS = 60 * ONE_SECOND_IN_MS;\nconst ONE_HOUR_IN_MS = 60 * ONE_MINUTE_IN_MS;\nconst ONE_DAY_IN_MS = 24 * ONE_HOUR_IN_MS;\n\nexport const PeriodsInMS = {\n oneSecond: ONE_SECOND_IN_MS,\n oneMinute: ONE_MINUTE_IN_MS,\n oneHour: ONE_HOUR_IN_MS,\n oneDay: ONE_DAY_IN_MS,\n} as const;\n","import { isNullish } from \"./types.utils\";\n\n/** m³/s to gallons per minute */\nexport const M3PS_TO_GPM = 15850.3;\n\n/** Pascals to feet of head (1 Pa = 1 N/m²) */\nexport const PA_TO_FT = 0.000334553;\n\n/** Watts to Horsepower */\nexport const W_TO_HP = 0.00134102;\n\n/** meters to inches */\nexport const M_TO_INCHES = 39.3701;\n\n/** Hz to RPM (for synchronous speed) */\nexport const HZ_TO_RPM = 60;\n\nexport const fromM3psToGPM = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * M3PS_TO_GPM;\n};\n\nexport const fromPaToFt = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * PA_TO_FT;\n};\n\nexport const fromWToHp = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * W_TO_HP;\n};\n\nexport const fromMToInches = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * M_TO_INCHES;\n};\n\nexport const fromHzToRpm = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * HZ_TO_RPM;\n};\n","import { isBlank } from \".\";\n\nexport const SCHEME_PREFIXES = {\n file: 'file',\n content: 'content',\n http: 'http',\n https: 'https',\n ftp: 'ftp',\n ftps: 'ftps',\n sftp: 'sftp',\n smb: 'smb',\n} as const;\n\nconst SCHEME_PREFIXES_ARRAY = Object.values(SCHEME_PREFIXES);\n\nexport const DATA_URI_PATTERN = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,(.+)$/;\n\nexport const isValidDataUri = (uri?: string | null): boolean => {\n if (isBlank(uri)) {\n return false;\n }\n\n return DATA_URI_PATTERN.test(uri);\n};\n\nexport const hasScheme = (uri?: string | null): boolean => {\n if (!uri) {\n return false;\n }\n\n const lowerUri = uri.toLowerCase();\n return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));\n};\n\n/**\n * Extracts the base64 data from a data URI string.\n * Data URIs have the format: data:[<mediatype>][;base64],<data>\n * This function extracts everything after the first comma.\n *\n * @param dataUri - The data URI string (e.g., \"data:image/png;base64,iVBORw0KG...\")\n * @returns The base64 data without the data URI prefix, or the original string if no comma is found\n */\nexport const extractBase64FromDataUri = (dataUri: string): string => {\n return dataUri.split(',')[1] ?? dataUri;\n};\n\nexport const encodeUrl = (value?: string): string => {\n if (!value) return '';\n return encodeURIComponent(value);\n};\n\nexport const decodeUrl = (value?: string): string => {\n if (!value) return '';\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\ninterface FormatDataUriArgs {\n mimeType: string;\n base64: string;\n}\n\nexport const formatDataUri = ({ mimeType, base64 }: FormatDataUriArgs): string => {\n return `data:${mimeType};base64,${base64}`;\n};\n\nexport const getBase64ApproxSize = (base64: string): number => {\n return Math.round((base64.length * 3) / 4);\n};\n","import { isNullish } from \"./types.utils\";\n\nconst WEBSOCKET_CONNECT_STATES: number[] = [WebSocket.CONNECTING, WebSocket.OPEN] as const;\n\nexport const isWsClosable = (ws?: WebSocket | null): ws is WebSocket => {\n if (isNullish(ws)) return false;\n return WEBSOCKET_CONNECT_STATES.includes(ws.readyState);\n};\n\nexport const isWsOpenOrConnecting = (ws?: WebSocket | null): ws is WebSocket => {\n if (isNullish(ws)) return false;\n return WEBSOCKET_CONNECT_STATES.includes(ws.readyState);\n};\n\nexport const closeWebSocket = (ws?: WebSocket | null) => {\n if (isNullish(ws) || !isWsClosable(ws)) return;\n\n try {\n ws.close();\n } catch {\n // do nothing (best effort to close, ignore unexpected errors)\n }\n};\n"]}
1
+ {"version":3,"sources":["../src/utils/base64.utils.ts","../src/utils/types.utils.ts","../src/utils/chart.utils.ts","../src/utils/color.utils.ts","../src/utils/date.utils.ts","../src/utils/errors.utils.ts","../src/utils/regex.ts","../src/utils/string.utils.ts","../src/utils/filename.utils.ts","../src/utils/form.utils.ts","../src/utils/html.utils.ts","../src/utils/http.utils.ts","../src/utils/json.utils.ts","../src/utils/number.utils.ts","../src/utils/runtime-env.utils.ts","../src/utils/text.utils.ts","../src/utils/thread.utils.ts","../src/utils/time.utils.ts","../src/utils/units.utils.ts","../src/utils/uri.utils.ts","../src/utils/websocket.utils.ts"],"names":["format"],"mappings":";;;;;AAAA,IAAM,YAAA,GAAe,kEAAA;AAErB,IAAM,iBAAA,GAAoB,CAAC,IAAA,KAA2B;AACpD,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAClC,IAAA,IAAI,YAAY,KAAA,IAAU,QAAA,IAAY,SAAU,CAAA,GAAI,CAAA,GAAI,KAAK,MAAA,EAAQ;AACnE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA;AAClC,MAAA,IAAI,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,EAAQ;AACpC,QAAA,UAAA,CAAW,KAAK,KAAA,IAAY,QAAA,GAAW,KAAA,IAAW,EAAA,CAAA,IAAO,OAAO,KAAA,CAAO,CAAA;AACvE,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,UAAA,CAAW,KAAK,QAAQ,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,YAAY,GAAA,EAAM;AACpB,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,IACtB,CAAA,MAAA,IAAW,YAAY,IAAA,EAAO;AAC5B,MAAA,KAAA,CAAM,KAAK,GAAA,GAAQ,SAAA,IAAa,CAAA,EAAI,GAAA,GAAQ,YAAY,EAAK,CAAA;AAAA,IAC/D,CAAA,MAAA,IAAW,YAAY,KAAA,EAAS;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,GAAA,GAAQ,SAAA,IAAa,EAAA,EAAK,GAAA,GAAS,aAAa,CAAA,GAAK,EAAA,EAAO,GAAA,GAAQ,SAAA,GAAY,EAAK,CAAA;AAAA,IAClG,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,MAAQ,SAAA,IAAa,EAAA;AAAA,QACrB,GAAA,GAAS,aAAa,EAAA,GAAM,EAAA;AAAA,QAC5B,GAAA,GAAS,aAAa,CAAA,GAAK,EAAA;AAAA,QAC3B,MAAQ,SAAA,GAAY;AAAA,OACtB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;AAEA,IAAM,mBAAA,GAAsB,CAAC,KAAA,KAA4B;AACvD,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,IAAA,IAAI,SAAA;AAEJ,IAAA,IAAI,KAAK,GAAA,EAAM;AACb,MAAA,SAAA,GAAY,EAAA;AACZ,MAAA,CAAA,IAAK,CAAA;AAAA,IACP,CAAA,MAAA,IAAA,CAAY,EAAA,GAAK,GAAA,MAAU,GAAA,EAAM;AAC/B,MAAA,SAAA,GAAA,CAAc,KAAK,EAAA,KAAS,CAAA,GAAM,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAK,EAAA;AAClD,MAAA,CAAA,IAAK,CAAA;AAAA,IACP,CAAA,MAAA,IAAA,CAAY,EAAA,GAAK,GAAA,MAAU,GAAA,EAAM;AAC/B,MAAA,SAAA,GAAA,CAAc,EAAA,GAAK,EAAA,KAAS,EAAA,GAAA,CAAQ,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAK,EAAA,KAAS,CAAA,GAAM,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAK,EAAA;AACnF,MAAA,CAAA,IAAK,CAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,SAAA,GAAA,CACI,KAAK,CAAA,KAAS,EAAA,GAAA,CACd,MAAM,CAAA,GAAI,CAAC,IAAK,EAAA,KAAS,EAAA,GAAA,CACzB,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAK,EAAA,KAAS,IAC1B,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAK,EAAA;AACnB,MAAA,CAAA,IAAK,CAAA;AAAA,IACP;AAEA,IAAA,IAAI,aAAa,KAAA,EAAQ;AACvB,MAAA,MAAA,IAAU,MAAA,CAAO,aAAa,SAAS,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,MAAM,WAAW,SAAA,GAAY,KAAA;AAC7B,MAAA,MAAA,IAAU,OAAO,YAAA,CAAa,KAAA,IAAU,YAAY,EAAA,CAAA,EAAK,KAAA,IAAU,WAAW,IAAA,CAAM,CAAA;AAAA,IACtF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAEA,IAAM,mBAAA,GAAsB,CAAC,KAAA,KAA4B;AACvD,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,IAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,KAAA,CAAM,SAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAK,CAAA;AAClD,IAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,KAAA,CAAM,SAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAK,CAAA;AAClD,IAAA,MAAM,OAAA,GAAW,EAAA,IAAM,EAAA,GAAO,EAAA,IAAM,CAAA,GAAK,EAAA;AAEzC,IAAA,MAAA,IAAU,YAAA,CAAc,OAAA,IAAW,EAAA,GAAM,EAAI,CAAA;AAC7C,IAAA,MAAA,IAAU,YAAA,CAAc,OAAA,IAAW,EAAA,GAAM,EAAI,CAAA;AAC7C,IAAA,MAAA,IAAU,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA,GAAS,aAAc,OAAA,IAAW,CAAA,GAAK,EAAI,CAAA,GAAI,GAAA;AACvE,IAAA,MAAA,IAAU,IAAI,CAAA,GAAI,KAAA,CAAM,SAAS,YAAA,CAAa,OAAA,GAAU,EAAI,CAAA,GAAI,GAAA;AAAA,EAClE;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAEA,IAAM,mBAAA,GAAsB,CAAC,MAAA,KAA6B;AACxD,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AACvD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC5C,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAE,CAAA;AAC7C,IAAA,MAAM,KAAK,YAAA,CAAa,OAAA,CAAQ,SAAA,CAAU,CAAA,GAAI,CAAC,CAAE,CAAA;AACjD,IAAA,MAAM,EAAA,GAAK,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,GAAM,CAAA,GAAI,YAAA,CAAa,OAAA,CAAQ,SAAA,CAAU,CAAA,GAAI,CAAC,CAAE,CAAA;AAChF,IAAA,MAAM,EAAA,GAAK,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,GAAM,CAAA,GAAI,YAAA,CAAa,OAAA,CAAQ,SAAA,CAAU,CAAA,GAAI,CAAC,CAAE,CAAA;AAEhF,IAAA,IAAI,KAAK,CAAA,IAAK,EAAA,GAAK,CAAA,IAAM,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,GAAA,IAAO,EAAA,GAAK,KAAO,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,IAAO,KAAK,CAAA,EAAI;AACpG,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,UAAW,EAAA,IAAM,EAAA,GAAO,EAAA,IAAM,EAAA,GAAO,MAAM,CAAA,GAAK,EAAA;AAEtD,IAAA,KAAA,CAAM,IAAA,CAAM,OAAA,IAAW,EAAA,GAAM,GAAI,CAAA;AACjC,IAAA,IAAI,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,KAAK,KAAA,CAAM,IAAA,CAAM,OAAA,IAAW,CAAA,GAAK,GAAI,CAAA;AAC9D,IAAA,IAAI,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,KAAK,KAAA,CAAM,IAAA,CAAK,UAAU,GAAI,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;AAEO,IAAM,YAAA,GAAe,CAAC,IAAA,KAAyB;AACpD,EAAA,IAAI;AACF,IAAA,OAAO,mBAAA,CAAoB,iBAAA,CAAkB,IAAI,CAAC,CAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEO,IAAM,YAAA,GAAe,CAAC,MAAA,KAA2B;AACtD,EAAA,IAAI;AACF,IAAA,OAAO,mBAAA,CAAoB,mBAAA,CAAoB,MAAM,CAAC,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;;;ACpIO,IAAM,QAAoB,MAAM;AAAC;AAEjC,IAAM,SAAA,GAAY,CAAC,KAAA,KAA8C,KAAA,KAAU,QAAQ,KAAA,KAAU;AAE7F,IAAM,QAAA,GAAW,CAAC,KAAA,KAA4C;AACnE,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,KAAK,CAAA,EAAG;AAChB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,QAAA,GAAW,CAAC,KAAA,KAA4C;AACnE,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;;;ACPO,IAAM,aAAA,GAAgB,CAAC,KAAA,KAAsC,CAAC,GAAG,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,IAAK,CAAC;AAElF,IAAM,aAAA,GAAgB,CAAC,KAAA,KAA0B,KAAA,CAAM,QAAQ,CAAC;AAEhE,IAAM,gBAAA,GAAmB,CAAC,KAAA,KAA0B,CAAA,IAAA,EAAA,CAAK,QAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAEhF,IAAM,qBAAA,GAAwB,CAAC,IAAA,KAAkC;AACtE,EAAA,IAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AACnB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,EACvB;AAEA,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AAC3C,IAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,IAAA;AACnB,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAO,QAAQ,QAAA,EAAU;AACtD,MAAA,OAAO,CAAA,CAAA,EAAI,IAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,QAAA,EAAM,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,QAAQ,EAAE,CAAA;AAC1B;AAeO,IAAM,iBAAA,GAAoB,CAAC,QAAA,KAA6B;AAC7D,EAAA,IAAI,QAAA,IAAY,GAAG,OAAO,CAAA;AAG1B,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC,CAAC,CAAA;AAG/D,EAAA,MAAM,aAAa,QAAA,GAAW,SAAA;AAG9B,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI,UAAA,IAAc,GAAG,cAAA,GAAiB,CAAA;AAAA,OAAA,IAC7B,UAAA,IAAc,GAAG,cAAA,GAAiB,CAAA;AAAA,OAAA,IAClC,UAAA,IAAc,KAAK,cAAA,GAAiB,GAAA;AAAA,OAAA,IACpC,UAAA,IAAc,GAAG,cAAA,GAAiB,CAAA;AAAA,OACtC,cAAA,GAAiB,EAAA;AAEtB,EAAA,OAAO,cAAA,GAAiB,SAAA;AAC1B;AAEA,IAAM,gBAAA,GAAmB,CAAC,KAAA,EAAe,SAAA,GAAY,EAAA,KAAe;AAClE,EAAA,MAAM,SAAS,EAAA,IAAM,SAAA;AACrB,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,MAAM,CAAA,GAAI,MAAA;AACtC,CAAA;AAUO,IAAM,kBAAA,GAAqB,CAAC,GAAA,EAAa,eAAA,GAAkB,EAAA,KAAiB;AACjF,EAAA,IAAI,GAAA,IAAO,CAAA,EAAG,OAAO,CAAC,CAAC,CAAA;AAGvB,EAAA,MAAM,eAAe,GAAA,GAAM,eAAA;AAC3B,EAAA,MAAM,aAAA,GAAgB,kBAAkB,YAAY,CAAA;AAGpD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,IAAS,MAAM,aAAA,GAAgB,GAAA,EAAK,SAAS,aAAA,EAAe;AAE9E,IAAA,KAAA,CAAM,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAAA,EACpC;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACvC,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,gBAAA,CAAiB,QAAA,GAAW,aAAa,CAAC,CAAA;AAAA,EACvD;AAEA,EAAA,OAAO,KAAA;AACT;;;ACzGO,IAAM,QAAA,GAAW,CAAC,CAAA,EAAW,CAAA,EAAW,CAAA,KAAsB;AACnE,EAAA,IAAI,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,GAAA,IAAO,IAAI,GAAA,EAAK;AACjC,IAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAA,CAAS,CAAA,IAAK,EAAA,GAAO,CAAA,IAAK,CAAA,GAAK,CAAA,EAAG,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAChE;AAEO,IAAM,QAAA,GAAW,CAAC,GAAA,KAA0B;AACjD,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAEpC,EAAA,MAAM,IAAI,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC/C,EAAA,MAAM,IAAI,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC/C,EAAA,MAAM,IAAI,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAE/C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACnB;AAEO,IAAM,SAAA,GAAY,CAAC,KAAA,KAA6B;AACrD,EAAA,OAAO,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACjD;AAEO,IAAM,kBAAA,GAAqB,CAAC,OAAA,KAA4B;AAC7D,EAAA,IAAI,OAAA,GAAU,CAAA,IAAK,OAAA,GAAU,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAG,CAAA,CAC5B,SAAS,EAAE,CAAA,CACX,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACpB;AAEO,IAAM,kBAAA,GAAqB,CAAC,KAAA,KAA6B;AAC9D,EAAA,OAAO,SAAA,CAAU,KAAK,CAAA,GAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA;AACtD;AAEO,IAAM,WAAA,GAAc,CAAC,KAAA,KAA4B;AACtD,EAAA,OAAO,CAAA,IAAA,EAAO,MAAM,CAAC,CAAA,EAAA,EAAK,MAAM,CAAC,CAAA,EAAA,EAAK,MAAM,CAAC,CAAA,CAAA,CAAA;AAC/C;AAEO,IAAM,YAAA,GAAe,CAAC,KAAA,KAA6B;AACxD,EAAA,OAAO,CAAA,KAAA,EAAQ,KAAA,CAAM,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAA,CAAA,CAAA;AAC5D;AAEO,IAAM,YAAA,GAAe,CAAC,CAAA,EAAW,CAAA,EAAW,CAAA,KAAsB;AACvE,EAAA,OAAA,CAAQ,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,QAAQ,CAAA,IAAK,GAAA;AAC/C;AAEO,IAAM,oBAAA,GAAuB,CAAC,QAAA,KAA6B;AAChE,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,GAAI,SAAS,QAAQ,CAAA;AACrC,EAAA,OAAO,aAAa,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,MAAM,SAAA,GAAY,SAAA;AACnD;AAiBO,IAAM,kBAAA,GAAqB,CAAC,GAAA,KAA+B;AAChE,EAAA,MAAM,MAAA,GAAS,2CAAA,CAA4C,IAAA,CAAK,GAAG,CAAA;AACnE,EAAA,OAAO,MAAA,GACH;AAAA,IACE,GAAG,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,IAC7B,GAAG,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,IAC7B,GAAG,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,MAE/B,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AACzB;AAQO,IAAM,YAAA,GAAe,CAAC,GAAA,KAAyB;AACpD,EAAA,MAAM,GAAA,GAAM,mBAAmB,GAAG,CAAA;AAElC,EAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,CAAA,GAAI,QAAQ,GAAA,CAAI,CAAA,GAAI,QAAQ,GAAA,CAAI,CAAA;AAC9D,EAAA,OAAO,SAAA,GAAY,GAAA;AACrB;AAEA,IAAM,cAAA,GAAiB;AAAA,EACrB,EAAE,GAAA,EAAK,CAAA,EAAK,KAAA,EAAO,EAAE,CAAA,EAAG,GAAA,EAAM,CAAA,EAAG,CAAA,EAAM,CAAA,EAAG,CAAA,EAAE,EAAE;AAAA,EAC9C,EAAE,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,EAAE,CAAA,EAAG,GAAA,EAAM,CAAA,EAAG,GAAA,EAAM,CAAA,EAAG,CAAA,EAAE,EAAE;AAAA,EAC9C,EAAE,GAAA,EAAK,CAAA,EAAK,KAAA,EAAO,EAAE,CAAA,EAAG,CAAA,EAAM,CAAA,EAAG,GAAA,EAAM,CAAA,EAAG,CAAA,EAAE;AAC9C,CAAA;AAGO,IAAM,qBAAA,GAAwB,CAAC,OAAA,KAA4B;AAChE,EAAA,IAAI,OAAA,GAAU,CAAA,IAAK,OAAA,GAAU,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,OAAO,CAAA,CAAE,CAAA;AAAA,EAClE;AAEA,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG,CAAA,EAAA,EAAK;AACzC,IAAA,IAAI,OAAA,GAAU,cAAA,CAAe,CAAC,CAAA,CAAE,GAAA,EAAK;AACnC,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,GAAI,CAAC,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,eAAe,CAAC,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,GAAA;AAChC,EAAA,MAAM,QAAA,GAAA,CAAY,OAAA,GAAU,KAAA,CAAM,GAAA,IAAO,KAAA;AACzC,EAAA,MAAM,WAAW,CAAA,GAAI,QAAA;AACrB,EAAA,MAAM,QAAA,GAAW,QAAA;AACjB,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,IAAI,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,CAAA,GAAI,QAAQ,CAAA;AAAA,IACjE,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,IAAI,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,CAAA,GAAI,QAAQ,CAAA;AAAA,IACjE,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,IAAI,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,CAAA,GAAI,QAAQ;AAAA,GACnE;AAEA,EAAA,OAAO,MAAA,GAAS,CAAC,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AAC1D;ACjIO,IAAM,aAAA,GAAgB,CAAC,KAAA,KAAsB;AAClD,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,EAAA;AAC7B,EAAA,OAAOA,cAAA,CAAO,OAAO,UAAU,CAAA;AACjC;AAEO,IAAM,eAAA,GAAkB,CAAC,KAAA,KAAsB;AACpD,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,EAAA;AAC7B,EAAA,OAAOA,cAAA,CAAO,OAAO,YAAY,CAAA;AACnC;AAEO,IAAM,sBAAA,GAAyB,CAAC,KAAA,KAAsB;AAC3D,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,EAAA;AAC7B,EAAA,OAAOA,cAAA,CAAO,OAAO,qBAAqB,CAAA;AAC5C;AAEO,IAAM,SAAA,GAAY,MAAM,aAAA,iBAAc,IAAI,MAAM;AAChD,IAAM,SAAA,GAAY,MAAM,eAAA,iBAAgB,IAAI,MAAM;AAClD,IAAM,aAAA,GAAgB,MAAM,sBAAA,iBAAuB,IAAI,MAAM;AAE7D,IAAM,2BAA2B,MAAM;AAC5C,EAAA,OAAOA,cAAA,iBAAO,IAAI,IAAA,EAAK,EAAG,qBAAqB,CAAA;AACjD;AAEA,IAAM,mBAAA,GAAsB,qBAAA;AAQrB,IAAM,mBAAA,GAAsB,CACjC,SAAA,EACA,UAAA,GAAqB,mBAAA,KACV;AACX,EAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,EAAA,IAAI;AACF,IAAA,OAAOA,eAAO,IAAI,IAAA,CAAK,SAAA,GAAY,GAAI,GAAG,UAAU,CAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,cAAA;AAAA,EACT;AACF;AAMO,IAAM,0BAA0B,MAAc;AACnD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACrC;AAOO,IAAM,kBAAA,GAAqB,CAAC,SAAA,KAA+B;AAChE,EAAA,MAAM,MAAM,uBAAA,EAAwB;AACpC,EAAA,OAAO,SAAA,GAAY,GAAA;AACrB;AAOO,IAAM,iBAAA,GAAoB,CAAC,SAAA,KAA+B;AAC/D,EAAA,MAAM,MAAM,uBAAA,EAAwB;AACpC,EAAA,OAAO,SAAA,IAAa,GAAA;AACtB;;;AC1EO,IAAM,eAAA,GAAkB,CAAC,KAAA,KAA2B;AACzD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,SAAA,IAAa,KAAA,EAAO;AACnD,IAAA,OAAQ,KAAA,CAA8B,OAAA;AAAA,EACxC;AAEA,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;AAEO,IAAM,OAAA,GAAU,CAAC,KAAA,KAA0B;AAChD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAI,KAAA,CAAM,eAAA,CAAgB,KAAK,CAAC,CAAA;AACzC;;;ACtBO,IAAM,kBAAA,GAAqB;AAE3B,IAAM,UAAA,GAAa;;;ACCnB,IAAM,OAAA,GAAU,CAAC,GAAA,KAAsD;AAC5E,EAAA,OAAO,SAAA,CAAU,GAAG,CAAA,IAAK,GAAA,EAAK,MAAK,KAAM,EAAA;AAC3C;AAEO,IAAM,UAAA,GAAa,CAAC,GAAA,KAAuC;AAChE,EAAA,OAAO,CAAC,QAAQ,GAAG,CAAA;AACrB;AAEO,IAAM,cAAA,GAAiB,CAAC,KAAA,KAA2B;AACxD,EAAA,OAAO,kBAAA,CAAmB,KAAK,KAAK,CAAA;AACtC;AAcO,IAAM,sBAAA,GAAyB,CAAC,KAAA,KAA0B;AAC/D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAM,SAAA,CAAU,KAAK,CAAA,CAAE,OAAA,CAAQ,oBAAoB,EAAE,CAAA;AAC9D;AAOO,IAAM,eAAA,GAAkB,CAAC,GAAA,KAAwB;AACtD,EAAA,IAAI,CAAC,KAAK,OAAO,GAAA;AACjB,EAAA,OAAO,GAAA,CAAI,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAClD;AAQO,IAAM,UAAA,GAAa,CAAC,IAAA,KAAyB;AAClD,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAK,CAAE,MAAA,KAAW,GAAG,OAAO,CAAA;AAC9C,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AAC7D;AASO,IAAM,QAAA,GAAW,CAAC,GAAA,EAAa,SAAA,EAAmB,WAAW,KAAA,KAAkB;AACpF,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,MAAA,IAAU,WAAW,OAAO,GAAA;AAC5C,EAAA,OAAO,IAAI,KAAA,CAAM,CAAA,EAAG,SAAA,GAAY,QAAA,CAAS,MAAM,CAAA,GAAI,QAAA;AACrD;AAUO,IAAM,WAAA,GAAc,CAAC,KAAA,KAAkC;AAC5D,EAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,EAAA;AAC3B,EAAA,OAAO,KAAA,CACJ,QAAQ,iBAAA,EAAmB,OAAO,EAClC,OAAA,CAAQ,uBAAA,EAAyB,OAAO,CAAA,CACxC,OAAA,CAAQ,WAAW,GAAG,CAAA,CACtB,QAAQ,KAAA,EAAO,GAAG,EAClB,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CACpB,WAAA,EAAY;AACjB;AAUO,IAAM,WAAA,GAAc,CAAC,KAAA,KAAkC;AAC5D,EAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,EAAA;AAC3B,EAAA,OAAO,MACJ,IAAA,EAAK,CACL,QAAQ,aAAA,EAAe,CAAC,GAAG,IAAA,KAAiB,IAAA,CAAK,WAAA,EAAa,EAC9D,OAAA,CAAQ,QAAA,EAAU,CAAC,IAAA,KAAS,IAAA,CAAK,aAAa,CAAA;AACnD;AAcO,IAAM,OAAA,GAAU,CAAC,KAAA,KAA0B;AAChD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,OAAO,sBAAA,CAAuB,KAAK,CAAA,CAChC,WAAA,EAAY,CACZ,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAC3B;AAKO,IAAM,uBAAA,GAA0B,CAAC,GAAA,KAAkC;AACxE,EAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,EAAG;AAChB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,GAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA,CAC3B,MAAA,CAAO,UAAU,CAAA;AACtB;;;ACrIO,IAAM,gBAAA,GAAmB,CAAC,QAAA,KAAqC;AACpE,EAAA,IAAI,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AAC7C,EAAA,IAAI,gBAAgB,CAAA,EAAG;AAGrB,IAAA,OAAO,iBAAiB,CAAA,GAAI,QAAA,CAAS,MAAM,CAAC,CAAA,CAAE,aAAY,GAAI,EAAA;AAAA,EAChE;AAEA,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,YAAA,GAAe,CAAC,EAAE,WAAA,EAAY;AACtD;;;ACZO,IAAM,uBAAA,GAA0B,CAAC,KAAA,KAAyC;AAC/E,EAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,IAAA;AAE3B,EAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA;AAClC;AAEO,IAAM,YAAA,GAAe,CAAC,CAAA,KAA8B;AACzD,EAAA,IAAI,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,EAAA;AAEzB,EAAA,OAAO,OAAO,QAAA,CAAS,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,EAAA;AAC1C;AAMO,IAAM,mBAAA,GAAsB,CAAC,CAAA,KAA8B;AAChE,EAAA,IAAI,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,EAAA;AACzB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,EAAA;AAEhC,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7B;;;ACzBA,IAAM,eAAA,GAA0C;AAAA,EAC9C,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,QAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,iBAAA,GAA4C;AAAA,EAChD,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,QAAA,EAAU,GAAA;AAAA,EACV,OAAA,EAAS,GAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,UAAA,GAAa,CAAC,IAAA,KAAyB;AAClD,EAAA,OAAO,IAAA,CAAK,QAAQ,UAAA,EAAY,CAAC,SAAS,eAAA,CAAgB,IAAI,KAAK,IAAI,CAAA;AACzE;AAEO,IAAM,YAAA,GAAe,CAAC,IAAA,KAAyB;AACpD,EAAA,OAAO,IAAA,CAAK,QAAQ,gCAAA,EAAkC,CAAC,WAAW,iBAAA,CAAkB,MAAM,KAAK,MAAM,CAAA;AACvG;;;ACrBO,IAAM,mBAAA,GAAsB,CAAC,MAAA,KAAoC;AACtE,EAAA,IAAI,SAAA,CAAU,MAAM,CAAA,EAAG;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,IAAU,OAAO,MAAA,GAAS,GAAA;AACnC;AAEO,IAAM,uBAAA,GAA0B,CAAC,MAAA,KAAoC;AAC1E,EAAA,IAAI,SAAA,CAAU,MAAM,CAAA,EAAG;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,IAAU,OAAO,MAAA,GAAS,GAAA;AACnC;AAEO,IAAM,uBAAA,GAA0B,CAAC,MAAA,KAAoC;AAC1E,EAAA,IAAI,SAAA,CAAU,MAAM,CAAA,EAAG;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,IAAU,GAAA;AACnB;;;ACxBO,IAAM,aAAA,GAAgB,CAAI,KAAA,EAAe,QAAA,KAAgC;AAC9E,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEO,IAAM,iBAAA,GAAoB,CAAC,GAAA,EAAc,KAAA,GAAgB,CAAA,KAAc;AAC5E,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEO,IAAM,cAAA,GAAiB,CAAC,IAAA,EAAc,KAAA,KAC3C,iBAAiB,MAAA,IAAU,EAAE,KAAA,YAAiB,KAAA,CAAA,GAC1C,MAAA,CAAO,IAAA,CAAK,KAAgC,CAAA,CACzC,MAAK,CACL,MAAA;AAAA,EACC,CAAC,QAAQ,GAAA,KAAQ;AACf,IAAA,MAAA,CAAO,GAAG,CAAA,GAAK,KAAA,CAAkC,GAAG,CAAA;AACpD,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA;AACF,CAAA,GACF;AAQC,IAAM,UAAA,GAAa,CAAC,EAAE,KAAA,EAAO,QAAQ,CAAA,EAAG,QAAA,GAAW,OAAM,KAA8B;AAC5F,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAEnB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAe,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACrC,IAAA,OAAO,KAAK,SAAA,CAAU,GAAA,EAAK,QAAA,GAAW,cAAA,GAAiB,QAAW,KAAK,CAAA;AAAA,EACzE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,IAAM,YAAA,GAAe,CAAC,KAAA,KAA2B;AACtD,EAAA,OAAO,WAAW,EAAE,KAAA,EAAO,OAAO,CAAA,EAAG,QAAA,EAAU,MAAM,CAAA;AACvD;AAEO,IAAM,UAAA,GAAa,CAAC,KAAA,KAA2B;AACpD,EAAA,OAAO,WAAW,EAAE,KAAA,EAAO,OAAO,CAAA,EAAG,QAAA,EAAU,MAAM,CAAA;AACvD;AAEO,IAAM,WAAA,GAAc,CAAC,KAAA,KAA2B;AACrD,EAAA,IAAI;AACF,IAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,IAAM,cAAA,GAAiB,CAAC,KAAA,KAA2B;AACxD,EAAA,OAAO,KAAA,KAAU,WAAW,KAAK,CAAA;AACnC;;;AC5DO,IAAM,kBAAA,GAAqB,CAAC,KAAA,KAA2B;AAC5D,EAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,CAAA;AAC/B,EAAA,OAAO,MAAA,CAAO,SAAS,GAAG,CAAA;AAC5B;AAKO,IAAM,mBAAA,GAAsB,CAAC,KAAA,KAA2B;AAC7D,EAAA,IAAI,CAAC,kBAAA,CAAmB,KAAK,CAAA,EAAG,OAAO,KAAA;AACvC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,CAAA;AAC/B,EAAA,OAAO,MAAA,CAAO,UAAU,GAAG,CAAA;AAC7B;AAKO,IAAM,2BAAA,GAA8B,CAAC,KAAA,KAA2B;AACrE,EAAA,IAAI,CAAC,mBAAA,CAAoB,KAAK,CAAA,EAAG,OAAO,KAAA;AACxC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,CAAA;AAC/B,EAAA,OAAO,GAAA,GAAM,CAAA;AACf;AAKO,IAAM,2BAAA,GAA8B,CAAC,KAAA,KAA2B;AACrE,EAAA,IAAI,CAAC,mBAAA,CAAoB,KAAK,CAAA,EAAG,OAAO,KAAA;AACxC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,CAAA;AAC/B,EAAA,OAAO,GAAA,GAAM,CAAA;AACf;AAKO,IAAM,uBAAuB,CAAC,KAAA,KAAkC,OAAO,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAC;AAGxF,IAAM,OAAA,GAAU,CAAC,KAAA,EAAuB,QAAA,GAAW,CAAA,KAAc;AACtE,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,CAAA;AAC7B,EAAA,IAAI,QAAA,GAAW,CAAA,EAAG,MAAM,IAAI,MAAM,iCAAiC,CAAA;AACnE,EAAA,IAAI,QAAA,KAAa,CAAA,EAAG,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAE3C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,QAAQ,CAAA;AACxC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,UAAU,CAAA,GAAI,UAAA;AAC1C;AAEO,IAAM,kBAAA,GAAqB,CAAC,KAAA,KAAkC;AACnE,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,CAAA;AAC7B,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,EAAE,CAAA,GAAI,EAAA;AACjC;AAKO,IAAM,WAAA,GAAc,CAAC,KAAA,KAA0B;AACpD,EAAA,IAAI,SAAS,GAAA,EAAW;AACtB,IAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,SAAS,GAAA,EAAO;AAClB,IAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,MAAM,QAAA,EAAS;AACxB;AAKO,IAAM,cAAA,GAAiB,CAAC,EAAA,KAAuB;AACpD,EAAA,IAAI,KAAK,GAAA,EAAM;AACb,IAAA,OAAO,GAAG,EAAE,CAAA,EAAA,CAAA;AAAA,EACd;AACA,EAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAClC;AAEO,IAAM,wBAAA,GAA2B,CAAC,GAAA,KAAyC;AAChF,EAAA,IAAI,SAAA,CAAU,GAAG,CAAA,EAAG,OAAO,EAAA;AAC3B,EAAA,OAAO,MAAA,CAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,yBAAyB,MAAQ,CAAA;AAC9D;AAEO,IAAM,uBAAA,GAA0B,CAAC,GAAA,KAAyB;AAC/D,EAAA,OAAO,MAAA,CAAO,GAAA,EAAK,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAC,CAAA;AAC3C;AAEO,IAAM,2BAAA,GAA8B,CAAC,CAAA,KAA8B;AACxE,EAAA,IAAI,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,CAAA;AACzB,EAAA,IAAI,CAAC,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,CAAA;AAEzB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AAC3B,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACvC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA;AAC3C;;;AChGO,IAAM,qBAAqB,MAAe;AAC/C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,EAAa,OAAO,KAAA;AAC3C,EAAA,IAAI,SAAA,CAAU,OAAA,EAAS,QAAA,EAAU,IAAI,GAAG,OAAO,KAAA;AAE/C,EAAA,OAAO,IAAA;AACT;;;ACZO,IAAM,aAAA,GAAgB,CAAC,CAAA,KAAsB;AAClD,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,eAAe,CAAA;AACjC,EAAA,OAAO,IAAI,CAAA,CAAE,CAAC,EAAE,IAAA,EAAK,GAAI,EAAE,IAAA,EAAK;AAClC;AAOO,IAAM,gBAAgB,CAAC,EAAE,IAAA,EAAM,QAAA,GAAW,IAAG,KAAiC;AACnF,EAAA,OAAA,CAAQ,IAAA,IAAQ,UACb,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CACjD,KAAK,GAAG,CAAA;AACb;AAEO,IAAM,UAAA,GAAa,CAAC,KAAA,KAA4B;AACrD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC/B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAM,CAAC,CAAA;AACtC,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,EAAE,EAAE,CAAC,CAAA;AACnE;;;ACrBO,IAAM,KAAA,GAAQ,CAAC,YAAA,KACpB,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,YAAY,CAAC;AAMrD,IAAM,iBAAA,GAAoB,MAAqB,KAAA,CAAM,CAAC;;;ACP7D,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,mBAAmB,EAAA,GAAK,gBAAA;AAC9B,IAAM,iBAAiB,EAAA,GAAK,gBAAA;AAC5B,IAAM,gBAAgB,EAAA,GAAK,cAAA;AAEpB,IAAM,WAAA,GAAc;AAAA,EACzB,SAAA,EAAW,gBAAA;AAAA,EACX,SAAA,EAAW,gBAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ;AACV;;;ACPO,IAAM,WAAA,GAAc;AAGpB,IAAM,QAAA,GAAW;AAGjB,IAAM,OAAA,GAAU;AAGhB,IAAM,WAAA,GAAc;AAGpB,IAAM,SAAA,GAAY;AAElB,IAAM,aAAA,GAAgB,CAAC,KAAA,KAAkC;AAC9D,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,CAAA;AAE7B,EAAA,OAAO,KAAA,GAAQ,WAAA;AACjB;AAEO,IAAM,UAAA,GAAa,CAAC,KAAA,KAAkC;AAC3D,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,CAAA;AAE7B,EAAA,OAAO,KAAA,GAAQ,QAAA;AACjB;AAEO,IAAM,SAAA,GAAY,CAAC,KAAA,KAAkC;AAC1D,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,CAAA;AAE7B,EAAA,OAAO,KAAA,GAAQ,OAAA;AACjB;AAEO,IAAM,aAAA,GAAgB,CAAC,KAAA,KAAkC;AAC9D,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,CAAA;AAE7B,EAAA,OAAO,KAAA,GAAQ,WAAA;AACjB;AAEO,IAAM,WAAA,GAAc,CAAC,KAAA,KAAkC;AAC5D,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,CAAA;AAE7B,EAAA,OAAO,KAAA,GAAQ,SAAA;AACjB;;;AC3CO,IAAM,eAAA,GAAkB;AAAA,EAC7B,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK;AACP;AAEA,IAAM,qBAAA,GAAwB,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA;AAEpD,IAAM,gBAAA,GAAmB;AAEzB,IAAM,cAAA,GAAiB,CAAC,GAAA,KAAiC;AAC9D,EAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,EAAG;AAChB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAClC;AAEO,IAAM,SAAA,GAAY,CAAC,GAAA,KAAiC;AACzD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AACjC,EAAA,OAAO,qBAAA,CAAsB,KAAK,CAAC,MAAA,KAAW,SAAS,UAAA,CAAW,CAAA,EAAG,MAAM,CAAA,GAAA,CAAK,CAAC,CAAA;AACnF;AAUO,IAAM,wBAAA,GAA2B,CAAC,OAAA,KAA4B;AACnE,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,OAAA;AAClC;AAEO,IAAM,SAAA,GAAY,CAAC,KAAA,KAA2B;AACnD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,OAAO,mBAAmB,KAAK,CAAA;AACjC;AAEO,IAAM,SAAA,GAAY,CAAC,KAAA,KAA2B;AACnD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,IAAI;AACF,IAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAOO,IAAM,aAAA,GAAgB,CAAC,EAAE,QAAA,EAAU,QAAO,KAAiC;AAChF,EAAA,OAAO,CAAA,KAAA,EAAQ,QAAQ,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AAC1C;AAEO,IAAM,mBAAA,GAAsB,CAAC,MAAA,KAA2B;AAC7D,EAAA,OAAO,IAAA,CAAK,KAAA,CAAO,MAAA,CAAO,MAAA,GAAS,IAAK,CAAC,CAAA;AAC3C;;;ACrEA,IAAM,wBAAA,GAAqC,CAAC,SAAA,CAAU,UAAA,EAAY,UAAU,IAAI,CAAA;AAEzE,IAAM,YAAA,GAAe,CAAC,EAAA,KAA2C;AACtE,EAAA,IAAI,SAAA,CAAU,EAAE,CAAA,EAAG,OAAO,KAAA;AAC1B,EAAA,OAAO,wBAAA,CAAyB,QAAA,CAAS,EAAA,CAAG,UAAU,CAAA;AACxD;AAEO,IAAM,oBAAA,GAAuB,CAAC,EAAA,KAA2C;AAC9E,EAAA,IAAI,SAAA,CAAU,EAAE,CAAA,EAAG,OAAO,KAAA;AAC1B,EAAA,OAAO,wBAAA,CAAyB,QAAA,CAAS,EAAA,CAAG,UAAU,CAAA;AACxD;AAEO,IAAM,cAAA,GAAiB,CAAC,EAAA,KAA0B;AACvD,EAAA,IAAI,UAAU,EAAE,CAAA,IAAK,CAAC,YAAA,CAAa,EAAE,CAAA,EAAG;AAExC,EAAA,IAAI;AACF,IAAA,EAAA,CAAG,KAAA,EAAM;AAAA,EACX,CAAA,CAAA,MAAQ;AAAA,EAER;AACF","file":"index.cjs","sourcesContent":["const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nconst encodeUtf8ToBytes = (text: string): number[] => {\n const codePoints: number[] = [];\n\n for (let i = 0; i < text.length; i++) {\n const codeUnit = text.charCodeAt(i);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff && i + 1 < text.length) {\n const next = text.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n codePoints.push(0x10000 + ((codeUnit - 0xd800) << 10) + (next - 0xdc00));\n i++;\n continue;\n }\n }\n codePoints.push(codeUnit);\n }\n\n const bytes: number[] = [];\n for (const codePoint of codePoints) {\n if (codePoint < 0x80) {\n bytes.push(codePoint);\n } else if (codePoint < 0x800) {\n bytes.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f));\n } else if (codePoint < 0x10000) {\n bytes.push(0xe0 | (codePoint >> 12), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));\n } else {\n bytes.push(\n 0xf0 | (codePoint >> 18),\n 0x80 | ((codePoint >> 12) & 0x3f),\n 0x80 | ((codePoint >> 6) & 0x3f),\n 0x80 | (codePoint & 0x3f),\n );\n }\n }\n\n return bytes;\n};\n\nconst decodeUtf8FromBytes = (bytes: number[]): string => {\n let result = '';\n let i = 0;\n\n while (i < bytes.length) {\n const b0 = bytes[i]!;\n let codePoint: number;\n\n if (b0 < 0x80) {\n codePoint = b0;\n i += 1;\n } else if ((b0 & 0xe0) === 0xc0) {\n codePoint = ((b0 & 0x1f) << 6) | (bytes[i + 1]! & 0x3f);\n i += 2;\n } else if ((b0 & 0xf0) === 0xe0) {\n codePoint = ((b0 & 0x0f) << 12) | ((bytes[i + 1]! & 0x3f) << 6) | (bytes[i + 2]! & 0x3f);\n i += 3;\n } else {\n codePoint =\n ((b0 & 0x07) << 18) |\n ((bytes[i + 1]! & 0x3f) << 12) |\n ((bytes[i + 2]! & 0x3f) << 6) |\n (bytes[i + 3]! & 0x3f);\n i += 4;\n }\n\n if (codePoint <= 0xffff) {\n result += String.fromCharCode(codePoint);\n } else {\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xd800 + (adjusted >> 10), 0xdc00 + (adjusted & 0x3ff));\n }\n }\n\n return result;\n};\n\nconst encodeBytesToBase64 = (bytes: number[]): string => {\n let output = '';\n\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i]!;\n const b1 = i + 1 < bytes.length ? bytes[i + 1]! : 0;\n const b2 = i + 2 < bytes.length ? bytes[i + 2]! : 0;\n const triplet = (b0 << 16) | (b1 << 8) | b2;\n\n output += BASE64_CHARS[(triplet >> 18) & 0x3f];\n output += BASE64_CHARS[(triplet >> 12) & 0x3f];\n output += i + 1 < bytes.length ? BASE64_CHARS[(triplet >> 6) & 0x3f] : '=';\n output += i + 2 < bytes.length ? BASE64_CHARS[triplet & 0x3f] : '=';\n }\n\n return output;\n};\n\nconst decodeBase64ToBytes = (base64: string): number[] => {\n const sanitized = base64.replace(/[^A-Za-z0-9+/=]/g, '');\n const bytes: number[] = [];\n\n for (let i = 0; i < sanitized.length; i += 4) {\n const c0 = BASE64_CHARS.indexOf(sanitized[i]!);\n const c1 = BASE64_CHARS.indexOf(sanitized[i + 1]!);\n const c2 = sanitized[i + 2] === '=' ? 0 : BASE64_CHARS.indexOf(sanitized[i + 2]!);\n const c3 = sanitized[i + 3] === '=' ? 0 : BASE64_CHARS.indexOf(sanitized[i + 3]!);\n\n if (c0 < 0 || c1 < 0 || (sanitized[i + 2] !== '=' && c2 < 0) || (sanitized[i + 3] !== '=' && c3 < 0)) {\n throw new Error('Invalid base64 character');\n }\n\n const triplet = (c0 << 18) | (c1 << 12) | (c2 << 6) | c3;\n\n bytes.push((triplet >> 16) & 0xff);\n if (sanitized[i + 2] !== '=') bytes.push((triplet >> 8) & 0xff);\n if (sanitized[i + 3] !== '=') bytes.push(triplet & 0xff);\n }\n\n return bytes;\n};\n\nexport const encodeBase64 = (text: string): string => {\n try {\n return encodeBytesToBase64(encodeUtf8ToBytes(text));\n } catch {\n return '';\n }\n};\n\nexport const decodeBase64 = (base64: string): string => {\n try {\n return decodeUtf8FromBytes(decodeBase64ToBytes(base64));\n } catch {\n return '';\n }\n};\n","export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { isNullish } from \"./types.utils\";\n\nexport interface ToleranceArea {\n flow: number;\n toleranceRange: [number, number];\n}\n\n/**\n * A chart point with required x and y coordinates.\n */\nexport interface ChartPoint {\n x: number;\n y: number;\n}\n\n/**\n * A chart point with optional nullable x and y coordinates.\n */\nexport interface NullableChartPoint {\n x?: number | null;\n y?: number | null;\n}\n\nexport const getTickDomain = (ticks: number[]): [number, number] => [0, ticks.at(-1) ?? 0];\n\nexport const tickFormatter = (value: number): string => value.toFixed(0);\n\nexport const toToleranceLabel = (value: number): string => `±${(value * 100).toFixed(0)}%`;\n\nexport const tooltipValueFormatter = (data?: unknown | null): string => {\n if (isNullish(data)) {\n return '';\n }\n\n if (typeof data === 'number') {\n return data.toFixed(2);\n }\n\n if (Array.isArray(data) && data.length >= 2) {\n const [min, max] = data;\n if (typeof min === 'number' && typeof max === 'number') {\n return `[${min.toFixed(2)} … ${max.toFixed(2)}]`;\n }\n }\n\n return String(data ?? '');\n};\n\n/**\n * Rounds a raw value to a \"nice\" number for chart axis increments.\n * Nice numbers are easy to read: 1, 2, 2.5, 5, or 10 multiplied by a power of 10.\n *\n * @param rawValue - The raw value to round to a nice number\n * @returns A nice number close to the raw value\n *\n * @example\n * roundToNiceNumber(0.7) // returns 1\n * roundToNiceNumber(3) // returns 5\n * roundToNiceNumber(17) // returns 20\n * roundToNiceNumber(80) // returns 100\n */\nexport const roundToNiceNumber = (rawValue: number): number => {\n if (rawValue <= 0) return 0;\n\n // Get order of magnitude\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawValue)));\n\n // Normalize to find the multiplier (between 1 and 10)\n const normalized = rawValue / magnitude;\n\n // Round to nice values: 1, 2, 2.5, 5, 10\n let niceMultiplier: number;\n if (normalized <= 1) niceMultiplier = 1;\n else if (normalized <= 2) niceMultiplier = 2;\n else if (normalized <= 2.5) niceMultiplier = 2.5;\n else if (normalized <= 5) niceMultiplier = 5;\n else niceMultiplier = 10;\n\n return niceMultiplier * magnitude;\n};\n\nconst roundToPrecision = (value: number, precision = 10): number => {\n const factor = 10 ** precision;\n return Math.round(value * factor) / factor;\n};\n\n/**\n * Builds an array of \"nice\" tick values for a chart axis.\n * The algorithm aims for approximately `targetTickCount` ticks with clean, readable values.\n *\n * @param max - The maximum value to display on the axis\n * @param targetTickCount - The desired number of ticks (default: 10)\n * @returns An array of tick values from 0 to at least `max`\n */\nexport const buildTicksForChart = (max: number, targetTickCount = 10): number[] => {\n if (max <= 0) return [0];\n\n // Calculate raw increment for desired tick count and round to nice value\n const rawIncrement = max / targetTickCount;\n const niceIncrement = roundToNiceNumber(rawIncrement);\n\n // Build ticks from 0 to just past max\n const ticks: number[] = [];\n for (let value = 0; value <= max + niceIncrement * 0.5; value += niceIncrement) {\n // Round to avoid floating point precision issues\n ticks.push(roundToPrecision(value));\n }\n\n // Ensure we have at least one tick >= max\n const lastTick = ticks[ticks.length - 1];\n if (lastTick < max) {\n ticks.push(roundToPrecision(lastTick + niceIncrement));\n }\n\n return ticks;\n};\n","export interface RgbColor {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface RgbaColor extends RgbColor {\n a: number;\n}\n\nexport const rgbToHex = (r: number, g: number, b: number): string => {\n if (r > 255 || g > 255 || b > 255) {\n throw new Error(\"Invalid color component\");\n }\n\n return ((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\");\n};\n\nexport const hexToRgb = (hex: string): RgbColor => {\n const cleanHex = hex.replace(\"#\", \"\");\n\n const r = parseInt(cleanHex.substring(0, 2), 16);\n const g = parseInt(cleanHex.substring(2, 4), 16);\n const b = parseInt(cleanHex.substring(4, 6), 16);\n\n return { r, g, b };\n};\n\nexport const rgbaToHex = (color: RgbaColor): string => {\n return \"#\" + rgbToHex(color.r, color.g, color.b);\n};\n\nexport const getOpacityHexValue = (opacity: number): string => {\n if (opacity < 0 || opacity > 1) {\n throw new Error(\"Invalid opacity value\");\n }\n\n return Math.round(opacity * 255)\n .toString(16)\n .padStart(2, \"0\");\n};\n\nexport const rgbaToHexWithAlpha = (color: RgbaColor): string => {\n return rgbaToHex(color) + getOpacityHexValue(color.a);\n};\n\nexport const rgbToString = (color: RgbColor): string => {\n return `rgb(${color.r}, ${color.g}, ${color.b})`;\n};\n\nexport const rgbaToString = (color: RgbaColor): string => {\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`;\n};\n\nexport const getLuminance = (r: number, g: number, b: number): number => {\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n};\n\nexport const getContrastTextColor = (hexColor: string): string => {\n const { r, g, b } = hexToRgb(hexColor);\n return getLuminance(r, g, b) > 0.5 ? \"#000000\" : \"#ffffff\";\n};\n\n/**\n * Normalized RGB color with values between 0 and 1.\n * Useful for graphics libraries like Three.js.\n */\nexport interface NormalizedRgb {\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Convert a hex color string to normalized RGB values (0-1 range).\n * @param hex - Hex color string (with or without # prefix)\n * @returns Normalized RGB object with values between 0 and 1\n */\nexport const hexToNormalizedRgb = (hex: string): NormalizedRgb => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16) / 255,\n g: parseInt(result[2], 16) / 255,\n b: parseInt(result[3], 16) / 255,\n }\n : { r: 0, g: 0, b: 0 };\n};\n\n/**\n * Determine if a color is light or dark based on relative luminance.\n * Useful for choosing contrasting text colors.\n * @param hex - Hex color string\n * @returns True if the color is considered light (luminance > 0.5)\n */\nexport const isLightColor = (hex: string): boolean => {\n const rgb = hexToNormalizedRgb(hex);\n // Calculate relative luminance using standard coefficients\n const luminance = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n return luminance > 0.5;\n};\n\nconst PERCENT_COLORS = [\n { pct: 0.0, color: { r: 0xff, g: 0x00, b: 0 } },\n { pct: 0.5, color: { r: 0xff, g: 0xff, b: 0 } },\n { pct: 1.0, color: { r: 0x00, g: 0xff, b: 0 } },\n] as const;\n\n// https://stackoverflow.com/a/7128796/704681\nexport const getColorForPercentage = (percent: number): string => {\n if (percent < 0 || percent > 1) {\n throw new Error(`Percentage must be between 0 and 1: ${percent}`);\n }\n\n let i = 1;\n for (; i < PERCENT_COLORS.length - 1; i++) {\n if (percent < PERCENT_COLORS[i].pct) {\n break;\n }\n }\n\n const lower = PERCENT_COLORS[i - 1];\n const upper = PERCENT_COLORS[i];\n const range = upper.pct - lower.pct;\n const rangePct = (percent - lower.pct) / range;\n const pctLower = 1 - rangePct;\n const pctUpper = rangePct;\n const color = {\n r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper),\n g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper),\n b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper),\n };\n\n return \"rgb(\" + [color.r, color.g, color.b].join(\",\") + \")\";\n};\n","import { format } from \"date-fns\";\nimport { isNullish } from \"./types.utils\";\n\nexport type DateInput = Date | string | number | null;\n\nexport const dateAs_HHMMSS = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"HH:mm:ss\");\n};\n\nexport const dateAs_YYYYMMDD = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"yyyy-MM-dd\");\n};\n\nexport const dateAs_YYYYMMDD_HHMMSS = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"yyyy-MM-dd HH:mm:ss\");\n};\n\nexport const nowAsTime = () => dateAs_HHMMSS(new Date());\nexport const nowAsDate = () => dateAs_YYYYMMDD(new Date());\nexport const nowAsDateTime = () => dateAs_YYYYMMDD_HHMMSS(new Date());\n\nexport const nowAsDateTimeForFilename = () => {\n return format(new Date(), \"yyyy-MM-dd_HH-mm-ss\");\n};\n\nconst DEFAULT_DATE_FORMAT = \"yyyy-MM-dd HH:mm:ss\";\n\n/**\n * Format a Unix timestamp (seconds since epoch) to a human-readable string.\n * @param timestamp - Unix timestamp in seconds\n * @param dateFormat - Date format string (default: \"yyyy-MM-dd HH:mm:ss\")\n * @returns Formatted date string or \"N/A\" if invalid or zero.\n */\nexport const formatUnixTimestamp = (\n timestamp: number,\n dateFormat: string = DEFAULT_DATE_FORMAT\n): string => {\n if (!timestamp) return \"N/A\";\n try {\n return format(new Date(timestamp * 1000), dateFormat);\n } catch {\n return \"Invalid date\";\n }\n};\n\n/**\n * Get the current Unix timestamp in seconds.\n * @returns Current Unix timestamp\n */\nexport const getCurrentUnixTimestamp = (): number => {\n return Math.floor(Date.now() / 1000);\n};\n\n/**\n * Check if a Unix timestamp has expired (is in the past).\n * @param timestamp - Unix timestamp in seconds\n * @returns True if the timestamp is in the past\n */\nexport const isExpiredTimestamp = (timestamp: number): boolean => {\n const now = getCurrentUnixTimestamp();\n return timestamp < now;\n};\n\n/**\n * Check if a Unix timestamp is active (current or past).\n * @param timestamp - Unix timestamp in seconds\n * @returns True if the timestamp is current or in the past\n */\nexport const isActiveTimestamp = (timestamp: number): boolean => {\n const now = getCurrentUnixTimestamp();\n return timestamp <= now;\n};\n","export const getErrorMessage = (error: unknown): string => {\n if (!error) {\n return \"\";\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n if (typeof error === \"object\" && \"message\" in error) {\n return (error as { message: string }).message;\n }\n\n return JSON.stringify(error);\n};\n\nexport const toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error;\n }\n\n return new Error(getErrorMessage(error));\n};\n","export const REGEX_ALPHANUMERIC = /^[a-zA-Z0-9-_ $%#(){}:/.]+$/;\n\nexport const REGEX_IPV4 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = '...'): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Converts a string to kebab-case.\n * Handles camelCase, PascalCase, snake_case, and space-separated strings.\n *\n * @example\n * toKebabCase(\"myComponentName\") // → \"my-component-name\"\n * toKebabCase(\"XMLParser\") // → \"xml-parser\"\n */\nexport const toKebabCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase();\n};\n\n/**\n * Converts a string to camelCase.\n * Handles kebab-case, snake_case, PascalCase, and space-separated strings.\n *\n * @example\n * toCamelCase(\"my-component-name\") // → \"myComponentName\"\n * toCamelCase(\"my_snake_case\") // → \"mySnakeCase\"\n */\nexport const toCamelCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .trim()\n .replace(/[-_\\s]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n};\n\n/**\n * Converts a string to a URL-safe slug.\n * Removes diacritical marks, lowercases, replaces non-alphanumeric characters with hyphens,\n * and strips leading/trailing hyphens.\n *\n * @param value - The input string to slugify\n * @returns The slugified string\n *\n * @example\n * slugify(\"Héllo Wörld!\") // → \"hello-world\"\n * slugify(\" My Blog Post \") // → \"my-blog-post\"\n */\nexport const slugify = (value: string): string => {\n if (!value) return '';\n return removeDiacriticalMarks(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(',')\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { isBlank } from \"./string.utils\";\n\nexport const getFileExtension = (filename?: string | null): string => {\n if (isBlank(filename)) {\n return \"\";\n }\n\n const lastDotIndex = filename.lastIndexOf(\".\");\n if (lastDotIndex <= 0) {\n // No dot (-1), or dot is at start (0)\n // hidden file without extension\n return lastDotIndex === 0 ? filename.slice(1).toLowerCase() : \"\";\n }\n\n return filename.slice(lastDotIndex + 1).toLowerCase();\n};\n","import { isBlank } from \"./string.utils\";\nimport { isNullish } from \"./types.utils\";\n\nexport const parseOptionalFormNumber = (value?: string | null): number | null => {\n if (isBlank(value)) return null;\n\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n};\n\nexport const toFormString = (n?: number | null): string => {\n if (isNullish(n)) return \"\";\n\n return Number.isFinite(n) ? String(n) : \"\";\n};\n\n/**\n * Converts a number to a form string, rounded to integer.\n * Avoids floating-point display noise (e.g. 3700.0000000000005).\n */\nexport const toFormStringInteger = (n?: number | null): string => {\n if (isNullish(n)) return \"\";\n if (!Number.isFinite(n)) return \"\";\n\n return String(Math.round(n));\n};\n","const HTML_ESCAPE_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\n\nconst HTML_UNESCAPE_MAP: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n '&#x27;': \"'\",\n};\n\nexport const escapeHtml = (text: string): string => {\n return text.replace(/[&<>\"']/g, (char) => HTML_ESCAPE_MAP[char] ?? char);\n};\n\nexport const unescapeHtml = (text: string): string => {\n return text.replace(/&(?:amp|lt|gt|quot|#39|#x27);/g, (entity) => HTML_UNESCAPE_MAP[entity] ?? entity);\n};\n","import { isNullish } from './types.utils';\n\nexport const isHttpSuccessStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 200 && status < 300;\n};\n\nexport const isHttpClientErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 400 && status < 500;\n};\n\nexport const isHttpServerErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 500;\n};\n","export const safeJsonParse = <T>(value: string, fallback?: T): T | undefined => {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n};\n\nexport const safeJsonStringify = (obj: unknown, space: number = 2): string => {\n if (!obj) return '';\n try {\n return JSON.stringify(obj, null, space);\n } catch {\n return '';\n }\n};\n\nexport const sortObjectKeys = (_key: string, value: unknown): unknown =>\n value instanceof Object && !(value instanceof Array)\n ? Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce(\n (sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n },\n {} as Record<string, unknown>,\n )\n : value;\n\ninterface FormatJsonArgs {\n value?: string;\n space?: number;\n sortKeys?: boolean;\n}\n\nexport const formatJson = ({ value, space = 2, sortKeys = false }: FormatJsonArgs): string => {\n if (!value) return '';\n\n try {\n const obj: unknown = JSON.parse(value);\n return JSON.stringify(obj, sortKeys ? sortObjectKeys : undefined, space);\n } catch {\n return value;\n }\n};\n\nexport const prettifyJson = (value?: string): string => {\n return formatJson({ value, space: 4, sortKeys: true });\n};\n\nexport const minifyJson = (value?: string): string => {\n return formatJson({ value, space: 0, sortKeys: true });\n};\n\nexport const isValidJson = (value: string): boolean => {\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const isMinifiedJson = (value: string): boolean => {\n return value === minifyJson(value);\n};\n","import { isBlank } from './string.utils';\nimport { isNullish, isNumber } from './types.utils';\n\n/**\n * Returns true if the input string is a valid number (blank and non-numeric strings are invalid).\n */\nexport const isInputValidNumber = (value: string): boolean => {\n if (isBlank(value)) return false;\n const num = Number(value.trim());\n return Number.isFinite(num);\n};\n\n/**\n * Returns true if the input string is a valid integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidInteger = (value: string): boolean => {\n if (!isInputValidNumber(value)) return false;\n const num = Number(value.trim());\n return Number.isInteger(num);\n};\n\n/**\n * Returns true if the input string is a valid positive integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidPositiveInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num > 0;\n};\n\n/**\n * Returns true if the input string is a valid negative integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidNegativeInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num < 0;\n};\n\n/**\n * Formats a number as an integer display string (removes decimals).\n */\nexport const formatIntegerDisplay = (value?: number | null): string => String(toFixed(value, 0));\n\n// Example: toFixed(3.14159, 3) // 3.142\nexport const toFixed = (value?: number | null, decimals = 0): number => {\n if (isNullish(value)) return 0;\n if (decimals < 0) throw new Error('[toFixed] decimals must be >= 0');\n if (decimals === 0) return Math.round(value);\n\n const multiplier = Math.pow(10, decimals);\n return Math.round(value * multiplier) / multiplier;\n};\n\nexport const roundUpToNearest10 = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n return Math.ceil(value / 10) * 10;\n};\n\n/**\n * Format a number with K (thousands) or M (millions) suffix.\n */\nexport const formatCount = (count: number): string => {\n if (count >= 1_000_000) {\n return `${(count / 1_000_000).toFixed(1)}M`;\n }\n if (count >= 1_000) {\n return `${(count / 1_000).toFixed(1)}K`;\n }\n return count.toString();\n};\n\n/**\n * Format a duration in milliseconds to a human-readable string.\n */\nexport const formatDuration = (ms: number): string => {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n};\n\nexport const formatWithSpaceSeparator = (val?: number | string | null): string => {\n if (isNullish(val)) return '';\n return String(val).replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\\u00a0');\n};\n\nexport const parseWithSpaceSeparator = (val?: string): number => {\n return Number(val?.replace(/\\u00a0/g, ''));\n};\n\nexport const getOrderOfMagnitudeExponent = (n?: number | null): number => {\n if (isNullish(n)) return 0;\n if (!isNumber(n)) return 0;\n\n const absValue = Math.abs(n);\n if (absValue === 0) {\n return 0;\n }\n\n const integerPart = Math.floor(absValue);\n return Math.floor(Math.log10(integerPart));\n};\n","import { isNullish } from \"./types.utils\";\n\n/**\n * Returns true when running in Node.js.\n * Checks for process.versions.node to avoid false positives in Web Workers.\n */\nexport const isRuntimeEnvNodeJs = (): boolean => {\n if (typeof window !== \"undefined\") return false;\n if (typeof process === \"undefined\") return false;\n if (isNullish(process?.versions?.node)) return false;\n\n return true;\n};\n","export const firstSentence = (s: string): string => {\n const m = s.match(/^[^.!?]+[.!?]/);\n return m ? m[0].trim() : s.trim();\n};\n\ninterface TitleFromNameArgs {\n name: string;\n fallback?: string;\n}\n\nexport const titleFromName = ({ name, fallback = '' }: TitleFromNameArgs): string => {\n return (name || fallback)\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n};\n\nexport const joinOxford = (items: string[]): string => {\n if (items.length === 0) return '';\n if (items.length === 1) return items[0];\n return items.slice(0, -1).join(', ') + ' or ' + items.slice(-1)[0];\n};\n","export const sleep = (milliseconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\n\n/**\n * Yields to the main thread so the UI can process events and repaint.\n * Use during long-running synchronous work (e.g. report generation) to keep the app responsive.\n */\nexport const yieldToMainThread = (): Promise<void> => sleep(0);\n","const ONE_SECOND_IN_MS = 1000;\nconst ONE_MINUTE_IN_MS = 60 * ONE_SECOND_IN_MS;\nconst ONE_HOUR_IN_MS = 60 * ONE_MINUTE_IN_MS;\nconst ONE_DAY_IN_MS = 24 * ONE_HOUR_IN_MS;\n\nexport const PeriodsInMS = {\n oneSecond: ONE_SECOND_IN_MS,\n oneMinute: ONE_MINUTE_IN_MS,\n oneHour: ONE_HOUR_IN_MS,\n oneDay: ONE_DAY_IN_MS,\n} as const;\n","import { isNullish } from \"./types.utils\";\n\n/** m³/s to gallons per minute */\nexport const M3PS_TO_GPM = 15850.3;\n\n/** Pascals to feet of head (1 Pa = 1 N/m²) */\nexport const PA_TO_FT = 0.000334553;\n\n/** Watts to Horsepower */\nexport const W_TO_HP = 0.00134102;\n\n/** meters to inches */\nexport const M_TO_INCHES = 39.3701;\n\n/** Hz to RPM (for synchronous speed) */\nexport const HZ_TO_RPM = 60;\n\nexport const fromM3psToGPM = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * M3PS_TO_GPM;\n};\n\nexport const fromPaToFt = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * PA_TO_FT;\n};\n\nexport const fromWToHp = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * W_TO_HP;\n};\n\nexport const fromMToInches = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * M_TO_INCHES;\n};\n\nexport const fromHzToRpm = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * HZ_TO_RPM;\n};\n","import { isBlank } from \".\";\n\nexport const SCHEME_PREFIXES = {\n file: 'file',\n content: 'content',\n http: 'http',\n https: 'https',\n ftp: 'ftp',\n ftps: 'ftps',\n sftp: 'sftp',\n smb: 'smb',\n} as const;\n\nconst SCHEME_PREFIXES_ARRAY = Object.values(SCHEME_PREFIXES);\n\nexport const DATA_URI_PATTERN = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,(.+)$/;\n\nexport const isValidDataUri = (uri?: string | null): boolean => {\n if (isBlank(uri)) {\n return false;\n }\n\n return DATA_URI_PATTERN.test(uri);\n};\n\nexport const hasScheme = (uri?: string | null): boolean => {\n if (!uri) {\n return false;\n }\n\n const lowerUri = uri.toLowerCase();\n return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));\n};\n\n/**\n * Extracts the base64 data from a data URI string.\n * Data URIs have the format: data:[<mediatype>][;base64],<data>\n * This function extracts everything after the first comma.\n *\n * @param dataUri - The data URI string (e.g., \"data:image/png;base64,iVBORw0KG...\")\n * @returns The base64 data without the data URI prefix, or the original string if no comma is found\n */\nexport const extractBase64FromDataUri = (dataUri: string): string => {\n return dataUri.split(',')[1] ?? dataUri;\n};\n\nexport const encodeUrl = (value?: string): string => {\n if (!value) return '';\n return encodeURIComponent(value);\n};\n\nexport const decodeUrl = (value?: string): string => {\n if (!value) return '';\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\ninterface FormatDataUriArgs {\n mimeType: string;\n base64: string;\n}\n\nexport const formatDataUri = ({ mimeType, base64 }: FormatDataUriArgs): string => {\n return `data:${mimeType};base64,${base64}`;\n};\n\nexport const getBase64ApproxSize = (base64: string): number => {\n return Math.round((base64.length * 3) / 4);\n};\n","import { isNullish } from \"./types.utils\";\n\nconst WEBSOCKET_CONNECT_STATES: number[] = [WebSocket.CONNECTING, WebSocket.OPEN] as const;\n\nexport const isWsClosable = (ws?: WebSocket | null): ws is WebSocket => {\n if (isNullish(ws)) return false;\n return WEBSOCKET_CONNECT_STATES.includes(ws.readyState);\n};\n\nexport const isWsOpenOrConnecting = (ws?: WebSocket | null): ws is WebSocket => {\n if (isNullish(ws)) return false;\n return WEBSOCKET_CONNECT_STATES.includes(ws.readyState);\n};\n\nexport const closeWebSocket = (ws?: WebSocket | null) => {\n if (isNullish(ws) || !isWsClosable(ws)) return;\n\n try {\n ws.close();\n } catch {\n // do nothing (best effort to close, ignore unexpected errors)\n }\n};\n"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- export { D as Dimensions, N as NormalizedRgb, R as RgbColor, a as RgbaColor, l as getColorForPercentage, i as getContrastTextColor, f as getLuminance, g as getOpacityHexValue, j as hexToNormalizedRgb, h as hexToRgb, k as isLightColor, r as rgbToHex, d as rgbToString, b as rgbaToHex, c as rgbaToHexWithAlpha, e as rgbaToString } from './dimensions.utils-BSm9gmWz.cjs';
1
+ export { D as Dimensions, N as NormalizedRgb, R as RgbColor, a as RgbaColor, g as getColorForPercentage, b as getContrastTextColor, c as getLuminance, d as getOpacityHexValue, h as hexToNormalizedRgb, e as hexToRgb, i as isLightColor, r as rgbToHex, f as rgbToString, j as rgbaToHex, k as rgbaToHexWithAlpha, l as rgbaToString } from './dimensions.utils-C7MsHTQd.cjs';
2
2
 
3
3
  declare const encodeBase64: (text: string) => string;
4
4
  declare const decodeBase64: (base64: string) => string;
@@ -146,6 +146,8 @@ declare const formatCount: (count: number) => string;
146
146
  * Format a duration in milliseconds to a human-readable string.
147
147
  */
148
148
  declare const formatDuration: (ms: number) => string;
149
+ declare const formatWithSpaceSeparator: (val?: number | string | null) => string;
150
+ declare const parseWithSpaceSeparator: (val?: string) => number;
149
151
  declare const getOrderOfMagnitudeExponent: (n?: number | null) => number;
150
152
 
151
153
  declare const REGEX_ALPHANUMERIC: RegExp;
@@ -194,11 +196,50 @@ declare const countWords: (text: string) => number;
194
196
  * @returns The truncated string
195
197
  */
196
198
  declare const truncate: (str: string, maxLength: number, ellipsis?: string) => string;
199
+ /**
200
+ * Converts a string to kebab-case.
201
+ * Handles camelCase, PascalCase, snake_case, and space-separated strings.
202
+ *
203
+ * @example
204
+ * toKebabCase("myComponentName") // → "my-component-name"
205
+ * toKebabCase("XMLParser") // → "xml-parser"
206
+ */
207
+ declare const toKebabCase: (value?: string | null) => string;
208
+ /**
209
+ * Converts a string to camelCase.
210
+ * Handles kebab-case, snake_case, PascalCase, and space-separated strings.
211
+ *
212
+ * @example
213
+ * toCamelCase("my-component-name") // → "myComponentName"
214
+ * toCamelCase("my_snake_case") // → "mySnakeCase"
215
+ */
216
+ declare const toCamelCase: (value?: string | null) => string;
217
+ /**
218
+ * Converts a string to a URL-safe slug.
219
+ * Removes diacritical marks, lowercases, replaces non-alphanumeric characters with hyphens,
220
+ * and strips leading/trailing hyphens.
221
+ *
222
+ * @param value - The input string to slugify
223
+ * @returns The slugified string
224
+ *
225
+ * @example
226
+ * slugify("Héllo Wörld!") // → "hello-world"
227
+ * slugify(" My Blog Post ") // → "my-blog-post"
228
+ */
229
+ declare const slugify: (value: string) => string;
197
230
  /**
198
231
  * Parses an optional comma-separated string into a trimmed, non-blank string array.
199
232
  */
200
233
  declare const parseCommaSeparatedList: (raw?: string | null) => string[];
201
234
 
235
+ declare const firstSentence: (s: string) => string;
236
+ interface TitleFromNameArgs {
237
+ name: string;
238
+ fallback?: string;
239
+ }
240
+ declare const titleFromName: ({ name, fallback }: TitleFromNameArgs) => string;
241
+ declare const joinOxford: (items: string[]) => string;
242
+
202
243
  declare const sleep: (milliseconds: number) => Promise<void>;
203
244
  /**
204
245
  * Yields to the main thread so the UI can process events and repaint.
@@ -269,4 +310,4 @@ declare const isWsClosable: (ws?: WebSocket | null) => ws is WebSocket;
269
310
  declare const isWsOpenOrConnecting: (ws?: WebSocket | null) => ws is WebSocket;
270
311
  declare const closeWebSocket: (ws?: WebSocket | null) => void;
271
312
 
272
- export { type ChartPoint, DATA_URI_PATTERN, type DateInput, HZ_TO_RPM, M3PS_TO_GPM, M_TO_INCHES, NO_OP, type NullableChartPoint, PA_TO_FT, PeriodsInMS, REGEX_ALPHANUMERIC, REGEX_IPV4, SCHEME_PREFIXES, type ToleranceArea, W_TO_HP, buildTicksForChart, capitalizeFirst, closeWebSocket, countWords, dateAs_HHMMSS, dateAs_YYYYMMDD, dateAs_YYYYMMDD_HHMMSS, decodeBase64, decodeUrl, encodeBase64, encodeUrl, escapeHtml, extractBase64FromDataUri, formatCount, formatDataUri, formatDuration, formatIntegerDisplay, formatJson, formatUnixTimestamp, fromHzToRpm, fromM3psToGPM, fromMToInches, fromPaToFt, fromWToHp, getBase64ApproxSize, getCurrentUnixTimestamp, getErrorMessage, getFileExtension, getOrderOfMagnitudeExponent, getTickDomain, hasScheme, isActiveTimestamp, isAlphanumeric, isBlank, isExpiredTimestamp, isHttpClientErrorStatus, isHttpServerErrorStatus, isHttpSuccessStatus, isInputValidInteger, isInputValidNegativeInteger, isInputValidNumber, isInputValidPositiveInteger, isMinifiedJson, isNotBlank, isNullish, isNumber, isRuntimeEnvNodeJs, isString, isValidDataUri, isValidJson, isWsClosable, isWsOpenOrConnecting, minifyJson, nowAsDate, nowAsDateTime, nowAsDateTimeForFilename, nowAsTime, parseCommaSeparatedList, parseOptionalFormNumber, prettifyJson, removeDiacriticalMarks, roundToNiceNumber, roundUpToNearest10, safeJsonParse, safeJsonStringify, sleep, sortObjectKeys, tickFormatter, toError, toFixed, toFormString, toFormStringInteger, toToleranceLabel, tooltipValueFormatter, truncate, unescapeHtml, yieldToMainThread };
313
+ export { type ChartPoint, DATA_URI_PATTERN, type DateInput, HZ_TO_RPM, M3PS_TO_GPM, M_TO_INCHES, NO_OP, type NullableChartPoint, PA_TO_FT, PeriodsInMS, REGEX_ALPHANUMERIC, REGEX_IPV4, SCHEME_PREFIXES, type ToleranceArea, W_TO_HP, buildTicksForChart, capitalizeFirst, closeWebSocket, countWords, dateAs_HHMMSS, dateAs_YYYYMMDD, dateAs_YYYYMMDD_HHMMSS, decodeBase64, decodeUrl, encodeBase64, encodeUrl, escapeHtml, extractBase64FromDataUri, firstSentence, formatCount, formatDataUri, formatDuration, formatIntegerDisplay, formatJson, formatUnixTimestamp, formatWithSpaceSeparator, fromHzToRpm, fromM3psToGPM, fromMToInches, fromPaToFt, fromWToHp, getBase64ApproxSize, getCurrentUnixTimestamp, getErrorMessage, getFileExtension, getOrderOfMagnitudeExponent, getTickDomain, hasScheme, isActiveTimestamp, isAlphanumeric, isBlank, isExpiredTimestamp, isHttpClientErrorStatus, isHttpServerErrorStatus, isHttpSuccessStatus, isInputValidInteger, isInputValidNegativeInteger, isInputValidNumber, isInputValidPositiveInteger, isMinifiedJson, isNotBlank, isNullish, isNumber, isRuntimeEnvNodeJs, isString, isValidDataUri, isValidJson, isWsClosable, isWsOpenOrConnecting, joinOxford, minifyJson, nowAsDate, nowAsDateTime, nowAsDateTimeForFilename, nowAsTime, parseCommaSeparatedList, parseOptionalFormNumber, parseWithSpaceSeparator, prettifyJson, removeDiacriticalMarks, roundToNiceNumber, roundUpToNearest10, safeJsonParse, safeJsonStringify, sleep, slugify, sortObjectKeys, tickFormatter, titleFromName, toCamelCase, toError, toFixed, toFormString, toFormStringInteger, toKebabCase, toToleranceLabel, tooltipValueFormatter, truncate, unescapeHtml, yieldToMainThread };