yummies 7.11.0 → 7.12.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.
Files changed (146) hide show
  1. package/async.cjs +162 -48
  2. package/async.cjs.map +1 -1
  3. package/async.d.ts +108 -7
  4. package/async.js +163 -54
  5. package/async.js.map +1 -1
  6. package/chunk-CVq3Gv4J.cjs +50 -0
  7. package/chunk-YKewjYmz.js +37 -0
  8. package/common.cjs +48 -8
  9. package/common.cjs.map +1 -1
  10. package/common.d.ts +35 -2
  11. package/common.js +49 -11
  12. package/common.js.map +1 -1
  13. package/complex.cjs +275 -128
  14. package/complex.cjs.map +1 -1
  15. package/complex.js +275 -133
  16. package/complex.js.map +1 -1
  17. package/cookie.cjs +17 -7
  18. package/cookie.cjs.map +1 -1
  19. package/cookie.d.ts +8 -0
  20. package/cookie.js +18 -9
  21. package/cookie.js.map +1 -1
  22. package/css.cjs +147 -39
  23. package/css.cjs.map +1 -1
  24. package/css.d.ts +98 -6
  25. package/css.js +143 -41
  26. package/css.js.map +1 -1
  27. package/data.cjs +90 -55
  28. package/data.cjs.map +1 -1
  29. package/data.d.ts +32 -0
  30. package/data.js +91 -61
  31. package/data.js.map +1 -1
  32. package/date-time.cjs +578 -412
  33. package/date-time.cjs.map +1 -1
  34. package/date-time.d.ts +88 -0
  35. package/date-time.js +575 -421
  36. package/date-time.js.map +1 -1
  37. package/device.cjs +48 -23
  38. package/device.cjs.map +1 -1
  39. package/device.d.ts +32 -0
  40. package/device.js +49 -31
  41. package/device.js.map +1 -1
  42. package/encodings.cjs +275 -266
  43. package/encodings.cjs.map +1 -1
  44. package/encodings.d.ts +8 -0
  45. package/encodings.js +276 -268
  46. package/encodings.js.map +1 -1
  47. package/errors.cjs +20 -18
  48. package/errors.cjs.map +1 -1
  49. package/errors.js +19 -19
  50. package/errors.js.map +1 -1
  51. package/file.cjs +42 -24
  52. package/file.cjs.map +1 -1
  53. package/file.d.ts +16 -0
  54. package/file.js +43 -27
  55. package/file.js.map +1 -1
  56. package/format.cjs +125 -83
  57. package/format.cjs.map +1 -1
  58. package/format.js +118 -82
  59. package/format.js.map +1 -1
  60. package/html.cjs +226 -137
  61. package/html.cjs.map +1 -1
  62. package/html.d.ts +64 -0
  63. package/html.js +223 -150
  64. package/html.js.map +1 -1
  65. package/id.cjs +74 -17
  66. package/id.cjs.map +1 -1
  67. package/id.js +73 -24
  68. package/id.js.map +1 -1
  69. package/imports.cjs +41 -29
  70. package/imports.cjs.map +1 -1
  71. package/imports.d.ts +8 -0
  72. package/imports.js +40 -31
  73. package/imports.js.map +1 -1
  74. package/math.cjs +32 -6
  75. package/math.cjs.map +1 -1
  76. package/math.d.ts +16 -0
  77. package/math.js +33 -10
  78. package/math.js.map +1 -1
  79. package/media.cjs +275 -84
  80. package/media.cjs.map +1 -1
  81. package/media.d.ts +188 -2
  82. package/media.js +274 -93
  83. package/media.js.map +1 -1
  84. package/mobx.cjs +353 -193
  85. package/mobx.cjs.map +1 -1
  86. package/mobx.d.ts +7 -0
  87. package/mobx.js +351 -200
  88. package/mobx.js.map +1 -1
  89. package/ms.cjs +21 -10
  90. package/ms.cjs.map +1 -1
  91. package/ms.js +22 -13
  92. package/ms.js.map +1 -1
  93. package/number.cjs +13 -7
  94. package/number.cjs.map +1 -1
  95. package/number.js +14 -9
  96. package/number.js.map +1 -1
  97. package/package.json +10 -2
  98. package/parser.cjs +117 -64
  99. package/parser.cjs.map +1 -1
  100. package/parser.js +111 -64
  101. package/parser.js.map +1 -1
  102. package/price.cjs +24 -18
  103. package/price.cjs.map +1 -1
  104. package/price.d.ts +8 -0
  105. package/price.js +25 -20
  106. package/price.js.map +1 -1
  107. package/random.cjs +79 -13
  108. package/random.cjs.map +1 -1
  109. package/random.d.ts +64 -0
  110. package/random.js +80 -22
  111. package/random.js.map +1 -1
  112. package/react.cjs +673 -214
  113. package/react.cjs.map +1 -1
  114. package/react.d.ts +21 -0
  115. package/react.js +674 -239
  116. package/react.js.map +1 -1
  117. package/sound.cjs +14 -9
  118. package/sound.cjs.map +1 -1
  119. package/sound.js +15 -11
  120. package/sound.js.map +1 -1
  121. package/storage.cjs +49 -50
  122. package/storage.cjs.map +1 -1
  123. package/storage.d.ts +8 -0
  124. package/storage.js +50 -53
  125. package/storage.js.map +1 -1
  126. package/text.cjs +51 -34
  127. package/text.cjs.map +1 -1
  128. package/text.js +52 -37
  129. package/text.js.map +1 -1
  130. package/type-guard.cjs +292 -72
  131. package/type-guard.cjs.map +1 -1
  132. package/type-guard.js +288 -73
  133. package/type-guard.js.map +1 -1
  134. package/types.cjs +0 -2
  135. package/types.global.cjs +0 -2
  136. package/types.global.js +0 -2
  137. package/types.js +0 -2
  138. package/vibrate.cjs +31 -6
  139. package/vibrate.cjs.map +1 -1
  140. package/vibrate.d.ts +23 -1
  141. package/vibrate.js +32 -8
  142. package/vibrate.js.map +1 -1
  143. package/types.cjs.map +0 -1
  144. package/types.global.cjs.map +0 -1
  145. package/types.global.js.map +0 -1
  146. package/types.js.map +0 -1
package/errors.js CHANGED
@@ -1,24 +1,24 @@
1
1
  import { typeGuard } from "yummies/type-guard";
2
- const getErrorText = (error) => {
3
- if (!error) {
4
- return getErrorText.unknownErrorText;
5
- }
6
- if (typeGuard.isString(error)) {
7
- return error || getErrorText.unknownErrorText;
8
- }
9
- if (error instanceof Error) {
10
- return (getErrorText.formatError?.(error) ?? error.message) || getErrorText.unknownErrorText;
11
- }
12
- if (getErrorText.enhance) {
13
- return getErrorText.enhance(error) ?? getErrorText.unknownErrorText;
14
- } else {
15
- return getErrorText.unknownErrorText;
16
- }
2
+ //#region src/errors.ts
3
+ /**
4
+ * Universal function for transforming any errors into readable error text
5
+ *
6
+ * This function can be enhanced with custom handlers using:
7
+ * - `getErrorText.unknownErrorText`
8
+ * - `getErrorText.formatError`
9
+ * - `getErrorText.enhance`
10
+ */
11
+ var getErrorText = (error) => {
12
+ if (!error) return getErrorText.unknownErrorText;
13
+ if (typeGuard.isString(error)) return error || getErrorText.unknownErrorText;
14
+ if (error instanceof Error) return (getErrorText.formatError?.(error) ?? error.message) || getErrorText.unknownErrorText;
15
+ if (getErrorText.enhance) return getErrorText.enhance(error) ?? getErrorText.unknownErrorText;
16
+ else return getErrorText.unknownErrorText;
17
17
  };
18
18
  getErrorText.unknownErrorText = "";
19
19
  getErrorText.formatError = null;
20
20
  getErrorText.enhance = null;
21
- export {
22
- getErrorText
23
- };
24
- //# sourceMappingURL=errors.js.map
21
+ //#endregion
22
+ export { getErrorText };
23
+
24
+ //# sourceMappingURL=errors.js.map
package/errors.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sources":["../src/errors.ts"],"sourcesContent":["import { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/types';\n\ntype GetErrorTextEnhancer = (error: any) => string;\ntype GetErrorTextFormatErrorFn = (error: Error) => string;\n\n/**\n * Universal function for transforming any errors into readable error text\n *\n * This function can be enhanced with custom handlers using:\n * - `getErrorText.unknownErrorText`\n * - `getErrorText.formatError`\n * - `getErrorText.enhance`\n */\nexport const getErrorText = (error: unknown) => {\n if (!error) {\n return getErrorText.unknownErrorText;\n }\n\n if (typeGuard.isString(error)) {\n return error || getErrorText.unknownErrorText;\n }\n\n if (error instanceof Error) {\n return (\n (getErrorText.formatError?.(error) ?? error.message) ||\n getErrorText.unknownErrorText\n );\n }\n\n if (getErrorText.enhance) {\n return getErrorText.enhance(error) ?? getErrorText.unknownErrorText;\n } else {\n return getErrorText.unknownErrorText;\n }\n};\n\ngetErrorText.unknownErrorText = '';\ngetErrorText.formatError = null as Maybe<GetErrorTextFormatErrorFn>;\ngetErrorText.enhance = null as Maybe<GetErrorTextEnhancer>;\n"],"names":[],"mappings":";AAcO,MAAM,eAAe,CAAC,UAAmB;AAC9C,MAAI,CAAC,OAAO;AACV,WAAO,aAAa;AAAA,EACtB;AAEA,MAAI,UAAU,SAAS,KAAK,GAAG;AAC7B,WAAO,SAAS,aAAa;AAAA,EAC/B;AAEA,MAAI,iBAAiB,OAAO;AAC1B,YACG,aAAa,cAAc,KAAK,KAAK,MAAM,YAC5C,aAAa;AAAA,EAEjB;AAEA,MAAI,aAAa,SAAS;AACxB,WAAO,aAAa,QAAQ,KAAK,KAAK,aAAa;AAAA,EACrD,OAAO;AACL,WAAO,aAAa;AAAA,EACtB;AACF;AAEA,aAAa,mBAAmB;AAChC,aAAa,cAAc;AAC3B,aAAa,UAAU;"}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/types';\n\ntype GetErrorTextEnhancer = (error: any) => string;\ntype GetErrorTextFormatErrorFn = (error: Error) => string;\n\n/**\n * Universal function for transforming any errors into readable error text\n *\n * This function can be enhanced with custom handlers using:\n * - `getErrorText.unknownErrorText`\n * - `getErrorText.formatError`\n * - `getErrorText.enhance`\n */\nexport const getErrorText = (error: unknown) => {\n if (!error) {\n return getErrorText.unknownErrorText;\n }\n\n if (typeGuard.isString(error)) {\n return error || getErrorText.unknownErrorText;\n }\n\n if (error instanceof Error) {\n return (\n (getErrorText.formatError?.(error) ?? error.message) ||\n getErrorText.unknownErrorText\n );\n }\n\n if (getErrorText.enhance) {\n return getErrorText.enhance(error) ?? getErrorText.unknownErrorText;\n } else {\n return getErrorText.unknownErrorText;\n }\n};\n\ngetErrorText.unknownErrorText = '';\ngetErrorText.formatError = null as Maybe<GetErrorTextFormatErrorFn>;\ngetErrorText.enhance = null as Maybe<GetErrorTextEnhancer>;\n"],"mappings":";;;;;;;;;;AAcA,IAAa,gBAAgB,UAAmB;AAC9C,KAAI,CAAC,MACH,QAAO,aAAa;AAGtB,KAAI,UAAU,SAAS,MAAM,CAC3B,QAAO,SAAS,aAAa;AAG/B,KAAI,iBAAiB,MACnB,SACG,aAAa,cAAc,MAAM,IAAI,MAAM,YAC5C,aAAa;AAIjB,KAAI,aAAa,QACf,QAAO,aAAa,QAAQ,MAAM,IAAI,aAAa;KAEnD,QAAO,aAAa;;AAIxB,aAAa,mBAAmB;AAChC,aAAa,cAAc;AAC3B,aAAa,UAAU"}
package/file.cjs CHANGED
@@ -1,29 +1,47 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const getBase64FromFile = (file) => {
4
- return new Promise((resolve, reject) => {
5
- const reader = new FileReader();
6
- reader.readAsDataURL(file);
7
- reader.onload = () => {
8
- resolve(reader.result.toString());
9
- };
10
- reader.onerror = (error) => {
11
- reject(error);
12
- };
13
- });
2
+ //#region src/file.ts
3
+ /**
4
+ * Reads a file as a Base64 data URL.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const value = await getBase64FromFile(file);
9
+ * ```
10
+ */
11
+ var getBase64FromFile = (file) => {
12
+ return new Promise((resolve, reject) => {
13
+ const reader = new FileReader();
14
+ reader.readAsDataURL(file);
15
+ reader.onload = () => {
16
+ resolve(reader.result.toString());
17
+ };
18
+ reader.onerror = (error) => {
19
+ reject(error);
20
+ };
21
+ });
14
22
  };
15
- const getTextFromFile = (file, encoding) => {
16
- return new Promise((resolve, reject) => {
17
- const reader = new FileReader();
18
- reader.readAsText(file, encoding);
19
- reader.onload = () => {
20
- resolve(reader.result.toString());
21
- };
22
- reader.onerror = (error) => {
23
- reject(error);
24
- };
25
- });
23
+ /**
24
+ * Reads a file as text using the provided encoding.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * const text = await getTextFromFile(file, 'utf-8');
29
+ * ```
30
+ */
31
+ var getTextFromFile = (file, encoding) => {
32
+ return new Promise((resolve, reject) => {
33
+ const reader = new FileReader();
34
+ reader.readAsText(file, encoding);
35
+ reader.onload = () => {
36
+ resolve(reader.result.toString());
37
+ };
38
+ reader.onerror = (error) => {
39
+ reject(error);
40
+ };
41
+ });
26
42
  };
43
+ //#endregion
27
44
  exports.getBase64FromFile = getBase64FromFile;
28
45
  exports.getTextFromFile = getTextFromFile;
29
- //# sourceMappingURL=file.cjs.map
46
+
47
+ //# sourceMappingURL=file.cjs.map
package/file.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"file.cjs","sources":["../src/file.ts"],"sourcesContent":["export const getBase64FromFile = (file: File) => {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => {\n resolve(reader.result!.toString());\n };\n reader.onerror = (error) => {\n reject(error);\n };\n });\n};\n\nexport const getTextFromFile = (file: File, encoding?: string) => {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsText(file, encoding);\n reader.onload = () => {\n resolve(reader.result!.toString());\n };\n reader.onerror = (error) => {\n reject(error);\n };\n });\n};\n"],"names":[],"mappings":";;AAAO,MAAM,oBAAoB,CAAC,SAAe;AAC/C,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,UAAM,SAAS,IAAI,WAAA;AACnB,WAAO,cAAc,IAAI;AACzB,WAAO,SAAS,MAAM;AACpB,cAAQ,OAAO,OAAQ,UAAU;AAAA,IACnC;AACA,WAAO,UAAU,CAAC,UAAU;AAC1B,aAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAEO,MAAM,kBAAkB,CAAC,MAAY,aAAsB;AAChE,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,UAAM,SAAS,IAAI,WAAA;AACnB,WAAO,WAAW,MAAM,QAAQ;AAChC,WAAO,SAAS,MAAM;AACpB,cAAQ,OAAO,OAAQ,UAAU;AAAA,IACnC;AACA,WAAO,UAAU,CAAC,UAAU;AAC1B,aAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACH;;;"}
1
+ {"version":3,"file":"file.cjs","names":[],"sources":["../src/file.ts"],"sourcesContent":["/**\n * Reads a file as a Base64 data URL.\n *\n * @example\n * ```ts\n * const value = await getBase64FromFile(file);\n * ```\n */\nexport const getBase64FromFile = (file: File) => {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => {\n resolve(reader.result!.toString());\n };\n reader.onerror = (error) => {\n reject(error);\n };\n });\n};\n\n/**\n * Reads a file as text using the provided encoding.\n *\n * @example\n * ```ts\n * const text = await getTextFromFile(file, 'utf-8');\n * ```\n */\nexport const getTextFromFile = (file: File, encoding?: string) => {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsText(file, encoding);\n reader.onload = () => {\n resolve(reader.result!.toString());\n };\n reader.onerror = (error) => {\n reject(error);\n };\n });\n};\n"],"mappings":";;;;;;;;;;AAQA,IAAa,qBAAqB,SAAe;AAC/C,QAAO,IAAI,SAAiB,SAAS,WAAW;EAC9C,MAAM,SAAS,IAAI,YAAY;AAC/B,SAAO,cAAc,KAAK;AAC1B,SAAO,eAAe;AACpB,WAAQ,OAAO,OAAQ,UAAU,CAAC;;AAEpC,SAAO,WAAW,UAAU;AAC1B,UAAO,MAAM;;GAEf;;;;;;;;;;AAWJ,IAAa,mBAAmB,MAAY,aAAsB;AAChE,QAAO,IAAI,SAAiB,SAAS,WAAW;EAC9C,MAAM,SAAS,IAAI,YAAY;AAC/B,SAAO,WAAW,MAAM,SAAS;AACjC,SAAO,eAAe;AACpB,WAAQ,OAAO,OAAQ,UAAU,CAAC;;AAEpC,SAAO,WAAW,UAAU;AAC1B,UAAO,MAAM;;GAEf"}
package/file.d.ts CHANGED
@@ -1,4 +1,20 @@
1
+ /**
2
+ * Reads a file as a Base64 data URL.
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * const value = await getBase64FromFile(file);
7
+ * ```
8
+ */
1
9
  declare const getBase64FromFile: (file: File) => Promise<string>;
10
+ /**
11
+ * Reads a file as text using the provided encoding.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const text = await getTextFromFile(file, 'utf-8');
16
+ * ```
17
+ */
2
18
  declare const getTextFromFile: (file: File, encoding?: string) => Promise<string>;
3
19
 
4
20
  export { getBase64FromFile, getTextFromFile };
package/file.js CHANGED
@@ -1,29 +1,45 @@
1
- const getBase64FromFile = (file) => {
2
- return new Promise((resolve, reject) => {
3
- const reader = new FileReader();
4
- reader.readAsDataURL(file);
5
- reader.onload = () => {
6
- resolve(reader.result.toString());
7
- };
8
- reader.onerror = (error) => {
9
- reject(error);
10
- };
11
- });
1
+ //#region src/file.ts
2
+ /**
3
+ * Reads a file as a Base64 data URL.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * const value = await getBase64FromFile(file);
8
+ * ```
9
+ */
10
+ var getBase64FromFile = (file) => {
11
+ return new Promise((resolve, reject) => {
12
+ const reader = new FileReader();
13
+ reader.readAsDataURL(file);
14
+ reader.onload = () => {
15
+ resolve(reader.result.toString());
16
+ };
17
+ reader.onerror = (error) => {
18
+ reject(error);
19
+ };
20
+ });
12
21
  };
13
- const getTextFromFile = (file, encoding) => {
14
- return new Promise((resolve, reject) => {
15
- const reader = new FileReader();
16
- reader.readAsText(file, encoding);
17
- reader.onload = () => {
18
- resolve(reader.result.toString());
19
- };
20
- reader.onerror = (error) => {
21
- reject(error);
22
- };
23
- });
22
+ /**
23
+ * Reads a file as text using the provided encoding.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * const text = await getTextFromFile(file, 'utf-8');
28
+ * ```
29
+ */
30
+ var getTextFromFile = (file, encoding) => {
31
+ return new Promise((resolve, reject) => {
32
+ const reader = new FileReader();
33
+ reader.readAsText(file, encoding);
34
+ reader.onload = () => {
35
+ resolve(reader.result.toString());
36
+ };
37
+ reader.onerror = (error) => {
38
+ reject(error);
39
+ };
40
+ });
24
41
  };
25
- export {
26
- getBase64FromFile,
27
- getTextFromFile
28
- };
29
- //# sourceMappingURL=file.js.map
42
+ //#endregion
43
+ export { getBase64FromFile, getTextFromFile };
44
+
45
+ //# sourceMappingURL=file.js.map
package/file.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","sources":["../src/file.ts"],"sourcesContent":["export const getBase64FromFile = (file: File) => {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => {\n resolve(reader.result!.toString());\n };\n reader.onerror = (error) => {\n reject(error);\n };\n });\n};\n\nexport const getTextFromFile = (file: File, encoding?: string) => {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsText(file, encoding);\n reader.onload = () => {\n resolve(reader.result!.toString());\n };\n reader.onerror = (error) => {\n reject(error);\n };\n });\n};\n"],"names":[],"mappings":"AAAO,MAAM,oBAAoB,CAAC,SAAe;AAC/C,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,UAAM,SAAS,IAAI,WAAA;AACnB,WAAO,cAAc,IAAI;AACzB,WAAO,SAAS,MAAM;AACpB,cAAQ,OAAO,OAAQ,UAAU;AAAA,IACnC;AACA,WAAO,UAAU,CAAC,UAAU;AAC1B,aAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAEO,MAAM,kBAAkB,CAAC,MAAY,aAAsB;AAChE,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,UAAM,SAAS,IAAI,WAAA;AACnB,WAAO,WAAW,MAAM,QAAQ;AAChC,WAAO,SAAS,MAAM;AACpB,cAAQ,OAAO,OAAQ,UAAU;AAAA,IACnC;AACA,WAAO,UAAU,CAAC,UAAU;AAC1B,aAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACH;"}
1
+ {"version":3,"file":"file.js","names":[],"sources":["../src/file.ts"],"sourcesContent":["/**\n * Reads a file as a Base64 data URL.\n *\n * @example\n * ```ts\n * const value = await getBase64FromFile(file);\n * ```\n */\nexport const getBase64FromFile = (file: File) => {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => {\n resolve(reader.result!.toString());\n };\n reader.onerror = (error) => {\n reject(error);\n };\n });\n};\n\n/**\n * Reads a file as text using the provided encoding.\n *\n * @example\n * ```ts\n * const text = await getTextFromFile(file, 'utf-8');\n * ```\n */\nexport const getTextFromFile = (file: File, encoding?: string) => {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsText(file, encoding);\n reader.onload = () => {\n resolve(reader.result!.toString());\n };\n reader.onerror = (error) => {\n reject(error);\n };\n });\n};\n"],"mappings":";;;;;;;;;AAQA,IAAa,qBAAqB,SAAe;AAC/C,QAAO,IAAI,SAAiB,SAAS,WAAW;EAC9C,MAAM,SAAS,IAAI,YAAY;AAC/B,SAAO,cAAc,KAAK;AAC1B,SAAO,eAAe;AACpB,WAAQ,OAAO,OAAQ,UAAU,CAAC;;AAEpC,SAAO,WAAW,UAAU;AAC1B,UAAO,MAAM;;GAEf;;;;;;;;;;AAWJ,IAAa,mBAAmB,MAAY,aAAsB;AAChE,QAAO,IAAI,SAAiB,SAAS,WAAW;EAC9C,MAAM,SAAS,IAAI,YAAY;AAC/B,SAAO,WAAW,MAAM,SAAS;AACjC,SAAO,eAAe;AACpB,WAAQ,OAAO,OAAQ,UAAU,CAAC;;AAEpC,SAAO,WAAW,UAAU;AAC1B,UAAO,MAAM;;GAEf"}
package/format.cjs CHANGED
@@ -1,87 +1,129 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const parser = require("yummies/parser");
4
- const typeGuard = require("yummies/type-guard");
5
- const NO_VALUE = "";
6
- const HYPHEN = "-";
7
- const INFINITY = "∞";
8
- const number = (rawValue, userSettings) => {
9
- const settings = {
10
- ...number.defaultSettings,
11
- ...userSettings
12
- };
13
- const digits = settings.digits ?? 0;
14
- const cutZeros = settings?.cutZeros ?? false;
15
- const delimiter = settings.delimiter ?? " ";
16
- const postfix = settings.postfix ?? "";
17
- const emptyText = settings.emptyText ?? NO_VALUE;
18
- const digitsOnlyForFloat = settings.digitsOnlyForFloat ?? true;
19
- let value;
20
- if (typeGuard.typeGuard.isString(rawValue)) {
21
- value = parser.parser.number(value, { fallback: void 0 });
22
- } else {
23
- value = rawValue;
24
- }
25
- if (typeGuard.typeGuard.isNumber(value)) {
26
- let raw = `${value}`;
27
- if (digits !== false) {
28
- if (settings.cropDigitsOnly) {
29
- const [integerPart2, decimalPart2] = `${raw}`.split(".");
30
- const leftPart = integerPart2;
31
- const rightPart = (decimalPart2 || "").slice(0, digits).padEnd(digits, "0");
32
- if (rightPart) {
33
- raw = `${leftPart}.${rightPart}`;
34
- } else {
35
- raw = leftPart;
36
- }
37
- } else {
38
- raw = value.toFixed(digits);
39
- }
40
- }
41
- if (cutZeros) {
42
- raw = `${+raw}`;
43
- }
44
- const [integerPart, decimalPart] = raw.split(".", 2);
45
- let formattedIntegerPart = integerPart;
46
- let formattedDecimalPart = "";
47
- if (decimalPart && (!digitsOnlyForFloat || !/^0+$/.test(decimalPart))) {
48
- formattedDecimalPart = `.${decimalPart}`;
49
- }
50
- const rgx = /(\d+)(\d{3})/;
51
- while (rgx.test(formattedIntegerPart) && delimiter) {
52
- formattedIntegerPart = formattedIntegerPart.replace(
53
- rgx,
54
- `$1${delimiter}$2`
55
- );
56
- }
57
- return formattedIntegerPart + formattedDecimalPart + postfix;
58
- }
59
- return emptyText;
2
+ const require_chunk = require("./chunk-CVq3Gv4J.cjs");
3
+ let yummies_parser = require("yummies/parser");
4
+ let yummies_type_guard = require("yummies/type-guard");
5
+ //#region src/format/number.ts
6
+ /**
7
+ * Formats a numeric value with thousands separators, fractional digit control
8
+ * and optional postfix text.
9
+ *
10
+ * Invalid, empty or unsupported values fall back to `emptyText`.
11
+ *
12
+ * @param rawValue Number or numeric string to format.
13
+ * @param userSettings Formatting overrides merged with `number.defaultSettings`.
14
+ * @returns Formatted number string or fallback text.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * number(12000); // '12 000'
19
+ * ```
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * number(12.5, { digits: 1, postfix: '%' }); // '12.5%'
24
+ * ```
25
+ */
26
+ var number = (rawValue, userSettings) => {
27
+ const settings = {
28
+ ...number.defaultSettings,
29
+ ...userSettings
30
+ };
31
+ const digits = settings.digits ?? 0;
32
+ const cutZeros = settings?.cutZeros ?? false;
33
+ const delimiter = settings.delimiter ?? " ";
34
+ const postfix = settings.postfix ?? "";
35
+ const emptyText = settings.emptyText ?? "–";
36
+ const digitsOnlyForFloat = settings.digitsOnlyForFloat ?? true;
37
+ let value;
38
+ if (yummies_type_guard.typeGuard.isString(rawValue)) value = yummies_parser.parser.number(value, { fallback: void 0 });
39
+ else value = rawValue;
40
+ if (yummies_type_guard.typeGuard.isNumber(value)) {
41
+ let raw = `${value}`;
42
+ if (digits !== false) if (settings.cropDigitsOnly) {
43
+ const [integerPart, decimalPart] = `${raw}`.split(".");
44
+ const leftPart = integerPart;
45
+ const rightPart = (decimalPart || "").slice(0, digits).padEnd(digits, "0");
46
+ if (rightPart) raw = `${leftPart}.${rightPart}`;
47
+ else raw = leftPart;
48
+ } else raw = value.toFixed(digits);
49
+ if (cutZeros) raw = `${+raw}`;
50
+ const [integerPart, decimalPart] = raw.split(".", 2);
51
+ let formattedIntegerPart = integerPart;
52
+ let formattedDecimalPart = "";
53
+ if (decimalPart && (!digitsOnlyForFloat || !/^0+$/.test(decimalPart))) formattedDecimalPart = `.${decimalPart}`;
54
+ const rgx = /(\d+)(\d{3})/;
55
+ while (rgx.test(formattedIntegerPart) && delimiter) formattedIntegerPart = formattedIntegerPart.replace(rgx, `$1${delimiter}$2`);
56
+ return formattedIntegerPart + formattedDecimalPart + postfix;
57
+ }
58
+ return emptyText;
60
59
  };
61
60
  number.defaultSettings = {};
62
- const percent = (value, settings) => {
63
- const numericValue = parser.parser.number(value, {
64
- ...settings,
65
- digits: settings?.digits ?? 2,
66
- fallback: Number.NaN
67
- });
68
- if (typeGuard.typeGuard.isNumber(numericValue)) {
69
- const divider = settings?.divider ?? ".";
70
- const formattedPercent = divider === "." ? numericValue : `${numericValue}`.replace(".", divider);
71
- return `${formattedPercent}${settings?.delimiter ?? ""}${settings?.symbol ?? "%"}`;
72
- } else {
73
- return settings?.emptyText ?? NO_VALUE;
74
- }
61
+ //#endregion
62
+ //#region src/format/percent.ts
63
+ /**
64
+ * Formats a value as a percent string with configurable decimal precision,
65
+ * decimal divider and suffix symbol.
66
+ *
67
+ * @param value Number or numeric string to format.
68
+ * @param settings Parser and formatting options.
69
+ * @returns Formatted percent string or fallback text for invalid values.
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * percent(12.345); // '12.35%'
74
+ * ```
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * percent(12.345, { divider: ',', symbol: ' pct' }); // '12,35 pct'
79
+ * ```
80
+ */
81
+ var percent = (value, settings) => {
82
+ const numericValue = yummies_parser.parser.number(value, {
83
+ ...settings,
84
+ digits: settings?.digits ?? 2,
85
+ fallback: NaN
86
+ });
87
+ if (yummies_type_guard.typeGuard.isNumber(numericValue)) {
88
+ const divider = settings?.divider ?? ".";
89
+ return `${divider === "." ? numericValue : `${numericValue}`.replace(".", divider)}${settings?.delimiter ?? ""}${settings?.symbol ?? "%"}`;
90
+ } else return settings?.emptyText ?? "–";
75
91
  };
76
- const skipSpaces = (value) => value.replaceAll(/\s/g, "");
77
- const _exports = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
78
- __proto__: null,
79
- HYPHEN,
80
- INFINITY,
81
- NO_VALUE,
82
- number,
83
- percent,
84
- skipSpaces
85
- }, Symbol.toStringTag, { value: "Module" }));
86
- exports.format = _exports;
87
- //# sourceMappingURL=format.cjs.map
92
+ //#endregion
93
+ //#region src/format/skip-spaces.ts
94
+ /**
95
+ * Removes all whitespace characters from a string.
96
+ *
97
+ * @param value Source string.
98
+ * @returns String without spaces, tabs and line breaks.
99
+ *
100
+ * @example
101
+ * ```ts
102
+ * skipSpaces('1 000 000'); // '1000000'
103
+ * ```
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * skipSpaces('a\tb\nc'); // 'abc'
108
+ * ```
109
+ */
110
+ var skipSpaces = (value) => value.replaceAll(/\s/g, "");
111
+ //#endregion
112
+ //#region src/format/_exports.ts
113
+ var _exports_exports = /* @__PURE__ */ require_chunk.__exportAll({
114
+ HYPHEN: () => "-",
115
+ INFINITY: () => "∞",
116
+ NO_VALUE: () => "–",
117
+ number: () => number,
118
+ percent: () => percent,
119
+ skipSpaces: () => skipSpaces
120
+ });
121
+ //#endregion
122
+ Object.defineProperty(exports, "format", {
123
+ enumerable: true,
124
+ get: function() {
125
+ return _exports_exports;
126
+ }
127
+ });
128
+
129
+ //# sourceMappingURL=format.cjs.map
package/format.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"format.cjs","sources":["../src/format/constants.ts","../src/format/number.ts","../src/format/percent.ts","../src/format/skip-spaces.ts"],"sourcesContent":["/**\n * Placeholder shown when a formatter cannot produce a meaningful value.\n *\n * @example\n * ```ts\n * const fallback = NO_VALUE;\n * ```\n *\n * @example\n * ```ts\n * format.number(null, { emptyText: NO_VALUE });\n * ```\n */\nexport const NO_VALUE = '–'; // en-dash\n\n/**\n * Plain ASCII hyphen character.\n *\n * @example\n * ```ts\n * const separator = HYPHEN;\n * ```\n *\n * @example\n * ```ts\n * `foo${HYPHEN}bar`;\n * ```\n */\nexport const HYPHEN = '-';\n\n/**\n * Infinity symbol used by numeric formatters and UI output.\n *\n * @example\n * ```ts\n * const label = INFINITY;\n * ```\n *\n * @example\n * ```ts\n * `${INFINITY} items`;\n * ```\n */\nexport const INFINITY = '∞';\n","import { parser } from 'yummies/parser';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/types';\nimport { NO_VALUE } from './constants.js';\n\nexport interface NumberFormatSettings {\n delimiter?: string;\n /**\n * digitsOnlyForFloat - Show digits after decimal point only if they are not zeros after converting to number.\n * Example: \"0.00\" -> \"0\", \"0.10\" -> \"0.1\", but \"0.003\" -> \"0.003\"\n *\n * @default true\n */\n digitsOnlyForFloat?: boolean;\n /**\n * Text which will be returned if the value is undefined, null, NaN, Infinity or empty string.\n * Example: \"–\" will be returned if the value is undefined and emptyText is \"–\".\n */\n emptyText?: string;\n /**\n * Text to append to the end of the formatted number.\n * Example: if value is 1000 and postfix is \"₽\", result will be \"1 000₽\".\n */\n postfix?: string;\n /**\n * Fixed number of digits after the decimal point (number.toFixed() method)\n * If set to false, the truncation is ignored!\n */\n digits?: number | false;\n /**\n * Remove trailing zeros from the end of the number\n * Example: 0.010000000000000000000000000000000000000000000 -> 0.01\n */\n cutZeros?: boolean;\n cropDigitsOnly?: boolean;\n}\n\n/**\n * Formats a numeric value with thousands separators, fractional digit control\n * and optional postfix text.\n *\n * Invalid, empty or unsupported values fall back to `emptyText`.\n *\n * @param rawValue Number or numeric string to format.\n * @param userSettings Formatting overrides merged with `number.defaultSettings`.\n * @returns Formatted number string or fallback text.\n *\n * @example\n * ```ts\n * number(12000); // '12 000'\n * ```\n *\n * @example\n * ```ts\n * number(12.5, { digits: 1, postfix: '%' }); // '12.5%'\n * ```\n */\nexport const number = (\n rawValue: Maybe<string | number>,\n userSettings?: Maybe<NumberFormatSettings>,\n): string => {\n const settings = {\n ...number.defaultSettings,\n ...userSettings,\n };\n\n const digits = settings.digits ?? 0;\n const cutZeros = settings?.cutZeros ?? false;\n const delimiter = settings.delimiter ?? ' ';\n const postfix = settings.postfix ?? '';\n const emptyText = settings.emptyText ?? NO_VALUE;\n const digitsOnlyForFloat = settings.digitsOnlyForFloat ?? true;\n\n let value: Maybe<number>;\n\n if (typeGuard.isString(rawValue)) {\n value = parser.number(value, { fallback: undefined });\n } else {\n value = rawValue;\n }\n\n if (typeGuard.isNumber(value)) {\n let raw: string = `${value}`;\n\n if (digits !== false) {\n if (settings.cropDigitsOnly) {\n const [integerPart, decimalPart] = `${raw}`.split('.');\n const leftPart = integerPart;\n const rightPart = (decimalPart || '')\n .slice(0, digits)\n .padEnd(digits, '0');\n\n if (rightPart) {\n raw = `${leftPart}.${rightPart}`;\n } else {\n raw = leftPart;\n }\n } else {\n raw = value.toFixed(digits);\n }\n }\n\n if (cutZeros) {\n raw = `${+raw}`;\n }\n\n const [integerPart, decimalPart] = raw.split('.', 2);\n\n let formattedIntegerPart = integerPart;\n let formattedDecimalPart = '';\n\n if (decimalPart && (!digitsOnlyForFloat || !/^0+$/.test(decimalPart))) {\n formattedDecimalPart = `.${decimalPart}`;\n }\n\n const rgx = /(\\d+)(\\d{3})/;\n\n while (rgx.test(formattedIntegerPart) && delimiter) {\n formattedIntegerPart = formattedIntegerPart.replace(\n rgx,\n `$1${delimiter}$2`,\n );\n }\n\n return formattedIntegerPart + formattedDecimalPart + postfix;\n }\n\n return emptyText;\n};\n\nnumber.defaultSettings = {} as NumberFormatSettings;\n","import { parser } from 'yummies/parser';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/types';\n\nimport { NO_VALUE } from './constants.js';\n\nexport interface PercentFormatSettings\n extends Omit<parser.NumberParserSettings, 'fallback'> {\n divider?: string;\n delimiter?: string;\n symbol?: string;\n emptyText?: string;\n}\n\n/**\n * Formats a value as a percent string with configurable decimal precision,\n * decimal divider and suffix symbol.\n *\n * @param value Number or numeric string to format.\n * @param settings Parser and formatting options.\n * @returns Formatted percent string or fallback text for invalid values.\n *\n * @example\n * ```ts\n * percent(12.345); // '12.35%'\n * ```\n *\n * @example\n * ```ts\n * percent(12.345, { divider: ',', symbol: ' pct' }); // '12,35 pct'\n * ```\n */\nexport const percent = (\n value: Maybe<number | string>,\n settings?: PercentFormatSettings,\n) => {\n const numericValue = parser.number(value, {\n ...settings,\n digits: settings?.digits ?? 2,\n fallback: Number.NaN,\n });\n\n if (typeGuard.isNumber(numericValue)) {\n const divider = settings?.divider ?? '.';\n\n const formattedPercent =\n divider === '.' ? numericValue : `${numericValue}`.replace('.', divider);\n\n return `${formattedPercent}${settings?.delimiter ?? ''}${settings?.symbol ?? '%'}`;\n } else {\n return settings?.emptyText ?? NO_VALUE;\n }\n};\n","/**\n * Removes all whitespace characters from a string.\n *\n * @param value Source string.\n * @returns String without spaces, tabs and line breaks.\n *\n * @example\n * ```ts\n * skipSpaces('1 000 000'); // '1000000'\n * ```\n *\n * @example\n * ```ts\n * skipSpaces('a\\tb\\nc'); // 'abc'\n * ```\n */\nexport const skipSpaces = (value: string) => value.replaceAll(/\\s/g, '');\n"],"names":["typeGuard","parser","integerPart","decimalPart"],"mappings":";;;;AAaO,MAAM,WAAW;AAejB,MAAM,SAAS;AAef,MAAM,WAAW;ACcjB,MAAM,SAAS,CACpB,UACA,iBACW;AACX,QAAM,WAAW;AAAA,IACf,GAAG,OAAO;AAAA,IACV,GAAG;AAAA,EAAA;AAGL,QAAM,SAAS,SAAS,UAAU;AAClC,QAAM,WAAW,UAAU,YAAY;AACvC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,UAAU,SAAS,WAAW;AACpC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,qBAAqB,SAAS,sBAAsB;AAE1D,MAAI;AAEJ,MAAIA,UAAAA,UAAU,SAAS,QAAQ,GAAG;AAChC,YAAQC,OAAAA,OAAO,OAAO,OAAO,EAAE,UAAU,QAAW;AAAA,EACtD,OAAO;AACL,YAAQ;AAAA,EACV;AAEA,MAAID,UAAAA,UAAU,SAAS,KAAK,GAAG;AAC7B,QAAI,MAAc,GAAG,KAAK;AAE1B,QAAI,WAAW,OAAO;AACpB,UAAI,SAAS,gBAAgB;AAC3B,cAAM,CAACE,cAAaC,YAAW,IAAI,GAAG,GAAG,GAAG,MAAM,GAAG;AACrD,cAAM,WAAWD;AACjB,cAAM,aAAaC,gBAAe,IAC/B,MAAM,GAAG,MAAM,EACf,OAAO,QAAQ,GAAG;AAErB,YAAI,WAAW;AACb,gBAAM,GAAG,QAAQ,IAAI,SAAS;AAAA,QAChC,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF,OAAO;AACL,cAAM,MAAM,QAAQ,MAAM;AAAA,MAC5B;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,YAAM,GAAG,CAAC,GAAG;AAAA,IACf;AAEA,UAAM,CAAC,aAAa,WAAW,IAAI,IAAI,MAAM,KAAK,CAAC;AAEnD,QAAI,uBAAuB;AAC3B,QAAI,uBAAuB;AAE3B,QAAI,gBAAgB,CAAC,sBAAsB,CAAC,OAAO,KAAK,WAAW,IAAI;AACrE,6BAAuB,IAAI,WAAW;AAAA,IACxC;AAEA,UAAM,MAAM;AAEZ,WAAO,IAAI,KAAK,oBAAoB,KAAK,WAAW;AAClD,6BAAuB,qBAAqB;AAAA,QAC1C;AAAA,QACA,KAAK,SAAS;AAAA,MAAA;AAAA,IAElB;AAEA,WAAO,uBAAuB,uBAAuB;AAAA,EACvD;AAEA,SAAO;AACT;AAEA,OAAO,kBAAkB,CAAA;AClGlB,MAAM,UAAU,CACrB,OACA,aACG;AACH,QAAM,eAAeF,OAAAA,OAAO,OAAO,OAAO;AAAA,IACxC,GAAG;AAAA,IACH,QAAQ,UAAU,UAAU;AAAA,IAC5B,UAAU,OAAO;AAAA,EAAA,CAClB;AAED,MAAID,UAAAA,UAAU,SAAS,YAAY,GAAG;AACpC,UAAM,UAAU,UAAU,WAAW;AAErC,UAAM,mBACJ,YAAY,MAAM,eAAe,GAAG,YAAY,GAAG,QAAQ,KAAK,OAAO;AAEzE,WAAO,GAAG,gBAAgB,GAAG,UAAU,aAAa,EAAE,GAAG,UAAU,UAAU,GAAG;AAAA,EAClF,OAAO;AACL,WAAO,UAAU,aAAa;AAAA,EAChC;AACF;ACpCO,MAAM,aAAa,CAAC,UAAkB,MAAM,WAAW,OAAO,EAAE;;;;;;;;;;;"}
1
+ {"version":3,"file":"format.cjs","names":[],"sources":["../src/format/number.ts","../src/format/percent.ts","../src/format/skip-spaces.ts","../src/format/_exports.ts"],"sourcesContent":["import { parser } from 'yummies/parser';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/types';\nimport { NO_VALUE } from './constants.js';\n\nexport interface NumberFormatSettings {\n delimiter?: string;\n /**\n * digitsOnlyForFloat - Show digits after decimal point only if they are not zeros after converting to number.\n * Example: \"0.00\" -> \"0\", \"0.10\" -> \"0.1\", but \"0.003\" -> \"0.003\"\n *\n * @default true\n */\n digitsOnlyForFloat?: boolean;\n /**\n * Text which will be returned if the value is undefined, null, NaN, Infinity or empty string.\n * Example: \"–\" will be returned if the value is undefined and emptyText is \"–\".\n */\n emptyText?: string;\n /**\n * Text to append to the end of the formatted number.\n * Example: if value is 1000 and postfix is \"₽\", result will be \"1 000₽\".\n */\n postfix?: string;\n /**\n * Fixed number of digits after the decimal point (number.toFixed() method)\n * If set to false, the truncation is ignored!\n */\n digits?: number | false;\n /**\n * Remove trailing zeros from the end of the number\n * Example: 0.010000000000000000000000000000000000000000000 -> 0.01\n */\n cutZeros?: boolean;\n cropDigitsOnly?: boolean;\n}\n\n/**\n * Formats a numeric value with thousands separators, fractional digit control\n * and optional postfix text.\n *\n * Invalid, empty or unsupported values fall back to `emptyText`.\n *\n * @param rawValue Number or numeric string to format.\n * @param userSettings Formatting overrides merged with `number.defaultSettings`.\n * @returns Formatted number string or fallback text.\n *\n * @example\n * ```ts\n * number(12000); // '12 000'\n * ```\n *\n * @example\n * ```ts\n * number(12.5, { digits: 1, postfix: '%' }); // '12.5%'\n * ```\n */\nexport const number = (\n rawValue: Maybe<string | number>,\n userSettings?: Maybe<NumberFormatSettings>,\n): string => {\n const settings = {\n ...number.defaultSettings,\n ...userSettings,\n };\n\n const digits = settings.digits ?? 0;\n const cutZeros = settings?.cutZeros ?? false;\n const delimiter = settings.delimiter ?? ' ';\n const postfix = settings.postfix ?? '';\n const emptyText = settings.emptyText ?? NO_VALUE;\n const digitsOnlyForFloat = settings.digitsOnlyForFloat ?? true;\n\n let value: Maybe<number>;\n\n if (typeGuard.isString(rawValue)) {\n value = parser.number(value, { fallback: undefined });\n } else {\n value = rawValue;\n }\n\n if (typeGuard.isNumber(value)) {\n let raw: string = `${value}`;\n\n if (digits !== false) {\n if (settings.cropDigitsOnly) {\n const [integerPart, decimalPart] = `${raw}`.split('.');\n const leftPart = integerPart;\n const rightPart = (decimalPart || '')\n .slice(0, digits)\n .padEnd(digits, '0');\n\n if (rightPart) {\n raw = `${leftPart}.${rightPart}`;\n } else {\n raw = leftPart;\n }\n } else {\n raw = value.toFixed(digits);\n }\n }\n\n if (cutZeros) {\n raw = `${+raw}`;\n }\n\n const [integerPart, decimalPart] = raw.split('.', 2);\n\n let formattedIntegerPart = integerPart;\n let formattedDecimalPart = '';\n\n if (decimalPart && (!digitsOnlyForFloat || !/^0+$/.test(decimalPart))) {\n formattedDecimalPart = `.${decimalPart}`;\n }\n\n const rgx = /(\\d+)(\\d{3})/;\n\n while (rgx.test(formattedIntegerPart) && delimiter) {\n formattedIntegerPart = formattedIntegerPart.replace(\n rgx,\n `$1${delimiter}$2`,\n );\n }\n\n return formattedIntegerPart + formattedDecimalPart + postfix;\n }\n\n return emptyText;\n};\n\nnumber.defaultSettings = {} as NumberFormatSettings;\n","import { parser } from 'yummies/parser';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/types';\n\nimport { NO_VALUE } from './constants.js';\n\nexport interface PercentFormatSettings\n extends Omit<parser.NumberParserSettings, 'fallback'> {\n divider?: string;\n delimiter?: string;\n symbol?: string;\n emptyText?: string;\n}\n\n/**\n * Formats a value as a percent string with configurable decimal precision,\n * decimal divider and suffix symbol.\n *\n * @param value Number or numeric string to format.\n * @param settings Parser and formatting options.\n * @returns Formatted percent string or fallback text for invalid values.\n *\n * @example\n * ```ts\n * percent(12.345); // '12.35%'\n * ```\n *\n * @example\n * ```ts\n * percent(12.345, { divider: ',', symbol: ' pct' }); // '12,35 pct'\n * ```\n */\nexport const percent = (\n value: Maybe<number | string>,\n settings?: PercentFormatSettings,\n) => {\n const numericValue = parser.number(value, {\n ...settings,\n digits: settings?.digits ?? 2,\n fallback: Number.NaN,\n });\n\n if (typeGuard.isNumber(numericValue)) {\n const divider = settings?.divider ?? '.';\n\n const formattedPercent =\n divider === '.' ? numericValue : `${numericValue}`.replace('.', divider);\n\n return `${formattedPercent}${settings?.delimiter ?? ''}${settings?.symbol ?? '%'}`;\n } else {\n return settings?.emptyText ?? NO_VALUE;\n }\n};\n","/**\n * Removes all whitespace characters from a string.\n *\n * @param value Source string.\n * @returns String without spaces, tabs and line breaks.\n *\n * @example\n * ```ts\n * skipSpaces('1 000 000'); // '1000000'\n * ```\n *\n * @example\n * ```ts\n * skipSpaces('a\\tb\\nc'); // 'abc'\n * ```\n */\nexport const skipSpaces = (value: string) => value.replaceAll(/\\s/g, '');\n","export * from './constants.js';\nexport * from './number.js';\nexport * from './percent.js';\nexport * from './skip-spaces.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAyDA,IAAa,UACX,UACA,iBACW;CACX,MAAM,WAAW;EACf,GAAG,OAAO;EACV,GAAG;EACJ;CAED,MAAM,SAAS,SAAS,UAAU;CAClC,MAAM,WAAW,UAAU,YAAY;CACvC,MAAM,YAAY,SAAS,aAAa;CACxC,MAAM,UAAU,SAAS,WAAW;CACpC,MAAM,YAAY,SAAS,aAAA;CAC3B,MAAM,qBAAqB,SAAS,sBAAsB;CAE1D,IAAI;AAEJ,KAAI,mBAAA,UAAU,SAAS,SAAS,CAC9B,SAAQ,eAAA,OAAO,OAAO,OAAO,EAAE,UAAU,KAAA,GAAW,CAAC;KAErD,SAAQ;AAGV,KAAI,mBAAA,UAAU,SAAS,MAAM,EAAE;EAC7B,IAAI,MAAc,GAAG;AAErB,MAAI,WAAW,MACb,KAAI,SAAS,gBAAgB;GAC3B,MAAM,CAAC,aAAa,eAAe,GAAG,MAAM,MAAM,IAAI;GACtD,MAAM,WAAW;GACjB,MAAM,aAAa,eAAe,IAC/B,MAAM,GAAG,OAAO,CAChB,OAAO,QAAQ,IAAI;AAEtB,OAAI,UACF,OAAM,GAAG,SAAS,GAAG;OAErB,OAAM;QAGR,OAAM,MAAM,QAAQ,OAAO;AAI/B,MAAI,SACF,OAAM,GAAG,CAAC;EAGZ,MAAM,CAAC,aAAa,eAAe,IAAI,MAAM,KAAK,EAAE;EAEpD,IAAI,uBAAuB;EAC3B,IAAI,uBAAuB;AAE3B,MAAI,gBAAgB,CAAC,sBAAsB,CAAC,OAAO,KAAK,YAAY,EAClE,wBAAuB,IAAI;EAG7B,MAAM,MAAM;AAEZ,SAAO,IAAI,KAAK,qBAAqB,IAAI,UACvC,wBAAuB,qBAAqB,QAC1C,KACA,KAAK,UAAU,IAChB;AAGH,SAAO,uBAAuB,uBAAuB;;AAGvD,QAAO;;AAGT,OAAO,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;AClG3B,IAAa,WACX,OACA,aACG;CACH,MAAM,eAAe,eAAA,OAAO,OAAO,OAAO;EACxC,GAAG;EACH,QAAQ,UAAU,UAAU;EAC5B,UAAU;EACX,CAAC;AAEF,KAAI,mBAAA,UAAU,SAAS,aAAa,EAAE;EACpC,MAAM,UAAU,UAAU,WAAW;AAKrC,SAAO,GAFL,YAAY,MAAM,eAAe,GAAG,eAAe,QAAQ,KAAK,QAAQ,GAE7C,UAAU,aAAa,KAAK,UAAU,UAAU;OAE7E,QAAO,UAAU,aAAA;;;;;;;;;;;;;;;;;;;;AClCrB,IAAa,cAAc,UAAkB,MAAM,WAAW,OAAO,GAAG"}