@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 +37 -27
- package/dist/{dimensions.utils-BSm9gmWz.d.cts → dimensions.utils-C7MsHTQd.d.cts} +1 -1
- package/dist/{dimensions.utils-BSm9gmWz.d.ts → dimensions.utils-C7MsHTQd.d.ts} +1 -1
- package/dist/index.cjs +41 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +43 -2
- package/dist/index.d.ts +43 -2
- package/dist/index.js +34 -1
- package/dist/index.js.map +1 -1
- package/dist/mime.cjs.map +1 -1
- package/dist/mime.js.map +1 -1
- package/dist/rjsf.cjs +8 -0
- package/dist/rjsf.cjs.map +1 -1
- package/dist/rjsf.d.cts +9 -2
- package/dist/rjsf.d.ts +9 -2
- package/dist/rjsf.js +8 -1
- package/dist/rjsf.js.map +1 -1
- package/dist/web.cjs.map +1 -1
- package/dist/web.d.cts +1 -1
- package/dist/web.d.ts +1 -1
- package/dist/web.js.map +1 -1
- package/package.json +63 -43
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
|
[](https://www.npmjs.com/package/@lichens-innovation/ts-common)
|
|
9
10
|
[](https://www.npmjs.com/package/@lichens-innovation/ts-common)
|
|
10
11
|
[](https://github.com/Lichens-Innovation/ts-common/actions)
|
|
11
12
|
[](LICENSE)
|
|
12
13
|
|
|
13
14
|
<!-- Tech Stack -->
|
|
15
|
+
|
|
14
16
|
[](https://www.typescriptlang.org/)
|
|
15
17
|
[](https://nodejs.org/)
|
|
16
|
-
[](https://bun.sh/)
|
|
17
19
|
|
|
18
20
|
<!-- Code Quality -->
|
|
21
|
+
|
|
19
22
|
[](https://vitest.dev/)
|
|
20
23
|
[](https://eslint.org/)
|
|
21
24
|
[](https://prettier.io/)
|
|
22
25
|
|
|
23
26
|
<!-- Standards -->
|
|
27
|
+
|
|
24
28
|
[](https://semver.org/)
|
|
25
29
|
[](https://makeapullrequest.com)
|
|
26
30
|
[](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 (
|
|
50
|
-
-
|
|
54
|
+
- Node.js (>=20.x)
|
|
55
|
+
- Bun (>=1.2.0)
|
|
51
56
|
|
|
52
57
|
## Scripts
|
|
53
58
|
|
|
54
|
-
| Command
|
|
55
|
-
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
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
|
|
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(
|
|
131
|
+
setLoggerMinimumLevel('debug');
|
|
127
132
|
|
|
128
|
-
logger.info(
|
|
129
|
-
logger.debug(
|
|
130
|
-
logger.error(
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/base64.utils.ts","../src/utils/types.utils.ts","../src/utils/chart.utils.ts","../src/utils/color.utils.ts","../src/utils/date.utils.ts","../src/utils/errors.utils.ts","../src/utils/regex.ts","../src/utils/string.utils.ts","../src/utils/filename.utils.ts","../src/utils/form.utils.ts","../src/utils/html.utils.ts","../src/utils/http.utils.ts","../src/utils/json.utils.ts","../src/utils/number.utils.ts","../src/utils/runtime-env.utils.ts","../src/utils/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 '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\n\nconst HTML_UNESCAPE_MAP: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n ''': \"'\",\n};\n\nexport const escapeHtml = (text: string): string => {\n return text.replace(/[&<>\"']/g, (char) => HTML_ESCAPE_MAP[char] ?? char);\n};\n\nexport const unescapeHtml = (text: string): string => {\n return text.replace(/&(?:amp|lt|gt|quot|#39|#x27);/g, (entity) => HTML_UNESCAPE_MAP[entity] ?? entity);\n};\n","import { isNullish } from './types.utils';\n\nexport const isHttpSuccessStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 200 && status < 300;\n};\n\nexport const isHttpClientErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 400 && status < 500;\n};\n\nexport const isHttpServerErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 500;\n};\n","export const safeJsonParse = <T>(value: string, fallback?: T): T | undefined => {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n};\n\nexport const safeJsonStringify = (obj: unknown, space: number = 2): string => {\n if (!obj) return '';\n try {\n return JSON.stringify(obj, null, space);\n } catch {\n return '';\n }\n};\n\nexport const sortObjectKeys = (_key: string, value: unknown): unknown =>\n value instanceof Object && !(value instanceof Array)\n ? Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce(\n (sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n },\n {} as Record<string, unknown>,\n )\n : value;\n\ninterface FormatJsonArgs {\n value?: string;\n space?: number;\n sortKeys?: boolean;\n}\n\nexport const formatJson = ({ value, space = 2, sortKeys = false }: FormatJsonArgs): string => {\n if (!value) return '';\n\n try {\n const obj: unknown = JSON.parse(value);\n return JSON.stringify(obj, sortKeys ? sortObjectKeys : undefined, space);\n } catch {\n return value;\n }\n};\n\nexport const prettifyJson = (value?: string): string => {\n return formatJson({ value, space: 4, sortKeys: true });\n};\n\nexport const minifyJson = (value?: string): string => {\n return formatJson({ value, space: 0, sortKeys: true });\n};\n\nexport const isValidJson = (value: string): boolean => {\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const isMinifiedJson = (value: string): boolean => {\n return value === minifyJson(value);\n};\n","import { isBlank } from './string.utils';\nimport { isNullish, isNumber } from \"./types.utils\";\n\n/**\n * Returns true if the input string is a valid number (blank and non-numeric strings are invalid).\n */\nexport const isInputValidNumber = (value: string): boolean => {\n if (isBlank(value)) return false;\n const num = Number(value.trim());\n return Number.isFinite(num);\n};\n\n/**\n * Returns true if the input string is a valid integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidInteger = (value: string): boolean => {\n if (!isInputValidNumber(value)) return false;\n const num = Number(value.trim());\n return Number.isInteger(num);\n};\n\n/**\n * Returns true if the input string is a valid positive integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidPositiveInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num > 0;\n};\n\n/**\n * Returns true if the input string is a valid negative integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidNegativeInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num < 0;\n};\n\n/**\n * Formats a number as an integer display string (removes decimals).\n */\nexport const formatIntegerDisplay = (value?: number | null): string =>\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":"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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 * Converts a string to kebab-case.\n * Handles camelCase, PascalCase, snake_case, and space-separated strings.\n *\n * @example\n * toKebabCase(\"myComponentName\") // → \"my-component-name\"\n * toKebabCase(\"XMLParser\") // → \"xml-parser\"\n */\nexport const toKebabCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase();\n};\n\n/**\n * Converts a string to camelCase.\n * Handles kebab-case, snake_case, PascalCase, and space-separated strings.\n *\n * @example\n * toCamelCase(\"my-component-name\") // → \"myComponentName\"\n * toCamelCase(\"my_snake_case\") // → \"mySnakeCase\"\n */\nexport const toCamelCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .trim()\n .replace(/[-_\\s]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n};\n\n/**\n * Converts a string to a URL-safe slug.\n * Removes diacritical marks, lowercases, replaces non-alphanumeric characters with hyphens,\n * and strips leading/trailing hyphens.\n *\n * @param value - The input string to slugify\n * @returns The slugified string\n *\n * @example\n * slugify(\"Héllo Wörld!\") // → \"hello-world\"\n * slugify(\" My Blog Post \") // → \"my-blog-post\"\n */\nexport const slugify = (value: string): string => {\n if (!value) return '';\n return removeDiacriticalMarks(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(',')\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { isBlank } from \"./string.utils\";\n\nexport const getFileExtension = (filename?: string | null): string => {\n if (isBlank(filename)) {\n return \"\";\n }\n\n const lastDotIndex = filename.lastIndexOf(\".\");\n if (lastDotIndex <= 0) {\n // No dot (-1), or dot is at start (0)\n // hidden file without extension\n return lastDotIndex === 0 ? filename.slice(1).toLowerCase() : \"\";\n }\n\n return filename.slice(lastDotIndex + 1).toLowerCase();\n};\n","import { isBlank } from \"./string.utils\";\nimport { isNullish } from \"./types.utils\";\n\nexport const parseOptionalFormNumber = (value?: string | null): number | null => {\n if (isBlank(value)) return null;\n\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n};\n\nexport const toFormString = (n?: number | null): string => {\n if (isNullish(n)) return \"\";\n\n return Number.isFinite(n) ? String(n) : \"\";\n};\n\n/**\n * Converts a number to a form string, rounded to integer.\n * Avoids floating-point display noise (e.g. 3700.0000000000005).\n */\nexport const toFormStringInteger = (n?: number | null): string => {\n if (isNullish(n)) return \"\";\n if (!Number.isFinite(n)) return \"\";\n\n return String(Math.round(n));\n};\n","const HTML_ESCAPE_MAP: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\n\nconst HTML_UNESCAPE_MAP: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n ''': \"'\",\n};\n\nexport const escapeHtml = (text: string): string => {\n return text.replace(/[&<>\"']/g, (char) => HTML_ESCAPE_MAP[char] ?? char);\n};\n\nexport const unescapeHtml = (text: string): string => {\n return text.replace(/&(?:amp|lt|gt|quot|#39|#x27);/g, (entity) => HTML_UNESCAPE_MAP[entity] ?? entity);\n};\n","import { isNullish } from './types.utils';\n\nexport const isHttpSuccessStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 200 && status < 300;\n};\n\nexport const isHttpClientErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 400 && status < 500;\n};\n\nexport const isHttpServerErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 500;\n};\n","export const safeJsonParse = <T>(value: string, fallback?: T): T | undefined => {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n};\n\nexport const safeJsonStringify = (obj: unknown, space: number = 2): string => {\n if (!obj) return '';\n try {\n return JSON.stringify(obj, null, space);\n } catch {\n return '';\n }\n};\n\nexport const sortObjectKeys = (_key: string, value: unknown): unknown =>\n value instanceof Object && !(value instanceof Array)\n ? Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce(\n (sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n },\n {} as Record<string, unknown>,\n )\n : value;\n\ninterface FormatJsonArgs {\n value?: string;\n space?: number;\n sortKeys?: boolean;\n}\n\nexport const formatJson = ({ value, space = 2, sortKeys = false }: FormatJsonArgs): string => {\n if (!value) return '';\n\n try {\n const obj: unknown = JSON.parse(value);\n return JSON.stringify(obj, sortKeys ? sortObjectKeys : undefined, space);\n } catch {\n return value;\n }\n};\n\nexport const prettifyJson = (value?: string): string => {\n return formatJson({ value, space: 4, sortKeys: true });\n};\n\nexport const minifyJson = (value?: string): string => {\n return formatJson({ value, space: 0, sortKeys: true });\n};\n\nexport const isValidJson = (value: string): boolean => {\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const isMinifiedJson = (value: string): boolean => {\n return value === minifyJson(value);\n};\n","import { isBlank } from './string.utils';\nimport { isNullish, isNumber } from './types.utils';\n\n/**\n * Returns true if the input string is a valid number (blank and non-numeric strings are invalid).\n */\nexport const isInputValidNumber = (value: string): boolean => {\n if (isBlank(value)) return false;\n const num = Number(value.trim());\n return Number.isFinite(num);\n};\n\n/**\n * Returns true if the input string is a valid integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidInteger = (value: string): boolean => {\n if (!isInputValidNumber(value)) return false;\n const num = Number(value.trim());\n return Number.isInteger(num);\n};\n\n/**\n * Returns true if the input string is a valid positive integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidPositiveInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num > 0;\n};\n\n/**\n * Returns true if the input string is a valid negative integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidNegativeInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num < 0;\n};\n\n/**\n * Formats a number as an integer display string (removes decimals).\n */\nexport const formatIntegerDisplay = (value?: number | null): string => String(toFixed(value, 0));\n\n// Example: toFixed(3.14159, 3) // 3.142\nexport const toFixed = (value?: number | null, decimals = 0): number => {\n if (isNullish(value)) return 0;\n if (decimals < 0) throw new Error('[toFixed] decimals must be >= 0');\n if (decimals === 0) return Math.round(value);\n\n const multiplier = Math.pow(10, decimals);\n return Math.round(value * multiplier) / multiplier;\n};\n\nexport const roundUpToNearest10 = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n return Math.ceil(value / 10) * 10;\n};\n\n/**\n * Format a number with K (thousands) or M (millions) suffix.\n */\nexport const formatCount = (count: number): string => {\n if (count >= 1_000_000) {\n return `${(count / 1_000_000).toFixed(1)}M`;\n }\n if (count >= 1_000) {\n return `${(count / 1_000).toFixed(1)}K`;\n }\n return count.toString();\n};\n\n/**\n * Format a duration in milliseconds to a human-readable string.\n */\nexport const formatDuration = (ms: number): string => {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n};\n\nexport const formatWithSpaceSeparator = (val?: number | string | null): string => {\n if (isNullish(val)) return '';\n return String(val).replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\\u00a0');\n};\n\nexport const parseWithSpaceSeparator = (val?: string): number => {\n return Number(val?.replace(/\\u00a0/g, ''));\n};\n\nexport const getOrderOfMagnitudeExponent = (n?: number | null): number => {\n if (isNullish(n)) return 0;\n if (!isNumber(n)) return 0;\n\n const absValue = Math.abs(n);\n if (absValue === 0) {\n return 0;\n }\n\n const integerPart = Math.floor(absValue);\n return Math.floor(Math.log10(integerPart));\n};\n","import { isNullish } from \"./types.utils\";\n\n/**\n * Returns true when running in Node.js.\n * Checks for process.versions.node to avoid false positives in Web Workers.\n */\nexport const isRuntimeEnvNodeJs = (): boolean => {\n if (typeof window !== \"undefined\") return false;\n if (typeof process === \"undefined\") return false;\n if (isNullish(process?.versions?.node)) return false;\n\n return true;\n};\n","export const firstSentence = (s: string): string => {\n const m = s.match(/^[^.!?]+[.!?]/);\n return m ? m[0].trim() : s.trim();\n};\n\ninterface TitleFromNameArgs {\n name: string;\n fallback?: string;\n}\n\nexport const titleFromName = ({ name, fallback = '' }: TitleFromNameArgs): string => {\n return (name || fallback)\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n};\n\nexport const joinOxford = (items: string[]): string => {\n if (items.length === 0) return '';\n if (items.length === 1) return items[0];\n return items.slice(0, -1).join(', ') + ' or ' + items.slice(-1)[0];\n};\n","export const sleep = (milliseconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\n\n/**\n * Yields to the main thread so the UI can process events and repaint.\n * Use during long-running synchronous work (e.g. report generation) to keep the app responsive.\n */\nexport const yieldToMainThread = (): Promise<void> => sleep(0);\n","const ONE_SECOND_IN_MS = 1000;\nconst ONE_MINUTE_IN_MS = 60 * ONE_SECOND_IN_MS;\nconst ONE_HOUR_IN_MS = 60 * ONE_MINUTE_IN_MS;\nconst ONE_DAY_IN_MS = 24 * ONE_HOUR_IN_MS;\n\nexport const PeriodsInMS = {\n oneSecond: ONE_SECOND_IN_MS,\n oneMinute: ONE_MINUTE_IN_MS,\n oneHour: ONE_HOUR_IN_MS,\n oneDay: ONE_DAY_IN_MS,\n} as const;\n","import { isNullish } from \"./types.utils\";\n\n/** m³/s to gallons per minute */\nexport const M3PS_TO_GPM = 15850.3;\n\n/** Pascals to feet of head (1 Pa = 1 N/m²) */\nexport const PA_TO_FT = 0.000334553;\n\n/** Watts to Horsepower */\nexport const W_TO_HP = 0.00134102;\n\n/** meters to inches */\nexport const M_TO_INCHES = 39.3701;\n\n/** Hz to RPM (for synchronous speed) */\nexport const HZ_TO_RPM = 60;\n\nexport const fromM3psToGPM = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * M3PS_TO_GPM;\n};\n\nexport const fromPaToFt = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * PA_TO_FT;\n};\n\nexport const fromWToHp = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * W_TO_HP;\n};\n\nexport const fromMToInches = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * M_TO_INCHES;\n};\n\nexport const fromHzToRpm = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * HZ_TO_RPM;\n};\n","import { isBlank } from \".\";\n\nexport const SCHEME_PREFIXES = {\n file: 'file',\n content: 'content',\n http: 'http',\n https: 'https',\n ftp: 'ftp',\n ftps: 'ftps',\n sftp: 'sftp',\n smb: 'smb',\n} as const;\n\nconst SCHEME_PREFIXES_ARRAY = Object.values(SCHEME_PREFIXES);\n\nexport const DATA_URI_PATTERN = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,(.+)$/;\n\nexport const isValidDataUri = (uri?: string | null): boolean => {\n if (isBlank(uri)) {\n return false;\n }\n\n return DATA_URI_PATTERN.test(uri);\n};\n\nexport const hasScheme = (uri?: string | null): boolean => {\n if (!uri) {\n return false;\n }\n\n const lowerUri = uri.toLowerCase();\n return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));\n};\n\n/**\n * Extracts the base64 data from a data URI string.\n * Data URIs have the format: data:[<mediatype>][;base64],<data>\n * This function extracts everything after the first comma.\n *\n * @param dataUri - The data URI string (e.g., \"data:image/png;base64,iVBORw0KG...\")\n * @returns The base64 data without the data URI prefix, or the original string if no comma is found\n */\nexport const extractBase64FromDataUri = (dataUri: string): string => {\n return dataUri.split(',')[1] ?? dataUri;\n};\n\nexport const encodeUrl = (value?: string): string => {\n if (!value) return '';\n return encodeURIComponent(value);\n};\n\nexport const decodeUrl = (value?: string): string => {\n if (!value) return '';\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\ninterface FormatDataUriArgs {\n mimeType: string;\n base64: string;\n}\n\nexport const formatDataUri = ({ mimeType, base64 }: FormatDataUriArgs): string => {\n return `data:${mimeType};base64,${base64}`;\n};\n\nexport const getBase64ApproxSize = (base64: string): number => {\n return Math.round((base64.length * 3) / 4);\n};\n","import { isNullish } from \"./types.utils\";\n\nconst WEBSOCKET_CONNECT_STATES: number[] = [WebSocket.CONNECTING, WebSocket.OPEN] as const;\n\nexport const isWsClosable = (ws?: WebSocket | null): ws is WebSocket => {\n if (isNullish(ws)) return false;\n return WEBSOCKET_CONNECT_STATES.includes(ws.readyState);\n};\n\nexport const isWsOpenOrConnecting = (ws?: WebSocket | null): ws is WebSocket => {\n if (isNullish(ws)) return false;\n return WEBSOCKET_CONNECT_STATES.includes(ws.readyState);\n};\n\nexport const closeWebSocket = (ws?: WebSocket | null) => {\n if (isNullish(ws) || !isWsClosable(ws)) return;\n\n try {\n ws.close();\n } catch {\n // do nothing (best effort to close, ignore unexpected errors)\n }\n};\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { D as Dimensions, N as NormalizedRgb, R as RgbColor, a as RgbaColor,
|
|
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 };
|