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/format.js CHANGED
@@ -1,87 +1,123 @@
1
+ import { n as __exportAll } from "./chunk-YKewjYmz.js";
1
2
  import { parser } from "yummies/parser";
2
3
  import { typeGuard } from "yummies/type-guard";
3
- const NO_VALUE = "–";
4
- const HYPHEN = "-";
5
- const INFINITY = "∞";
6
- const number = (rawValue, userSettings) => {
7
- const settings = {
8
- ...number.defaultSettings,
9
- ...userSettings
10
- };
11
- const digits = settings.digits ?? 0;
12
- const cutZeros = settings?.cutZeros ?? false;
13
- const delimiter = settings.delimiter ?? " ";
14
- const postfix = settings.postfix ?? "";
15
- const emptyText = settings.emptyText ?? NO_VALUE;
16
- const digitsOnlyForFloat = settings.digitsOnlyForFloat ?? true;
17
- let value;
18
- if (typeGuard.isString(rawValue)) {
19
- value = parser.number(value, { fallback: void 0 });
20
- } else {
21
- value = rawValue;
22
- }
23
- if (typeGuard.isNumber(value)) {
24
- let raw = `${value}`;
25
- if (digits !== false) {
26
- if (settings.cropDigitsOnly) {
27
- const [integerPart2, decimalPart2] = `${raw}`.split(".");
28
- const leftPart = integerPart2;
29
- const rightPart = (decimalPart2 || "").slice(0, digits).padEnd(digits, "0");
30
- if (rightPart) {
31
- raw = `${leftPart}.${rightPart}`;
32
- } else {
33
- raw = leftPart;
34
- }
35
- } else {
36
- raw = value.toFixed(digits);
37
- }
38
- }
39
- if (cutZeros) {
40
- raw = `${+raw}`;
41
- }
42
- const [integerPart, decimalPart] = raw.split(".", 2);
43
- let formattedIntegerPart = integerPart;
44
- let formattedDecimalPart = "";
45
- if (decimalPart && (!digitsOnlyForFloat || !/^0+$/.test(decimalPart))) {
46
- formattedDecimalPart = `.${decimalPart}`;
47
- }
48
- const rgx = /(\d+)(\d{3})/;
49
- while (rgx.test(formattedIntegerPart) && delimiter) {
50
- formattedIntegerPart = formattedIntegerPart.replace(
51
- rgx,
52
- `$1${delimiter}$2`
53
- );
54
- }
55
- return formattedIntegerPart + formattedDecimalPart + postfix;
56
- }
57
- return emptyText;
4
+ //#region src/format/number.ts
5
+ /**
6
+ * Formats a numeric value with thousands separators, fractional digit control
7
+ * and optional postfix text.
8
+ *
9
+ * Invalid, empty or unsupported values fall back to `emptyText`.
10
+ *
11
+ * @param rawValue Number or numeric string to format.
12
+ * @param userSettings Formatting overrides merged with `number.defaultSettings`.
13
+ * @returns Formatted number string or fallback text.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * number(12000); // '12 000'
18
+ * ```
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * number(12.5, { digits: 1, postfix: '%' }); // '12.5%'
23
+ * ```
24
+ */
25
+ var number = (rawValue, userSettings) => {
26
+ const settings = {
27
+ ...number.defaultSettings,
28
+ ...userSettings
29
+ };
30
+ const digits = settings.digits ?? 0;
31
+ const cutZeros = settings?.cutZeros ?? false;
32
+ const delimiter = settings.delimiter ?? " ";
33
+ const postfix = settings.postfix ?? "";
34
+ const emptyText = settings.emptyText ?? "–";
35
+ const digitsOnlyForFloat = settings.digitsOnlyForFloat ?? true;
36
+ let value;
37
+ if (typeGuard.isString(rawValue)) value = parser.number(value, { fallback: void 0 });
38
+ else value = rawValue;
39
+ if (typeGuard.isNumber(value)) {
40
+ let raw = `${value}`;
41
+ if (digits !== false) if (settings.cropDigitsOnly) {
42
+ const [integerPart, decimalPart] = `${raw}`.split(".");
43
+ const leftPart = integerPart;
44
+ const rightPart = (decimalPart || "").slice(0, digits).padEnd(digits, "0");
45
+ if (rightPart) raw = `${leftPart}.${rightPart}`;
46
+ else raw = leftPart;
47
+ } else raw = value.toFixed(digits);
48
+ if (cutZeros) raw = `${+raw}`;
49
+ const [integerPart, decimalPart] = raw.split(".", 2);
50
+ let formattedIntegerPart = integerPart;
51
+ let formattedDecimalPart = "";
52
+ if (decimalPart && (!digitsOnlyForFloat || !/^0+$/.test(decimalPart))) formattedDecimalPart = `.${decimalPart}`;
53
+ const rgx = /(\d+)(\d{3})/;
54
+ while (rgx.test(formattedIntegerPart) && delimiter) formattedIntegerPart = formattedIntegerPart.replace(rgx, `$1${delimiter}$2`);
55
+ return formattedIntegerPart + formattedDecimalPart + postfix;
56
+ }
57
+ return emptyText;
58
58
  };
59
59
  number.defaultSettings = {};
60
- const percent = (value, settings) => {
61
- const numericValue = parser.number(value, {
62
- ...settings,
63
- digits: settings?.digits ?? 2,
64
- fallback: Number.NaN
65
- });
66
- if (typeGuard.isNumber(numericValue)) {
67
- const divider = settings?.divider ?? ".";
68
- const formattedPercent = divider === "." ? numericValue : `${numericValue}`.replace(".", divider);
69
- return `${formattedPercent}${settings?.delimiter ?? ""}${settings?.symbol ?? "%"}`;
70
- } else {
71
- return settings?.emptyText ?? NO_VALUE;
72
- }
60
+ //#endregion
61
+ //#region src/format/percent.ts
62
+ /**
63
+ * Formats a value as a percent string with configurable decimal precision,
64
+ * decimal divider and suffix symbol.
65
+ *
66
+ * @param value Number or numeric string to format.
67
+ * @param settings Parser and formatting options.
68
+ * @returns Formatted percent string or fallback text for invalid values.
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * percent(12.345); // '12.35%'
73
+ * ```
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * percent(12.345, { divider: ',', symbol: ' pct' }); // '12,35 pct'
78
+ * ```
79
+ */
80
+ var percent = (value, settings) => {
81
+ const numericValue = parser.number(value, {
82
+ ...settings,
83
+ digits: settings?.digits ?? 2,
84
+ fallback: NaN
85
+ });
86
+ if (typeGuard.isNumber(numericValue)) {
87
+ const divider = settings?.divider ?? ".";
88
+ return `${divider === "." ? numericValue : `${numericValue}`.replace(".", divider)}${settings?.delimiter ?? ""}${settings?.symbol ?? "%"}`;
89
+ } else return settings?.emptyText ?? "–";
73
90
  };
74
- const skipSpaces = (value) => value.replaceAll(/\s/g, "");
75
- const _exports = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
76
- __proto__: null,
77
- HYPHEN,
78
- INFINITY,
79
- NO_VALUE,
80
- number,
81
- percent,
82
- skipSpaces
83
- }, Symbol.toStringTag, { value: "Module" }));
84
- export {
85
- _exports as format
86
- };
87
- //# sourceMappingURL=format.js.map
91
+ //#endregion
92
+ //#region src/format/skip-spaces.ts
93
+ /**
94
+ * Removes all whitespace characters from a string.
95
+ *
96
+ * @param value Source string.
97
+ * @returns String without spaces, tabs and line breaks.
98
+ *
99
+ * @example
100
+ * ```ts
101
+ * skipSpaces('1 000 000'); // '1000000'
102
+ * ```
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * skipSpaces('a\tb\nc'); // 'abc'
107
+ * ```
108
+ */
109
+ var skipSpaces = (value) => value.replaceAll(/\s/g, "");
110
+ //#endregion
111
+ //#region src/format/_exports.ts
112
+ var _exports_exports = /* @__PURE__ */ __exportAll({
113
+ HYPHEN: () => "-",
114
+ INFINITY: () => "∞",
115
+ NO_VALUE: () => "–",
116
+ number: () => number,
117
+ percent: () => percent,
118
+ skipSpaces: () => skipSpaces
119
+ });
120
+ //#endregion
121
+ export { _exports_exports as format };
122
+
123
+ //# sourceMappingURL=format.js.map
package/format.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","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":["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,MAAI,UAAU,SAAS,QAAQ,GAAG;AAChC,YAAQ,OAAO,OAAO,OAAO,EAAE,UAAU,QAAW;AAAA,EACtD,OAAO;AACL,YAAQ;AAAA,EACV;AAEA,MAAI,UAAU,SAAS,KAAK,GAAG;AAC7B,QAAI,MAAc,GAAG,KAAK;AAE1B,QAAI,WAAW,OAAO;AACpB,UAAI,SAAS,gBAAgB;AAC3B,cAAM,CAACA,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,eAAe,OAAO,OAAO,OAAO;AAAA,IACxC,GAAG;AAAA,IACH,QAAQ,UAAU,UAAU;AAAA,IAC5B,UAAU,OAAO;AAAA,EAAA,CAClB;AAED,MAAI,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.js","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,UAAU,SAAS,SAAS,CAC9B,SAAQ,OAAO,OAAO,OAAO,EAAE,UAAU,KAAA,GAAW,CAAC;KAErD,SAAQ;AAGV,KAAI,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,OAAO,OAAO,OAAO;EACxC,GAAG;EACH,QAAQ,UAAU,UAAU;EAC5B,UAAU;EACX,CAAC;AAEF,KAAI,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"}
package/html.cjs CHANGED
@@ -1,156 +1,244 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const DOMPurify = require("dompurify");
4
- const media = require("yummies/media");
5
- const getComputedColor = (color) => {
6
- if (!color) return null;
7
- const d = document.createElement("div");
8
- d.style.color = color;
9
- document.body.append(d);
10
- const rgbcolor = globalThis.getComputedStyle(d).color;
11
- const match = /rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*\d+[.d+]*)*\)/g.exec(rgbcolor);
12
- d.remove();
13
- if (!match) return null;
14
- return `${match[1]}, ${match[2]}, ${match[3]}`;
2
+ const require_chunk = require("./chunk-CVq3Gv4J.cjs");
3
+ let dompurify = require("dompurify");
4
+ dompurify = require_chunk.__toESM(dompurify);
5
+ let yummies_media = require("yummies/media");
6
+ //#region src/html.ts
7
+ /**
8
+ * Extracts an RGB value from any valid CSS color.
9
+ *
10
+ * Not recommended for frequent use because it triggers a reflow.
11
+ */
12
+ var getComputedColor = (color) => {
13
+ if (!color) return null;
14
+ const d = document.createElement("div");
15
+ d.style.color = color;
16
+ document.body.append(d);
17
+ const rgbcolor = globalThis.getComputedStyle(d).color;
18
+ const match = /rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*\d+[.d+]*)*\)/g.exec(rgbcolor);
19
+ d.remove();
20
+ if (!match) return null;
21
+ return `${match[1]}, ${match[2]}, ${match[3]}`;
15
22
  };
16
- const downloadUsingAnchor = (urlOrBlob, fileName) => {
17
- const url = media.blobToUrl(urlOrBlob);
18
- const a = document.createElement("a");
19
- a.href = url;
20
- a.download = fileName ?? "file";
21
- a.target = "_blank";
22
- document.body.append(a);
23
- a.click();
24
- a.remove();
23
+ /**
24
+ * Triggers a file download by creating and clicking a temporary anchor element.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * downloadUsingAnchor('/report.pdf', 'report.pdf');
29
+ * ```
30
+ */
31
+ var downloadUsingAnchor = (urlOrBlob, fileName) => {
32
+ const url = (0, yummies_media.blobToUrl)(urlOrBlob);
33
+ const a = document.createElement("a");
34
+ a.href = url;
35
+ a.download = fileName ?? "file";
36
+ a.target = "_blank";
37
+ document.body.append(a);
38
+ a.click();
39
+ a.remove();
25
40
  };
41
+ /**
42
+ * Surrounds string in an anchor tag
43
+ */
26
44
  function wrapTextToTagLink(link) {
27
- const descr = String(link).replace(/^(https?:\/{0,2})?(w{3}\.)?/, "www.");
28
- if (!/^https?:\/{2}/.test(link)) link = `http://${link}`;
29
- return `<a href=${link} target="_blank">${descr}</a>`;
45
+ const descr = String(link).replace(/^(https?:\/{0,2})?(w{3}\.)?/, "www.");
46
+ if (!/^https?:\/{2}/.test(link)) link = `http://${link}`;
47
+ return `<a href=${link} target="_blank">${descr}</a>`;
30
48
  }
31
- const collectOffsetTop = (element) => {
32
- let offsetTop = 0;
33
- let node = element;
34
- while (node != null) {
35
- offsetTop += node.offsetTop;
36
- node = node.parentElement;
37
- }
38
- return offsetTop;
49
+ /**
50
+ * Collects the cumulative `offsetTop` value through the element parent chain.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * const offsetTop = collectOffsetTop(document.getElementById('section'));
55
+ * ```
56
+ */
57
+ var collectOffsetTop = (element) => {
58
+ let offsetTop = 0;
59
+ let node = element;
60
+ while (node != null) {
61
+ offsetTop += node.offsetTop;
62
+ node = node.parentElement;
63
+ }
64
+ return offsetTop;
39
65
  };
40
- const skipEvent = (e) => {
41
- e.preventDefault();
42
- e.stopPropagation();
43
- return false;
66
+ /**
67
+ * Prevents the default browser action and stops event propagation.
68
+ *
69
+ * @example
70
+ * ```ts
71
+ * button.addEventListener('click', (event) => skipEvent(event));
72
+ * ```
73
+ */
74
+ var skipEvent = (e) => {
75
+ e.preventDefault();
76
+ e.stopPropagation();
77
+ return false;
44
78
  };
45
- const globalScrollIntoViewForY = (node) => {
46
- const scrollContainer = document.body;
47
- const pageHeight = window.innerHeight;
48
- const nodeBounding = node.getBoundingClientRect();
49
- const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;
50
- const scrollPageNumber = Math.min(
51
- Math.max(nodeBounding.top / pageHeight, 1),
52
- scrollPagesCount
53
- );
54
- window.scroll({
55
- top: scrollPageNumber * pageHeight,
56
- behavior: "smooth"
57
- });
79
+ /**
80
+ * Scrolls the page vertically to the viewport section containing the target element.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * globalScrollIntoViewForY(document.getElementById('footer')!);
85
+ * ```
86
+ */
87
+ var globalScrollIntoViewForY = (node) => {
88
+ const scrollContainer = document.body;
89
+ const pageHeight = window.innerHeight;
90
+ const nodeBounding = node.getBoundingClientRect();
91
+ const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;
92
+ const scrollPageNumber = Math.min(Math.max(nodeBounding.top / pageHeight, 1), scrollPagesCount);
93
+ window.scroll({
94
+ top: scrollPageNumber * pageHeight,
95
+ behavior: "smooth"
96
+ });
58
97
  };
59
- const sanitizeDefaults = {
60
- ALLOWED_TAGS: [
61
- "a",
62
- "article",
63
- "b",
64
- "blockquote",
65
- "br",
66
- "caption",
67
- "code",
68
- "del",
69
- "details",
70
- "div",
71
- "em",
72
- "h1",
73
- "h2",
74
- "h3",
75
- "h4",
76
- "h5",
77
- "h6",
78
- "hr",
79
- "i",
80
- "img",
81
- "ins",
82
- "kbd",
83
- "li",
84
- "main",
85
- "ol",
86
- "p",
87
- "pre",
88
- "section",
89
- "span",
90
- "strong",
91
- "sub",
92
- "summary",
93
- "sup",
94
- "table",
95
- "tbody",
96
- "td",
97
- "th",
98
- "thead",
99
- "tr",
100
- "u",
101
- "ul"
102
- ],
103
- ALLOWED_ATTR: ["href", "target", "name", "src", "class"]
98
+ var sanitizeDefaults = {
99
+ ALLOWED_TAGS: [
100
+ "a",
101
+ "article",
102
+ "b",
103
+ "blockquote",
104
+ "br",
105
+ "caption",
106
+ "code",
107
+ "del",
108
+ "details",
109
+ "div",
110
+ "em",
111
+ "h1",
112
+ "h2",
113
+ "h3",
114
+ "h4",
115
+ "h5",
116
+ "h6",
117
+ "hr",
118
+ "i",
119
+ "img",
120
+ "ins",
121
+ "kbd",
122
+ "li",
123
+ "main",
124
+ "ol",
125
+ "p",
126
+ "pre",
127
+ "section",
128
+ "span",
129
+ "strong",
130
+ "sub",
131
+ "summary",
132
+ "sup",
133
+ "table",
134
+ "tbody",
135
+ "td",
136
+ "th",
137
+ "thead",
138
+ "tr",
139
+ "u",
140
+ "ul"
141
+ ],
142
+ ALLOWED_ATTR: [
143
+ "href",
144
+ "target",
145
+ "name",
146
+ "src",
147
+ "class"
148
+ ]
104
149
  };
105
- const sanitizeHtml = (html, config) => {
106
- return DOMPurify.sanitize(html || "", {
107
- ...sanitizeDefaults,
108
- ...config
109
- });
150
+ /**
151
+ * Sanitizes HTML using the default allowlist merged with custom DOMPurify config.
152
+ *
153
+ * @example
154
+ * ```ts
155
+ * sanitizeHtml('<img src=x onerror=alert(1) />');
156
+ * ```
157
+ */
158
+ var sanitizeHtml = (html, config) => {
159
+ return dompurify.default.sanitize(html || "", {
160
+ ...sanitizeDefaults,
161
+ ...config
162
+ });
110
163
  };
111
- const checkElementHasParent = (element, parent) => {
112
- let node = element;
113
- if (!parent) return false;
114
- while (node != null) {
115
- if (node === parent) {
116
- return true;
117
- } else {
118
- node = node.parentElement;
119
- }
120
- }
121
- return false;
164
+ /**
165
+ * Checks whether the element is nested inside the provided parent element.
166
+ *
167
+ * @example
168
+ * ```ts
169
+ * checkElementHasParent(childElement, modalElement);
170
+ * ```
171
+ */
172
+ var checkElementHasParent = (element, parent) => {
173
+ let node = element;
174
+ if (!parent) return false;
175
+ while (node != null) if (node === parent) return true;
176
+ else node = node.parentElement;
177
+ return false;
122
178
  };
123
- const startViewTransitionSafety = (fn, params) => {
124
- if (typeof document !== "undefined" && document.startViewTransition && !params?.disabled) {
125
- return document.startViewTransition(fn);
126
- }
127
- fn();
179
+ /**
180
+ * Executes a function within a view transition if supported by the browser.
181
+ *
182
+ * @param {VoidFunction} fn - The function to be executed.
183
+ * @returns {ViewTransition} - The result of the executed function.
184
+ *
185
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition | MDN: Document.startViewTransition}
186
+ */
187
+ var startViewTransitionSafety = (fn, params) => {
188
+ if (typeof document !== "undefined" && document.startViewTransition && !params?.disabled) return document.startViewTransition(fn);
189
+ fn();
128
190
  };
129
- const calcScrollbarWidth = (elementToAppend = document.body) => {
130
- const outer = document.createElement("div");
131
- outer.style.visibility = "hidden";
132
- outer.style.width = "100px";
133
- outer.style.overflow = "scroll";
134
- elementToAppend.append(outer);
135
- const inner = document.createElement("div");
136
- inner.style.width = "100%";
137
- outer.append(inner);
138
- const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;
139
- outer.parentNode?.removeChild(outer);
140
- return scrollbarWidth;
191
+ /**
192
+ * Calculates the scrollbar width.
193
+ */
194
+ var calcScrollbarWidth = (elementToAppend = document.body) => {
195
+ const outer = document.createElement("div");
196
+ outer.style.visibility = "hidden";
197
+ outer.style.width = "100px";
198
+ outer.style.overflow = "scroll";
199
+ elementToAppend.append(outer);
200
+ const inner = document.createElement("div");
201
+ inner.style.width = "100%";
202
+ outer.append(inner);
203
+ const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;
204
+ outer.parentNode?.removeChild(outer);
205
+ return scrollbarWidth;
141
206
  };
207
+ /**
208
+ * Calculates the inner height of an HTML element, accounting for padding.
209
+ */
142
210
  function getElementInnerHeight(element) {
143
- const { clientHeight } = element;
144
- const { paddingTop, paddingBottom } = getComputedStyle(element);
145
- return clientHeight - Number.parseFloat(paddingTop) - Number.parseFloat(paddingBottom);
211
+ const { clientHeight } = element;
212
+ const { paddingTop, paddingBottom } = getComputedStyle(element);
213
+ return clientHeight - Number.parseFloat(paddingTop) - Number.parseFloat(paddingBottom);
146
214
  }
215
+ /**
216
+ * Calculates the inner width of an HTML element, accounting for padding.
217
+ */
147
218
  function getElementInnerWidth(el) {
148
- const { clientWidth } = el;
149
- const { paddingLeft, paddingRight } = getComputedStyle(el);
150
- return clientWidth - Number.parseFloat(paddingLeft) - Number.parseFloat(paddingRight);
219
+ const { clientWidth } = el;
220
+ const { paddingLeft, paddingRight } = getComputedStyle(el);
221
+ return clientWidth - Number.parseFloat(paddingLeft) - Number.parseFloat(paddingRight);
151
222
  }
152
- const isPrefersDarkTheme = () => !!globalThis.matchMedia?.("(prefers-color-scheme: dark)")?.matches;
153
- const isPrefersLightTheme = () => !!globalThis.matchMedia?.("(prefers-color-scheme: light)")?.matches;
223
+ /**
224
+ * Checks whether the user prefers a dark color scheme.
225
+ *
226
+ * @example
227
+ * ```ts
228
+ * const prefersDark = isPrefersDarkTheme();
229
+ * ```
230
+ */
231
+ var isPrefersDarkTheme = () => !!globalThis.matchMedia?.("(prefers-color-scheme: dark)")?.matches;
232
+ /**
233
+ * Checks whether the user prefers a light color scheme.
234
+ *
235
+ * @example
236
+ * ```ts
237
+ * const prefersLight = isPrefersLightTheme();
238
+ * ```
239
+ */
240
+ var isPrefersLightTheme = () => !!globalThis.matchMedia?.("(prefers-color-scheme: light)")?.matches;
241
+ //#endregion
154
242
  exports.calcScrollbarWidth = calcScrollbarWidth;
155
243
  exports.checkElementHasParent = checkElementHasParent;
156
244
  exports.collectOffsetTop = collectOffsetTop;
@@ -165,4 +253,5 @@ exports.sanitizeHtml = sanitizeHtml;
165
253
  exports.skipEvent = skipEvent;
166
254
  exports.startViewTransitionSafety = startViewTransitionSafety;
167
255
  exports.wrapTextToTagLink = wrapTextToTagLink;
168
- //# sourceMappingURL=html.cjs.map
256
+
257
+ //# sourceMappingURL=html.cjs.map