yummies 5.15.1 → 6.0.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 (234) hide show
  1. package/README.md +10 -4
  2. package/async.cjs +45 -1
  3. package/async.cjs.map +1 -1
  4. package/async.d.ts +7 -6
  5. package/common.cjs +11 -1
  6. package/common.cjs.map +1 -1
  7. package/common.d.ts +8 -5
  8. package/common.js.map +1 -1
  9. package/complex.cjs +88 -1
  10. package/complex.cjs.map +1 -1
  11. package/{complex/modules-factory.d.ts → complex.d.ts} +31 -4
  12. package/complex.js.map +1 -1
  13. package/cookie.cjs +9 -1
  14. package/cookie.cjs.map +1 -1
  15. package/cookie.d.ts +5 -3
  16. package/cookie.js.map +1 -1
  17. package/css.cjs +45 -1
  18. package/css.cjs.map +1 -1
  19. package/css.d.ts +11 -8
  20. package/css.js.map +1 -1
  21. package/data.cjs +43 -1
  22. package/data.cjs.map +1 -1
  23. package/data.d.ts +5 -4
  24. package/data.js.map +1 -1
  25. package/date-time.cjs +395 -1
  26. package/date-time.cjs.map +1 -1
  27. package/date-time.d.ts +12 -10
  28. package/date-time.js.map +1 -1
  29. package/device.cjs +32 -1
  30. package/device.cjs.map +1 -1
  31. package/device.d.ts +9 -8
  32. package/encodings.cjs +270 -1
  33. package/encodings.cjs.map +1 -1
  34. package/encodings.d.ts +3 -2
  35. package/encodings.js.map +1 -1
  36. package/errors.cjs +23 -1
  37. package/errors.cjs.map +1 -1
  38. package/errors.d.ts +5 -4
  39. package/errors.js.map +1 -1
  40. package/file.cjs +28 -1
  41. package/file.cjs.map +1 -1
  42. package/file.d.ts +4 -3
  43. package/format.cjs +75 -1
  44. package/format.cjs.map +1 -1
  45. package/format.d.ts +74 -0
  46. package/format.js.map +1 -1
  47. package/html.cjs +167 -1
  48. package/html.cjs.map +1 -1
  49. package/html.d.ts +19 -17
  50. package/html.js.map +1 -1
  51. package/id.cjs +25 -1
  52. package/id.cjs.map +1 -1
  53. package/id.d.ts +9 -8
  54. package/imports.cjs +33 -1
  55. package/imports.cjs.map +1 -1
  56. package/imports.d.ts +6 -4
  57. package/math.cjs +14 -1
  58. package/math.cjs.map +1 -1
  59. package/math.d.ts +7 -5
  60. package/math.js.map +1 -1
  61. package/media.cjs +105 -1
  62. package/media.cjs.map +1 -1
  63. package/media.d.ts +11 -11
  64. package/mobx.cjs +184 -1
  65. package/mobx.cjs.map +1 -1
  66. package/mobx.d.ts +66 -0
  67. package/mobx.js.map +1 -1
  68. package/ms.cjs +13 -1
  69. package/ms.cjs.map +1 -1
  70. package/ms.d.ts +4 -3
  71. package/number.cjs +10 -1
  72. package/number.cjs.map +1 -1
  73. package/number.d.ts +3 -2
  74. package/package.json +39 -113
  75. package/parser.cjs +68 -1
  76. package/parser.cjs.map +1 -1
  77. package/parser.d.ts +41 -0
  78. package/parser.js.map +1 -1
  79. package/price.cjs +20 -1
  80. package/price.cjs.map +1 -1
  81. package/price.d.ts +5 -3
  82. package/random.cjs +24 -1
  83. package/random.cjs.map +1 -1
  84. package/random.d.ts +10 -9
  85. package/react.cjs +216 -1
  86. package/react.cjs.map +1 -1
  87. package/react.d.ts +113 -0
  88. package/react.js.map +1 -1
  89. package/sound.cjs +11 -1
  90. package/sound.cjs.map +1 -1
  91. package/sound.d.ts +3 -2
  92. package/text.cjs +37 -1
  93. package/text.cjs.map +1 -1
  94. package/text.d.ts +4 -3
  95. package/type-guard.cjs +75 -1
  96. package/type-guard.cjs.map +1 -1
  97. package/type-guard.d.ts +121 -0
  98. package/type-guard.js.map +1 -1
  99. package/{utils/types.d.ts → types.d.ts} +54 -53
  100. package/types.global.cjs +2 -0
  101. package/types.global.cjs.map +1 -0
  102. package/{utility-types.d.ts → types.global.d.ts} +1 -1
  103. package/types.global.js +2 -0
  104. package/types.global.js.map +1 -0
  105. package/vibrate.cjs +8 -1
  106. package/vibrate.cjs.map +1 -1
  107. package/vibrate.d.ts +3 -2
  108. package/async.d.ts.map +0 -1
  109. package/common.d.ts.map +0 -1
  110. package/complex/counter.d.ts +0 -15
  111. package/complex/counter.d.ts.map +0 -1
  112. package/complex/global-config.d.ts +0 -11
  113. package/complex/global-config.d.ts.map +0 -1
  114. package/complex/index.d.ts +0 -4
  115. package/complex/index.d.ts.map +0 -1
  116. package/complex/modules-factory.d.ts.map +0 -1
  117. package/cookie.d.ts.map +0 -1
  118. package/css.d.ts.map +0 -1
  119. package/data.d.ts.map +0 -1
  120. package/date-time.d.ts.map +0 -1
  121. package/device.d.ts.map +0 -1
  122. package/encodings.d.ts.map +0 -1
  123. package/errors.d.ts.map +0 -1
  124. package/file.d.ts.map +0 -1
  125. package/format/_exports.d.ts +0 -5
  126. package/format/_exports.d.ts.map +0 -1
  127. package/format/constants.d.ts +0 -4
  128. package/format/constants.d.ts.map +0 -1
  129. package/format/index.d.ts +0 -3
  130. package/format/index.d.ts.map +0 -1
  131. package/format/number.d.ts +0 -36
  132. package/format/number.d.ts.map +0 -1
  133. package/format/percent.d.ts +0 -15
  134. package/format/percent.d.ts.map +0 -1
  135. package/format/skip-spaces.d.ts +0 -5
  136. package/format/skip-spaces.d.ts.map +0 -1
  137. package/html.d.ts.map +0 -1
  138. package/id.d.ts.map +0 -1
  139. package/imports.d.ts.map +0 -1
  140. package/math.d.ts.map +0 -1
  141. package/media.d.ts.map +0 -1
  142. package/mobx/apply-observable.d.ts +0 -4
  143. package/mobx/apply-observable.d.ts.map +0 -1
  144. package/mobx/create-enhanced-atom.d.ts +0 -11
  145. package/mobx/create-enhanced-atom.d.ts.map +0 -1
  146. package/mobx/create-ref.d.ts +0 -28
  147. package/mobx/create-ref.d.ts.map +0 -1
  148. package/mobx/deep-observable-struct.d.ts +0 -7
  149. package/mobx/deep-observable-struct.d.ts.map +0 -1
  150. package/mobx/get-mobx-administration.d.ts +0 -6
  151. package/mobx/get-mobx-administration.d.ts.map +0 -1
  152. package/mobx/index.d.ts +0 -7
  153. package/mobx/index.d.ts.map +0 -1
  154. package/mobx/lazy-observe.d.ts +0 -14
  155. package/mobx/lazy-observe.d.ts.map +0 -1
  156. package/ms.d.ts.map +0 -1
  157. package/number.d.ts.map +0 -1
  158. package/parser/_exports.d.ts +0 -4
  159. package/parser/_exports.d.ts.map +0 -1
  160. package/parser/index.d.ts +0 -3
  161. package/parser/index.d.ts.map +0 -1
  162. package/parser/number.d.ts +0 -21
  163. package/parser/number.d.ts.map +0 -1
  164. package/parser/percent.d.ts +0 -4
  165. package/parser/percent.d.ts.map +0 -1
  166. package/parser/string.d.ts +0 -7
  167. package/parser/string.d.ts.map +0 -1
  168. package/price.d.ts.map +0 -1
  169. package/random.d.ts.map +0 -1
  170. package/react/hooks/index.d.ts +0 -22
  171. package/react/hooks/index.d.ts.map +0 -1
  172. package/react/hooks/use-abort-controller.d.ts +0 -2
  173. package/react/hooks/use-abort-controller.d.ts.map +0 -1
  174. package/react/hooks/use-abort-signal.d.ts +0 -2
  175. package/react/hooks/use-abort-signal.d.ts.map +0 -1
  176. package/react/hooks/use-click-outside.d.ts +0 -9
  177. package/react/hooks/use-click-outside.d.ts.map +0 -1
  178. package/react/hooks/use-constant.d.ts +0 -9
  179. package/react/hooks/use-constant.d.ts.map +0 -1
  180. package/react/hooks/use-define-ref.d.ts +0 -10
  181. package/react/hooks/use-define-ref.d.ts.map +0 -1
  182. package/react/hooks/use-element-ref.d.ts +0 -2
  183. package/react/hooks/use-element-ref.d.ts.map +0 -1
  184. package/react/hooks/use-event-listener.d.ts +0 -8
  185. package/react/hooks/use-event-listener.d.ts.map +0 -1
  186. package/react/hooks/use-event.d.ts +0 -3
  187. package/react/hooks/use-event.d.ts.map +0 -1
  188. package/react/hooks/use-flag.d.ts +0 -8
  189. package/react/hooks/use-flag.d.ts.map +0 -1
  190. package/react/hooks/use-force-update.d.ts +0 -2
  191. package/react/hooks/use-force-update.d.ts.map +0 -1
  192. package/react/hooks/use-initial-height.d.ts +0 -5
  193. package/react/hooks/use-initial-height.d.ts.map +0 -1
  194. package/react/hooks/use-instance.d.ts +0 -27
  195. package/react/hooks/use-instance.d.ts.map +0 -1
  196. package/react/hooks/use-intersection-observer.d.ts +0 -2
  197. package/react/hooks/use-intersection-observer.d.ts.map +0 -1
  198. package/react/hooks/use-last-defined-value.d.ts +0 -2
  199. package/react/hooks/use-last-defined-value.d.ts.map +0 -1
  200. package/react/hooks/use-last-value-ref.d.ts +0 -2
  201. package/react/hooks/use-last-value-ref.d.ts.map +0 -1
  202. package/react/hooks/use-life-cycle.d.ts +0 -5
  203. package/react/hooks/use-life-cycle.d.ts.map +0 -1
  204. package/react/hooks/use-resize-observer.d.ts +0 -2
  205. package/react/hooks/use-resize-observer.d.ts.map +0 -1
  206. package/react/hooks/use-sync-ref.d.ts +0 -2
  207. package/react/hooks/use-sync-ref.d.ts.map +0 -1
  208. package/react/hooks/use-toggle.d.ts +0 -2
  209. package/react/hooks/use-toggle.d.ts.map +0 -1
  210. package/react/hooks/use-value.d.ts +0 -5
  211. package/react/hooks/use-value.d.ts.map +0 -1
  212. package/react/hooks/use-visibility-state.d.ts +0 -2
  213. package/react/hooks/use-visibility-state.d.ts.map +0 -1
  214. package/react/index.d.ts +0 -2
  215. package/react/index.d.ts.map +0 -1
  216. package/sound.d.ts.map +0 -1
  217. package/storage.d.ts +0 -39
  218. package/storage.d.ts.map +0 -1
  219. package/text.d.ts.map +0 -1
  220. package/type-guard/_exports.d.ts +0 -86
  221. package/type-guard/_exports.d.ts.map +0 -1
  222. package/type-guard/index.d.ts +0 -3
  223. package/type-guard/index.d.ts.map +0 -1
  224. package/utility-types.cjs +0 -2
  225. package/utility-types.cjs.map +0 -1
  226. package/utility-types.d.ts.map +0 -1
  227. package/utility-types.js +0 -2
  228. package/utility-types.js.map +0 -1
  229. package/utils/types.d.ts.map +0 -1
  230. package/vibrate.d.ts.map +0 -1
  231. /package/{utils/types.cjs → types.cjs} +0 -0
  232. /package/{utils/types.cjs.map → types.cjs.map} +0 -0
  233. /package/{utils/types.js → types.js} +0 -0
  234. /package/{utils/types.js.map → types.js.map} +0 -0
package/format.d.ts ADDED
@@ -0,0 +1,74 @@
1
+ import { Maybe } from 'yummies/types';
2
+ import { parser } from 'yummies/parser';
3
+
4
+ declare const NO_VALUE = "\u2013";
5
+ declare const HYPHEN = "-";
6
+ declare const INFINITY = "\u221E";
7
+
8
+ interface NumberFormatSettings {
9
+ delimiter?: string;
10
+ /**
11
+ * digitsOnlyForFloat - Show digits after decimal point only if they are not zeros after converting to number.
12
+ * Example: "0.00" -> "0", "0.10" -> "0.1", but "0.003" -> "0.003"
13
+ *
14
+ * @default true
15
+ */
16
+ digitsOnlyForFloat?: boolean;
17
+ /**
18
+ * Text which will be returned if the value is undefined, null, NaN, Infinity or empty string.
19
+ * Example: "–" will be returned if the value is undefined and emptyText is "–".
20
+ */
21
+ emptyText?: string;
22
+ /**
23
+ * Text to append to the end of the formatted number.
24
+ * Example: if value is 1000 and postfix is "₽", result will be "1 000₽".
25
+ */
26
+ postfix?: string;
27
+ /**
28
+ * Fixed number of digits after the decimal point (number.toFixed() method)
29
+ * If set to false, the truncation is ignored!
30
+ */
31
+ digits?: number | false;
32
+ /**
33
+ * Remove trailing zeros from the end of the number
34
+ * Example: 0.010000000000000000000000000000000000000000000 -> 0.01
35
+ */
36
+ cutZeros?: boolean;
37
+ }
38
+ declare const number: {
39
+ (rawValue: Maybe<string | number>, userSettings?: Maybe<NumberFormatSettings>): string;
40
+ defaultSettings: NumberFormatSettings;
41
+ };
42
+
43
+ interface PercentFormatSettings extends Omit<parser.NumberParserSettings, 'fallback'> {
44
+ divider?: string;
45
+ delimiter?: string;
46
+ symbol?: string;
47
+ emptyText?: string;
48
+ }
49
+ /**
50
+ * 100 -> 100%
51
+ * 99.123214412 -> 99.12%
52
+ * 99.123214412 -> 99,12%
53
+ */
54
+ declare const percent: (value: Maybe<number | string>, settings?: PercentFormatSettings) => string;
55
+
56
+ /**
57
+ * Removes all spaces in string
58
+ */
59
+ declare const skipSpaces: (value: string) => string;
60
+
61
+ declare const _exports_HYPHEN: typeof HYPHEN;
62
+ declare const _exports_INFINITY: typeof INFINITY;
63
+ declare const _exports_NO_VALUE: typeof NO_VALUE;
64
+ type _exports_NumberFormatSettings = NumberFormatSettings;
65
+ type _exports_PercentFormatSettings = PercentFormatSettings;
66
+ declare const _exports_number: typeof number;
67
+ declare const _exports_percent: typeof percent;
68
+ declare const _exports_skipSpaces: typeof skipSpaces;
69
+ declare namespace _exports {
70
+ export { _exports_HYPHEN as HYPHEN, _exports_INFINITY as INFINITY, _exports_NO_VALUE as NO_VALUE, _exports_number as number, _exports_percent as percent, _exports_skipSpaces as skipSpaces };
71
+ export type { _exports_NumberFormatSettings as NumberFormatSettings, _exports_PercentFormatSettings as PercentFormatSettings };
72
+ }
73
+
74
+ export { _exports as format };
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":["export const NO_VALUE = '–'; // en-dash\n\nexport const HYPHEN = '-';\n\nexport const INFINITY = '∞';\n","import { parser } from 'yummies/parser';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { Maybe } from 'yummies/utils/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}\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 raw = value.toFixed(digits);\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/utils/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 * 100 -> 100%\n * 99.123214412 -> 99.12%\n * 99.123214412 -> 99,12%\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 spaces in string\n */\nexport const skipSpaces = (value: string) => value.replaceAll(/\\s/g, '');\n"],"names":[],"mappings":";;AAAO,MAAM,WAAW;AAEjB,MAAM,SAAS;AAEf,MAAM,WAAW;ACgCjB,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,YAAM,MAAM,QAAQ,MAAM;AAAA,IAC5B;AACA,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;AC3ElB,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","sources":["../src/format/constants.ts","../src/format/number.ts","../src/format/percent.ts","../src/format/skip-spaces.ts"],"sourcesContent":["export const NO_VALUE = '–'; // en-dash\n\nexport const HYPHEN = '-';\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}\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 raw = value.toFixed(digits);\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 * 100 -> 100%\n * 99.123214412 -> 99.12%\n * 99.123214412 -> 99,12%\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 spaces in string\n */\nexport const skipSpaces = (value: string) => value.replaceAll(/\\s/g, '');\n"],"names":[],"mappings":";;AAAO,MAAM,WAAW;AAEjB,MAAM,SAAS;AAEf,MAAM,WAAW;ACgCjB,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,YAAM,MAAM,QAAQ,MAAM;AAAA,IAC5B;AACA,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;AC3ElB,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;;;;;;;;;;"}
package/html.cjs CHANGED
@@ -1,2 +1,168 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("dompurify"),t=require("yummies/media");const o={ALLOWED_TAGS:["a","article","b","blockquote","br","caption","code","del","details","div","em","h1","h2","h3","h4","h5","h6","hr","i","img","ins","kbd","li","main","ol","p","pre","section","span","strong","sub","summary","sup","table","tbody","td","th","thead","tr","u","ul"],ALLOWED_ATTR:["href","target","name","src","class"]};exports.calcScrollbarWidth=(e=document.body)=>{const t=document.createElement("div");t.style.visibility="hidden",t.style.width="100px",t.style.overflow="scroll",e.append(t);const o=document.createElement("div");o.style.width="100%",t.append(o);const r=t.offsetWidth-o.offsetWidth;return t.parentNode?.removeChild(t),r},exports.checkElementHasParent=(e,t)=>{let o=e;if(!t)return!1;for(;null!=o;){if(o===t)return!0;o=o.parentElement}return!1},exports.collectOffsetTop=e=>{let t=0,o=e;for(;null!=o;)t+=o.offsetTop,o=o.parentElement;return t},exports.downloadUsingAnchor=(e,o)=>{const r=t.blobToUrl(e),n=document.createElement("a");n.href=r,n.download=o??"file",n.target="_blank",document.body.append(n),n.click(),n.remove()},exports.getComputedColor=e=>{if(!e)return null;const t=document.createElement("div");t.style.color=e,document.body.append(t);const o=globalThis.getComputedStyle(t).color,r=/rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*\d+[.d+]*)*\)/g.exec(o);return t.remove(),r?`${r[1]}, ${r[2]}, ${r[3]}`:null},exports.getElementInnerHeight=function(e){const{clientHeight:t}=e,{paddingTop:o,paddingBottom:r}=getComputedStyle(e);return t-Number.parseFloat(o)-Number.parseFloat(r)},exports.getElementInnerWidth=function(e){const{clientWidth:t}=e,{paddingLeft:o,paddingRight:r}=getComputedStyle(e);return t-Number.parseFloat(o)-Number.parseFloat(r)},exports.globalScrollIntoViewForY=e=>{const t=document.body,o=window.innerHeight,r=e.getBoundingClientRect(),n=t.scrollHeight/o,s=Math.min(Math.max(r.top/o,1),n);window.scroll({top:s*o,behavior:"smooth"})},exports.isPrefersDarkTheme=()=>!!globalThis.matchMedia?.("(prefers-color-scheme: dark)")?.matches,exports.isPrefersLightTheme=()=>!!globalThis.matchMedia?.("(prefers-color-scheme: light)")?.matches,exports.sanitizeHtml=(t,r)=>e.sanitize(t||"",{...o,...r}),exports.skipEvent=e=>(e.preventDefault(),e.stopPropagation(),!1),exports.startViewTransitionSafety=(e,t)=>{if(document.startViewTransition&&!t?.disabled)return document.startViewTransition(e);e()},exports.wrapTextToTagLink=function(e){const t=String(e).replace(/^(https?:\/{0,2})?(w{3}\.)?/,"www.");return/^https?:\/{2}/.test(e)||(e=`http://${e}`),`<a href=${e} target="_blank">${t}</a>`};
1
+ "use strict";
2
+ 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]}`;
15
+ };
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();
25
+ };
26
+ 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>`;
30
+ }
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;
39
+ };
40
+ const skipEvent = (e) => {
41
+ e.preventDefault();
42
+ e.stopPropagation();
43
+ return false;
44
+ };
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
+ });
58
+ };
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"]
104
+ };
105
+ const sanitizeHtml = (html, config) => {
106
+ return DOMPurify.sanitize(html || "", {
107
+ ...sanitizeDefaults,
108
+ ...config
109
+ });
110
+ };
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;
122
+ };
123
+ const startViewTransitionSafety = (fn, params) => {
124
+ if (document.startViewTransition && !params?.disabled) {
125
+ return document.startViewTransition(fn);
126
+ }
127
+ fn();
128
+ };
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;
141
+ };
142
+ function getElementInnerHeight(element) {
143
+ const { clientHeight } = element;
144
+ const { paddingTop, paddingBottom } = getComputedStyle(element);
145
+ return clientHeight - Number.parseFloat(paddingTop) - Number.parseFloat(paddingBottom);
146
+ }
147
+ function getElementInnerWidth(el) {
148
+ const { clientWidth } = el;
149
+ const { paddingLeft, paddingRight } = getComputedStyle(el);
150
+ return clientWidth - Number.parseFloat(paddingLeft) - Number.parseFloat(paddingRight);
151
+ }
152
+ const isPrefersDarkTheme = () => !!globalThis.matchMedia?.("(prefers-color-scheme: dark)")?.matches;
153
+ const isPrefersLightTheme = () => !!globalThis.matchMedia?.("(prefers-color-scheme: light)")?.matches;
154
+ exports.calcScrollbarWidth = calcScrollbarWidth;
155
+ exports.checkElementHasParent = checkElementHasParent;
156
+ exports.collectOffsetTop = collectOffsetTop;
157
+ exports.downloadUsingAnchor = downloadUsingAnchor;
158
+ exports.getComputedColor = getComputedColor;
159
+ exports.getElementInnerHeight = getElementInnerHeight;
160
+ exports.getElementInnerWidth = getElementInnerWidth;
161
+ exports.globalScrollIntoViewForY = globalScrollIntoViewForY;
162
+ exports.isPrefersDarkTheme = isPrefersDarkTheme;
163
+ exports.isPrefersLightTheme = isPrefersLightTheme;
164
+ exports.sanitizeHtml = sanitizeHtml;
165
+ exports.skipEvent = skipEvent;
166
+ exports.startViewTransitionSafety = startViewTransitionSafety;
167
+ exports.wrapTextToTagLink = wrapTextToTagLink;
2
168
  //# sourceMappingURL=html.cjs.map
package/html.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"html.cjs","sources":["../src/html.ts"],"sourcesContent":["import DOMPurify, { type Config as DOMPurifyConfig } from 'dompurify';\nimport { blobToUrl } from 'yummies/media';\nimport type { Maybe } from 'yummies/utils/types';\n\n/**\n * Вытаскивает RGB из любого цвета\n *\n * Не рекомендуется к использованию так как вызывает reflow\n */\nexport const getComputedColor = (color?: string): string | null => {\n if (!color) return null;\n\n const d = document.createElement('div');\n d.style.color = color;\n document.body.append(d);\n const rgbcolor = globalThis.getComputedStyle(d).color;\n const match =\n /rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*\\d+[.d+]*)*\\)/g.exec(rgbcolor);\n\n d.remove();\n\n if (!match) return null;\n\n return `${match[1]}, ${match[2]}, ${match[3]}`;\n};\n\nexport const downloadUsingAnchor = (\n urlOrBlob: string | Blob,\n fileName?: string,\n) => {\n const url = blobToUrl(urlOrBlob);\n\n const a = document.createElement('a');\n a.href = url;\n\n a.download = fileName ?? 'file';\n\n a.target = '_blank';\n\n document.body.append(a);\n\n a.click();\n\n a.remove();\n};\n\n/**\n * Surrounds string in an anchor tag\n */\nexport function wrapTextToTagLink(link: string) {\n const descr = String(link).replace(/^(https?:\\/{0,2})?(w{3}\\.)?/, 'www.');\n if (!/^https?:\\/{2}/.test(link)) link = `http://${link}`;\n return `<a href=${link} target=\"_blank\">${descr}</a>`;\n}\n\nexport const collectOffsetTop = (element: HTMLElement | null) => {\n let offsetTop = 0;\n let node = element;\n\n while (node != null) {\n offsetTop += node.offsetTop;\n node = node.parentElement;\n }\n\n return offsetTop;\n};\n\nexport const skipEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n\n return false;\n};\n\nexport const globalScrollIntoViewForY = (node: HTMLElement) => {\n const scrollContainer = document.body;\n const pageHeight = window.innerHeight;\n const nodeBounding = node.getBoundingClientRect();\n const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;\n\n const scrollPageNumber = Math.min(\n Math.max(nodeBounding.top / pageHeight, 1),\n scrollPagesCount,\n );\n\n window.scroll({\n top: scrollPageNumber * pageHeight,\n behavior: 'smooth',\n });\n};\n\nconst sanitizeDefaults: DOMPurifyConfig = {\n ALLOWED_TAGS: [\n 'a',\n 'article',\n 'b',\n 'blockquote',\n 'br',\n 'caption',\n 'code',\n 'del',\n 'details',\n 'div',\n 'em',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'kbd',\n 'li',\n 'main',\n 'ol',\n 'p',\n 'pre',\n 'section',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'th',\n 'thead',\n 'tr',\n 'u',\n 'ul',\n ],\n ALLOWED_ATTR: ['href', 'target', 'name', 'src', 'class'],\n};\n\nexport const sanitizeHtml = (html: Maybe<string>, config?: DOMPurifyConfig) => {\n return DOMPurify.sanitize(html || '', {\n ...sanitizeDefaults,\n ...config,\n });\n};\n\nexport const checkElementHasParent = (\n element: HTMLElement | null,\n parent: Maybe<HTMLElement>,\n) => {\n let node = element;\n\n if (!parent) return false;\n\n while (node != null) {\n if (node === parent) {\n return true;\n } else {\n node = node.parentElement;\n }\n }\n\n return false;\n};\n\n/**\n * Executes a function within a view transition if supported by the browser.\n *\n * @param {VoidFunction} fn - The function to be executed.\n * @returns {ViewTransition} - The result of the executed function.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition | MDN: Document.startViewTransition}\n */\nexport const startViewTransitionSafety = (\n fn: VoidFunction,\n params?: { disabled?: boolean },\n) => {\n if (document.startViewTransition && !params?.disabled) {\n return document.startViewTransition(fn);\n }\n fn();\n};\n\n/**\n * Вычисляет размер скроллбара\n */\nexport const calcScrollbarWidth = (elementToAppend = document.body) => {\n const outer = document.createElement('div');\n\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.overflow = 'scroll';\n\n elementToAppend.append(outer);\n\n const inner = document.createElement('div');\n inner.style.width = '100%';\n\n outer.append(inner);\n\n const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;\n\n outer.parentNode?.removeChild(outer);\n\n return scrollbarWidth;\n};\n\n/**\n * Calculates the inner height of an HTML element, accounting for padding.\n */\nexport function getElementInnerHeight(element: HTMLElement) {\n const { clientHeight } = element;\n const { paddingTop, paddingBottom } = getComputedStyle(element);\n return (\n clientHeight -\n Number.parseFloat(paddingTop) -\n Number.parseFloat(paddingBottom)\n );\n}\n\n/**\n * Calculates the inner width of an HTML element, accounting for padding.\n */\nexport function getElementInnerWidth(el: HTMLElement) {\n const { clientWidth } = el;\n const { paddingLeft, paddingRight } = getComputedStyle(el);\n return (\n clientWidth -\n Number.parseFloat(paddingLeft) -\n Number.parseFloat(paddingRight)\n );\n}\n\nexport const isPrefersDarkTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n\nexport const isPrefersLightTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: light)')?.matches;\n"],"names":["sanitizeDefaults","ALLOWED_TAGS","ALLOWED_ATTR","elementToAppend","document","body","outer","createElement","style","visibility","width","overflow","append","inner","scrollbarWidth","offsetWidth","parentNode","removeChild","element","parent","node","parentElement","offsetTop","urlOrBlob","fileName","url","blobToUrl","a","href","download","target","click","remove","color","d","rgbcolor","globalThis","getComputedStyle","match","exec","clientHeight","paddingTop","paddingBottom","Number","parseFloat","el","clientWidth","paddingLeft","paddingRight","scrollContainer","pageHeight","window","innerHeight","nodeBounding","getBoundingClientRect","scrollPagesCount","scrollHeight","scrollPageNumber","Math","min","max","top","scroll","behavior","matchMedia","matches","html","config","DOMPurify","sanitize","e","preventDefault","stopPropagation","fn","params","startViewTransition","disabled","link","descr","String","replace","test"],"mappings":"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"}
1
+ {"version":3,"file":"html.cjs","sources":["../src/html.ts"],"sourcesContent":["import DOMPurify, { type Config as DOMPurifyConfig } from 'dompurify';\nimport { blobToUrl } from 'yummies/media';\nimport type { Maybe } from 'yummies/types';\n\n/**\n * Вытаскивает RGB из любого цвета\n *\n * Не рекомендуется к использованию так как вызывает reflow\n */\nexport const getComputedColor = (color?: string): string | null => {\n if (!color) return null;\n\n const d = document.createElement('div');\n d.style.color = color;\n document.body.append(d);\n const rgbcolor = globalThis.getComputedStyle(d).color;\n const match =\n /rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*\\d+[.d+]*)*\\)/g.exec(rgbcolor);\n\n d.remove();\n\n if (!match) return null;\n\n return `${match[1]}, ${match[2]}, ${match[3]}`;\n};\n\nexport const downloadUsingAnchor = (\n urlOrBlob: string | Blob,\n fileName?: string,\n) => {\n const url = blobToUrl(urlOrBlob);\n\n const a = document.createElement('a');\n a.href = url;\n\n a.download = fileName ?? 'file';\n\n a.target = '_blank';\n\n document.body.append(a);\n\n a.click();\n\n a.remove();\n};\n\n/**\n * Surrounds string in an anchor tag\n */\nexport function wrapTextToTagLink(link: string) {\n const descr = String(link).replace(/^(https?:\\/{0,2})?(w{3}\\.)?/, 'www.');\n if (!/^https?:\\/{2}/.test(link)) link = `http://${link}`;\n return `<a href=${link} target=\"_blank\">${descr}</a>`;\n}\n\nexport const collectOffsetTop = (element: HTMLElement | null) => {\n let offsetTop = 0;\n let node = element;\n\n while (node != null) {\n offsetTop += node.offsetTop;\n node = node.parentElement;\n }\n\n return offsetTop;\n};\n\nexport const skipEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n\n return false;\n};\n\nexport const globalScrollIntoViewForY = (node: HTMLElement) => {\n const scrollContainer = document.body;\n const pageHeight = window.innerHeight;\n const nodeBounding = node.getBoundingClientRect();\n const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;\n\n const scrollPageNumber = Math.min(\n Math.max(nodeBounding.top / pageHeight, 1),\n scrollPagesCount,\n );\n\n window.scroll({\n top: scrollPageNumber * pageHeight,\n behavior: 'smooth',\n });\n};\n\nconst sanitizeDefaults: DOMPurifyConfig = {\n ALLOWED_TAGS: [\n 'a',\n 'article',\n 'b',\n 'blockquote',\n 'br',\n 'caption',\n 'code',\n 'del',\n 'details',\n 'div',\n 'em',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'kbd',\n 'li',\n 'main',\n 'ol',\n 'p',\n 'pre',\n 'section',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'th',\n 'thead',\n 'tr',\n 'u',\n 'ul',\n ],\n ALLOWED_ATTR: ['href', 'target', 'name', 'src', 'class'],\n};\n\nexport const sanitizeHtml = (html: Maybe<string>, config?: DOMPurifyConfig) => {\n return DOMPurify.sanitize(html || '', {\n ...sanitizeDefaults,\n ...config,\n });\n};\n\nexport const checkElementHasParent = (\n element: HTMLElement | null,\n parent: Maybe<HTMLElement>,\n) => {\n let node = element;\n\n if (!parent) return false;\n\n while (node != null) {\n if (node === parent) {\n return true;\n } else {\n node = node.parentElement;\n }\n }\n\n return false;\n};\n\n/**\n * Executes a function within a view transition if supported by the browser.\n *\n * @param {VoidFunction} fn - The function to be executed.\n * @returns {ViewTransition} - The result of the executed function.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition | MDN: Document.startViewTransition}\n */\nexport const startViewTransitionSafety = (\n fn: VoidFunction,\n params?: { disabled?: boolean },\n) => {\n if (document.startViewTransition && !params?.disabled) {\n return document.startViewTransition(fn);\n }\n fn();\n};\n\n/**\n * Вычисляет размер скроллбара\n */\nexport const calcScrollbarWidth = (elementToAppend = document.body) => {\n const outer = document.createElement('div');\n\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.overflow = 'scroll';\n\n elementToAppend.append(outer);\n\n const inner = document.createElement('div');\n inner.style.width = '100%';\n\n outer.append(inner);\n\n const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;\n\n outer.parentNode?.removeChild(outer);\n\n return scrollbarWidth;\n};\n\n/**\n * Calculates the inner height of an HTML element, accounting for padding.\n */\nexport function getElementInnerHeight(element: HTMLElement) {\n const { clientHeight } = element;\n const { paddingTop, paddingBottom } = getComputedStyle(element);\n return (\n clientHeight -\n Number.parseFloat(paddingTop) -\n Number.parseFloat(paddingBottom)\n );\n}\n\n/**\n * Calculates the inner width of an HTML element, accounting for padding.\n */\nexport function getElementInnerWidth(el: HTMLElement) {\n const { clientWidth } = el;\n const { paddingLeft, paddingRight } = getComputedStyle(el);\n return (\n clientWidth -\n Number.parseFloat(paddingLeft) -\n Number.parseFloat(paddingRight)\n );\n}\n\nexport const isPrefersDarkTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n\nexport const isPrefersLightTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: light)')?.matches;\n"],"names":["blobToUrl"],"mappings":"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"}
package/html.d.ts CHANGED
@@ -1,21 +1,22 @@
1
- import { Config as DOMPurifyConfig } from 'dompurify';
2
- import { Maybe } from './utils/types.ts';
1
+ import { Config } from 'dompurify';
2
+ import { Maybe } from 'yummies/types';
3
+
3
4
  /**
4
5
  * Вытаскивает RGB из любого цвета
5
6
  *
6
7
  * Не рекомендуется к использованию так как вызывает reflow
7
8
  */
8
- export declare const getComputedColor: (color?: string) => string | null;
9
- export declare const downloadUsingAnchor: (urlOrBlob: string | Blob, fileName?: string) => void;
9
+ declare const getComputedColor: (color?: string) => string | null;
10
+ declare const downloadUsingAnchor: (urlOrBlob: string | Blob, fileName?: string) => void;
10
11
  /**
11
12
  * Surrounds string in an anchor tag
12
13
  */
13
- export declare function wrapTextToTagLink(link: string): string;
14
- export declare const collectOffsetTop: (element: HTMLElement | null) => number;
15
- export declare const skipEvent: (e: Event) => boolean;
16
- export declare const globalScrollIntoViewForY: (node: HTMLElement) => void;
17
- export declare const sanitizeHtml: (html: Maybe<string>, config?: DOMPurifyConfig) => string;
18
- export declare const checkElementHasParent: (element: HTMLElement | null, parent: Maybe<HTMLElement>) => boolean;
14
+ declare function wrapTextToTagLink(link: string): string;
15
+ declare const collectOffsetTop: (element: HTMLElement | null) => number;
16
+ declare const skipEvent: (e: Event) => boolean;
17
+ declare const globalScrollIntoViewForY: (node: HTMLElement) => void;
18
+ declare const sanitizeHtml: (html: Maybe<string>, config?: Config) => string;
19
+ declare const checkElementHasParent: (element: HTMLElement | null, parent: Maybe<HTMLElement>) => boolean;
19
20
  /**
20
21
  * Executes a function within a view transition if supported by the browser.
21
22
  *
@@ -24,21 +25,22 @@ export declare const checkElementHasParent: (element: HTMLElement | null, parent
24
25
  *
25
26
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition | MDN: Document.startViewTransition}
26
27
  */
27
- export declare const startViewTransitionSafety: (fn: VoidFunction, params?: {
28
+ declare const startViewTransitionSafety: (fn: VoidFunction, params?: {
28
29
  disabled?: boolean;
29
30
  }) => ViewTransition | undefined;
30
31
  /**
31
32
  * Вычисляет размер скроллбара
32
33
  */
33
- export declare const calcScrollbarWidth: (elementToAppend?: HTMLElement) => number;
34
+ declare const calcScrollbarWidth: (elementToAppend?: HTMLElement) => number;
34
35
  /**
35
36
  * Calculates the inner height of an HTML element, accounting for padding.
36
37
  */
37
- export declare function getElementInnerHeight(element: HTMLElement): number;
38
+ declare function getElementInnerHeight(element: HTMLElement): number;
38
39
  /**
39
40
  * Calculates the inner width of an HTML element, accounting for padding.
40
41
  */
41
- export declare function getElementInnerWidth(el: HTMLElement): number;
42
- export declare const isPrefersDarkTheme: () => boolean;
43
- export declare const isPrefersLightTheme: () => boolean;
44
- //# sourceMappingURL=html.d.ts.map
42
+ declare function getElementInnerWidth(el: HTMLElement): number;
43
+ declare const isPrefersDarkTheme: () => boolean;
44
+ declare const isPrefersLightTheme: () => boolean;
45
+
46
+ export { calcScrollbarWidth, checkElementHasParent, collectOffsetTop, downloadUsingAnchor, getComputedColor, getElementInnerHeight, getElementInnerWidth, globalScrollIntoViewForY, isPrefersDarkTheme, isPrefersLightTheme, sanitizeHtml, skipEvent, startViewTransitionSafety, wrapTextToTagLink };
package/html.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sources":["../src/html.ts"],"sourcesContent":["import DOMPurify, { type Config as DOMPurifyConfig } from 'dompurify';\nimport { blobToUrl } from 'yummies/media';\nimport type { Maybe } from 'yummies/utils/types';\n\n/**\n * Вытаскивает RGB из любого цвета\n *\n * Не рекомендуется к использованию так как вызывает reflow\n */\nexport const getComputedColor = (color?: string): string | null => {\n if (!color) return null;\n\n const d = document.createElement('div');\n d.style.color = color;\n document.body.append(d);\n const rgbcolor = globalThis.getComputedStyle(d).color;\n const match =\n /rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*\\d+[.d+]*)*\\)/g.exec(rgbcolor);\n\n d.remove();\n\n if (!match) return null;\n\n return `${match[1]}, ${match[2]}, ${match[3]}`;\n};\n\nexport const downloadUsingAnchor = (\n urlOrBlob: string | Blob,\n fileName?: string,\n) => {\n const url = blobToUrl(urlOrBlob);\n\n const a = document.createElement('a');\n a.href = url;\n\n a.download = fileName ?? 'file';\n\n a.target = '_blank';\n\n document.body.append(a);\n\n a.click();\n\n a.remove();\n};\n\n/**\n * Surrounds string in an anchor tag\n */\nexport function wrapTextToTagLink(link: string) {\n const descr = String(link).replace(/^(https?:\\/{0,2})?(w{3}\\.)?/, 'www.');\n if (!/^https?:\\/{2}/.test(link)) link = `http://${link}`;\n return `<a href=${link} target=\"_blank\">${descr}</a>`;\n}\n\nexport const collectOffsetTop = (element: HTMLElement | null) => {\n let offsetTop = 0;\n let node = element;\n\n while (node != null) {\n offsetTop += node.offsetTop;\n node = node.parentElement;\n }\n\n return offsetTop;\n};\n\nexport const skipEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n\n return false;\n};\n\nexport const globalScrollIntoViewForY = (node: HTMLElement) => {\n const scrollContainer = document.body;\n const pageHeight = window.innerHeight;\n const nodeBounding = node.getBoundingClientRect();\n const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;\n\n const scrollPageNumber = Math.min(\n Math.max(nodeBounding.top / pageHeight, 1),\n scrollPagesCount,\n );\n\n window.scroll({\n top: scrollPageNumber * pageHeight,\n behavior: 'smooth',\n });\n};\n\nconst sanitizeDefaults: DOMPurifyConfig = {\n ALLOWED_TAGS: [\n 'a',\n 'article',\n 'b',\n 'blockquote',\n 'br',\n 'caption',\n 'code',\n 'del',\n 'details',\n 'div',\n 'em',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'kbd',\n 'li',\n 'main',\n 'ol',\n 'p',\n 'pre',\n 'section',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'th',\n 'thead',\n 'tr',\n 'u',\n 'ul',\n ],\n ALLOWED_ATTR: ['href', 'target', 'name', 'src', 'class'],\n};\n\nexport const sanitizeHtml = (html: Maybe<string>, config?: DOMPurifyConfig) => {\n return DOMPurify.sanitize(html || '', {\n ...sanitizeDefaults,\n ...config,\n });\n};\n\nexport const checkElementHasParent = (\n element: HTMLElement | null,\n parent: Maybe<HTMLElement>,\n) => {\n let node = element;\n\n if (!parent) return false;\n\n while (node != null) {\n if (node === parent) {\n return true;\n } else {\n node = node.parentElement;\n }\n }\n\n return false;\n};\n\n/**\n * Executes a function within a view transition if supported by the browser.\n *\n * @param {VoidFunction} fn - The function to be executed.\n * @returns {ViewTransition} - The result of the executed function.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition | MDN: Document.startViewTransition}\n */\nexport const startViewTransitionSafety = (\n fn: VoidFunction,\n params?: { disabled?: boolean },\n) => {\n if (document.startViewTransition && !params?.disabled) {\n return document.startViewTransition(fn);\n }\n fn();\n};\n\n/**\n * Вычисляет размер скроллбара\n */\nexport const calcScrollbarWidth = (elementToAppend = document.body) => {\n const outer = document.createElement('div');\n\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.overflow = 'scroll';\n\n elementToAppend.append(outer);\n\n const inner = document.createElement('div');\n inner.style.width = '100%';\n\n outer.append(inner);\n\n const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;\n\n outer.parentNode?.removeChild(outer);\n\n return scrollbarWidth;\n};\n\n/**\n * Calculates the inner height of an HTML element, accounting for padding.\n */\nexport function getElementInnerHeight(element: HTMLElement) {\n const { clientHeight } = element;\n const { paddingTop, paddingBottom } = getComputedStyle(element);\n return (\n clientHeight -\n Number.parseFloat(paddingTop) -\n Number.parseFloat(paddingBottom)\n );\n}\n\n/**\n * Calculates the inner width of an HTML element, accounting for padding.\n */\nexport function getElementInnerWidth(el: HTMLElement) {\n const { clientWidth } = el;\n const { paddingLeft, paddingRight } = getComputedStyle(el);\n return (\n clientWidth -\n Number.parseFloat(paddingLeft) -\n Number.parseFloat(paddingRight)\n );\n}\n\nexport const isPrefersDarkTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n\nexport const isPrefersLightTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: light)')?.matches;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"html.js","sources":["../src/html.ts"],"sourcesContent":["import DOMPurify, { type Config as DOMPurifyConfig } from 'dompurify';\nimport { blobToUrl } from 'yummies/media';\nimport type { Maybe } from 'yummies/types';\n\n/**\n * Вытаскивает RGB из любого цвета\n *\n * Не рекомендуется к использованию так как вызывает reflow\n */\nexport const getComputedColor = (color?: string): string | null => {\n if (!color) return null;\n\n const d = document.createElement('div');\n d.style.color = color;\n document.body.append(d);\n const rgbcolor = globalThis.getComputedStyle(d).color;\n const match =\n /rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*\\d+[.d+]*)*\\)/g.exec(rgbcolor);\n\n d.remove();\n\n if (!match) return null;\n\n return `${match[1]}, ${match[2]}, ${match[3]}`;\n};\n\nexport const downloadUsingAnchor = (\n urlOrBlob: string | Blob,\n fileName?: string,\n) => {\n const url = blobToUrl(urlOrBlob);\n\n const a = document.createElement('a');\n a.href = url;\n\n a.download = fileName ?? 'file';\n\n a.target = '_blank';\n\n document.body.append(a);\n\n a.click();\n\n a.remove();\n};\n\n/**\n * Surrounds string in an anchor tag\n */\nexport function wrapTextToTagLink(link: string) {\n const descr = String(link).replace(/^(https?:\\/{0,2})?(w{3}\\.)?/, 'www.');\n if (!/^https?:\\/{2}/.test(link)) link = `http://${link}`;\n return `<a href=${link} target=\"_blank\">${descr}</a>`;\n}\n\nexport const collectOffsetTop = (element: HTMLElement | null) => {\n let offsetTop = 0;\n let node = element;\n\n while (node != null) {\n offsetTop += node.offsetTop;\n node = node.parentElement;\n }\n\n return offsetTop;\n};\n\nexport const skipEvent = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n\n return false;\n};\n\nexport const globalScrollIntoViewForY = (node: HTMLElement) => {\n const scrollContainer = document.body;\n const pageHeight = window.innerHeight;\n const nodeBounding = node.getBoundingClientRect();\n const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;\n\n const scrollPageNumber = Math.min(\n Math.max(nodeBounding.top / pageHeight, 1),\n scrollPagesCount,\n );\n\n window.scroll({\n top: scrollPageNumber * pageHeight,\n behavior: 'smooth',\n });\n};\n\nconst sanitizeDefaults: DOMPurifyConfig = {\n ALLOWED_TAGS: [\n 'a',\n 'article',\n 'b',\n 'blockquote',\n 'br',\n 'caption',\n 'code',\n 'del',\n 'details',\n 'div',\n 'em',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'kbd',\n 'li',\n 'main',\n 'ol',\n 'p',\n 'pre',\n 'section',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'th',\n 'thead',\n 'tr',\n 'u',\n 'ul',\n ],\n ALLOWED_ATTR: ['href', 'target', 'name', 'src', 'class'],\n};\n\nexport const sanitizeHtml = (html: Maybe<string>, config?: DOMPurifyConfig) => {\n return DOMPurify.sanitize(html || '', {\n ...sanitizeDefaults,\n ...config,\n });\n};\n\nexport const checkElementHasParent = (\n element: HTMLElement | null,\n parent: Maybe<HTMLElement>,\n) => {\n let node = element;\n\n if (!parent) return false;\n\n while (node != null) {\n if (node === parent) {\n return true;\n } else {\n node = node.parentElement;\n }\n }\n\n return false;\n};\n\n/**\n * Executes a function within a view transition if supported by the browser.\n *\n * @param {VoidFunction} fn - The function to be executed.\n * @returns {ViewTransition} - The result of the executed function.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition | MDN: Document.startViewTransition}\n */\nexport const startViewTransitionSafety = (\n fn: VoidFunction,\n params?: { disabled?: boolean },\n) => {\n if (document.startViewTransition && !params?.disabled) {\n return document.startViewTransition(fn);\n }\n fn();\n};\n\n/**\n * Вычисляет размер скроллбара\n */\nexport const calcScrollbarWidth = (elementToAppend = document.body) => {\n const outer = document.createElement('div');\n\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.overflow = 'scroll';\n\n elementToAppend.append(outer);\n\n const inner = document.createElement('div');\n inner.style.width = '100%';\n\n outer.append(inner);\n\n const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;\n\n outer.parentNode?.removeChild(outer);\n\n return scrollbarWidth;\n};\n\n/**\n * Calculates the inner height of an HTML element, accounting for padding.\n */\nexport function getElementInnerHeight(element: HTMLElement) {\n const { clientHeight } = element;\n const { paddingTop, paddingBottom } = getComputedStyle(element);\n return (\n clientHeight -\n Number.parseFloat(paddingTop) -\n Number.parseFloat(paddingBottom)\n );\n}\n\n/**\n * Calculates the inner width of an HTML element, accounting for padding.\n */\nexport function getElementInnerWidth(el: HTMLElement) {\n const { clientWidth } = el;\n const { paddingLeft, paddingRight } = getComputedStyle(el);\n return (\n clientWidth -\n Number.parseFloat(paddingLeft) -\n Number.parseFloat(paddingRight)\n );\n}\n\nexport const isPrefersDarkTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n\nexport const isPrefersLightTheme = () =>\n !!globalThis.matchMedia?.('(prefers-color-scheme: light)')?.matches;\n"],"names":[],"mappings":"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"}
package/id.cjs CHANGED
@@ -1,2 +1,26 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("nanoid"),t="0123456789",r=`abcdefghijklmnopqrstuvwxyz${t}`,o=e.customAlphabet(r,6),a=e.customAlphabet(r,4),n=e.customAlphabet(t,6),s=e.customAlphabet(t,4),c=(e=9)=>{let t=0;return()=>(t++).toString().padStart(e,"0")},i=c();exports.createLinearNumericIdGenerator=c,exports.generateId=o,exports.generateLinearNumericId=i,exports.generateNumericId=n,exports.generateNumericShortId=s,exports.generateShortId=a,exports.generateStackBasedId=()=>(new Error).stack.split("\n").slice(1,4).join("");
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const nanoid = require("nanoid");
4
+ const DIGITS = "0123456789";
5
+ const LATIN_CHARS = "abcdefghijklmnopqrstuvwxyz";
6
+ const ALPHABET = `${LATIN_CHARS}${DIGITS}`;
7
+ const generateId = nanoid.customAlphabet(ALPHABET, 6);
8
+ const generateShortId = nanoid.customAlphabet(ALPHABET, 4);
9
+ const generateNumericId = nanoid.customAlphabet(DIGITS, 6);
10
+ const generateNumericShortId = nanoid.customAlphabet(DIGITS, 4);
11
+ const createLinearNumericIdGenerator = (size = 9) => {
12
+ let lastCount = 0;
13
+ return () => {
14
+ return (lastCount++).toString().padStart(size, "0");
15
+ };
16
+ };
17
+ const generateLinearNumericId = createLinearNumericIdGenerator();
18
+ const generateStackBasedId = () => new Error().stack.split("\n").slice(1, 4).join("");
19
+ exports.createLinearNumericIdGenerator = createLinearNumericIdGenerator;
20
+ exports.generateId = generateId;
21
+ exports.generateLinearNumericId = generateLinearNumericId;
22
+ exports.generateNumericId = generateNumericId;
23
+ exports.generateNumericShortId = generateNumericShortId;
24
+ exports.generateShortId = generateShortId;
25
+ exports.generateStackBasedId = generateStackBasedId;
2
26
  //# sourceMappingURL=id.cjs.map
package/id.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"id.cjs","sources":["../src/id.ts"],"sourcesContent":["import { customAlphabet } from 'nanoid';\n\nconst DIGITS = '0123456789';\nconst LATIN_CHARS = 'abcdefghijklmnopqrstuvwxyz';\n\nconst ALPHABET = `${LATIN_CHARS}${DIGITS}`;\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 6\n */\nexport const generateId = customAlphabet(ALPHABET, 6);\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 4\n */\nexport const generateShortId = customAlphabet(ALPHABET, 4);\n\n/**\n * Использует алфавит 0123456789\n * Размер 6\n */\nexport const generateNumericId = customAlphabet(DIGITS, 6);\n\n/**\n * Использует алфавит 0123456789\n * Размер 4\n */\nexport const generateNumericShortId = customAlphabet(DIGITS, 4);\n\n/**\n * Создает функцию, которая будет создавать уникальную строку, уникальность которой основана на порядке вызова этой функции\n *\n * @example\n * ```ts\n * generateLinearNumericId = createLinearNumericIdGenerator(6);\n * generateLinearNumericId() // '000000'\n * generateLinearNumericId() // '000001'\n * ...\n * generateLinearNumericId() // '999999'\n * generateLinearNumericId() // '1000000'\n * ...\n * generateLinearNumericId() // '9999999'\n * generateLinearNumericId() // '10000000'\n * ```\n *\n * @param size размер\n * @returns {()=>string}\n */\nexport const createLinearNumericIdGenerator = (size: number = 9) => {\n let lastCount = 0;\n return () => {\n return (lastCount++).toString().padStart(size, '0');\n };\n};\n\n/**\n *\n * @example\n * ```ts\n * generateLinearNumericId() // '000000000'\n * generateLinearNumericId() // '000000001'\n * ...\n * generateLinearNumericId() // '999999999'\n * generateLinearNumericId() // '1000000000'\n * ...\n * generateLinearNumericId() // '9999999999'\n * generateLinearNumericId() // '10000000000'\n * ```\n *\n */\nexport const generateLinearNumericId = createLinearNumericIdGenerator();\n\n/**\n * Is not recommended to use.\n *\n * Generates execution stack based pseudo-id (just sliced string from error stack)\n */\nexport const generateStackBasedId = () =>\n new Error().stack!.split('\\n').slice(1, 4).join('');\n"],"names":["DIGITS","ALPHABET","generateId","customAlphabet","generateShortId","generateNumericId","generateNumericShortId","createLinearNumericIdGenerator","size","lastCount","toString","padStart","generateLinearNumericId","Error","stack","split","slice","join"],"mappings":"0GAEMA,EAAS,aAGTC,EAAW,6BAAiBD,IAMrBE,EAAaC,EAAAA,eAAeF,EAAU,GAMtCG,EAAkBD,EAAAA,eAAeF,EAAU,GAM3CI,EAAoBF,EAAAA,eAAeH,EAAQ,GAM3CM,EAAyBH,EAAAA,eAAeH,EAAQ,GAqBhDO,EAAiC,CAACC,EAAe,KAC5D,IAAIC,EAAY,EAChB,MAAO,KACGA,KAAaC,WAAWC,SAASH,EAAM,MAmBtCI,EAA0BL,wNAOH,KAClC,IAAIM,OAAQC,MAAOC,MAAM,MAAMC,MAAM,EAAG,GAAGC,KAAK"}
1
+ {"version":3,"file":"id.cjs","sources":["../src/id.ts"],"sourcesContent":["import { customAlphabet } from 'nanoid';\n\nconst DIGITS = '0123456789';\nconst LATIN_CHARS = 'abcdefghijklmnopqrstuvwxyz';\n\nconst ALPHABET = `${LATIN_CHARS}${DIGITS}`;\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 6\n */\nexport const generateId = customAlphabet(ALPHABET, 6);\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 4\n */\nexport const generateShortId = customAlphabet(ALPHABET, 4);\n\n/**\n * Использует алфавит 0123456789\n * Размер 6\n */\nexport const generateNumericId = customAlphabet(DIGITS, 6);\n\n/**\n * Использует алфавит 0123456789\n * Размер 4\n */\nexport const generateNumericShortId = customAlphabet(DIGITS, 4);\n\n/**\n * Создает функцию, которая будет создавать уникальную строку, уникальность которой основана на порядке вызова этой функции\n *\n * @example\n * ```ts\n * generateLinearNumericId = createLinearNumericIdGenerator(6);\n * generateLinearNumericId() // '000000'\n * generateLinearNumericId() // '000001'\n * ...\n * generateLinearNumericId() // '999999'\n * generateLinearNumericId() // '1000000'\n * ...\n * generateLinearNumericId() // '9999999'\n * generateLinearNumericId() // '10000000'\n * ```\n *\n * @param size размер\n * @returns {()=>string}\n */\nexport const createLinearNumericIdGenerator = (size: number = 9) => {\n let lastCount = 0;\n return () => {\n return (lastCount++).toString().padStart(size, '0');\n };\n};\n\n/**\n *\n * @example\n * ```ts\n * generateLinearNumericId() // '000000000'\n * generateLinearNumericId() // '000000001'\n * ...\n * generateLinearNumericId() // '999999999'\n * generateLinearNumericId() // '1000000000'\n * ...\n * generateLinearNumericId() // '9999999999'\n * generateLinearNumericId() // '10000000000'\n * ```\n *\n */\nexport const generateLinearNumericId = createLinearNumericIdGenerator();\n\n/**\n * Is not recommended to use.\n *\n * Generates execution stack based pseudo-id (just sliced string from error stack)\n */\nexport const generateStackBasedId = () =>\n new Error().stack!.split('\\n').slice(1, 4).join('');\n"],"names":["customAlphabet"],"mappings":";;;AAEA,MAAM,SAAS;AACf,MAAM,cAAc;AAEpB,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM;AAMjC,MAAM,aAAaA,OAAAA,eAAe,UAAU,CAAC;AAM7C,MAAM,kBAAkBA,OAAAA,eAAe,UAAU,CAAC;AAMlD,MAAM,oBAAoBA,OAAAA,eAAe,QAAQ,CAAC;AAMlD,MAAM,yBAAyBA,OAAAA,eAAe,QAAQ,CAAC;AAqBvD,MAAM,iCAAiC,CAAC,OAAe,MAAM;AAClE,MAAI,YAAY;AAChB,SAAO,MAAM;AACX,YAAQ,aAAa,SAAA,EAAW,SAAS,MAAM,GAAG;AAAA,EACpD;AACF;AAiBO,MAAM,0BAA0B,+BAAA;AAOhC,MAAM,uBAAuB,MAClC,IAAI,MAAA,EAAQ,MAAO,MAAM,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE;;;;;;;;"}
package/id.d.ts CHANGED
@@ -2,22 +2,22 @@
2
2
  * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789
3
3
  * Размер 6
4
4
  */
5
- export declare const generateId: (size?: number) => string;
5
+ declare const generateId: (size?: number) => string;
6
6
  /**
7
7
  * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789
8
8
  * Размер 4
9
9
  */
10
- export declare const generateShortId: (size?: number) => string;
10
+ declare const generateShortId: (size?: number) => string;
11
11
  /**
12
12
  * Использует алфавит 0123456789
13
13
  * Размер 6
14
14
  */
15
- export declare const generateNumericId: (size?: number) => string;
15
+ declare const generateNumericId: (size?: number) => string;
16
16
  /**
17
17
  * Использует алфавит 0123456789
18
18
  * Размер 4
19
19
  */
20
- export declare const generateNumericShortId: (size?: number) => string;
20
+ declare const generateNumericShortId: (size?: number) => string;
21
21
  /**
22
22
  * Создает функцию, которая будет создавать уникальную строку, уникальность которой основана на порядке вызова этой функции
23
23
  *
@@ -37,7 +37,7 @@ export declare const generateNumericShortId: (size?: number) => string;
37
37
  * @param size размер
38
38
  * @returns {()=>string}
39
39
  */
40
- export declare const createLinearNumericIdGenerator: (size?: number) => () => string;
40
+ declare const createLinearNumericIdGenerator: (size?: number) => () => string;
41
41
  /**
42
42
  *
43
43
  * @example
@@ -53,11 +53,12 @@ export declare const createLinearNumericIdGenerator: (size?: number) => () => st
53
53
  * ```
54
54
  *
55
55
  */
56
- export declare const generateLinearNumericId: () => string;
56
+ declare const generateLinearNumericId: () => string;
57
57
  /**
58
58
  * Is not recommended to use.
59
59
  *
60
60
  * Generates execution stack based pseudo-id (just sliced string from error stack)
61
61
  */
62
- export declare const generateStackBasedId: () => string;
63
- //# sourceMappingURL=id.d.ts.map
62
+ declare const generateStackBasedId: () => string;
63
+
64
+ export { createLinearNumericIdGenerator, generateId, generateLinearNumericId, generateNumericId, generateNumericShortId, generateShortId, generateStackBasedId };
package/imports.cjs CHANGED
@@ -1,2 +1,34 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("yummies/async");exports.fetchLazyModule=async(e,r=3,a=1e3)=>{const n=Array.from({length:r}).fill(e);let o=null;for await(const l of n)try{return null!==o&&await t.sleep(a),await l()}catch(s){o=s}throw o},exports.unpackAsyncModule=async t=>{if(t instanceof Promise){const e=await t;return e.default?e.default:e}return t};
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const async = require("yummies/async");
4
+ const fetchLazyModule = async (fetchModule, attempts = 3, delay = 1e3) => {
5
+ const attemptsArray = Array.from({
6
+ length: attempts
7
+ }).fill(fetchModule);
8
+ let lastError = null;
9
+ for await (const attempt of attemptsArray) {
10
+ try {
11
+ if (lastError !== null) {
12
+ await async.sleep(delay);
13
+ }
14
+ return await attempt();
15
+ } catch (error) {
16
+ lastError = error;
17
+ }
18
+ }
19
+ throw lastError;
20
+ };
21
+ const unpackAsyncModule = async (maybeModule) => {
22
+ if (maybeModule instanceof Promise) {
23
+ const data = await maybeModule;
24
+ if (data.default) {
25
+ return data.default;
26
+ } else {
27
+ return data;
28
+ }
29
+ }
30
+ return maybeModule;
31
+ };
32
+ exports.fetchLazyModule = fetchLazyModule;
33
+ exports.unpackAsyncModule = unpackAsyncModule;
2
34
  //# sourceMappingURL=imports.cjs.map
package/imports.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"imports.cjs","sources":["../src/imports.ts"],"sourcesContent":["import { sleep } from 'yummies/async';\n\n/**\n * Функция ленивой загрузки модуля, с возможностью вызова доп. попыток\n * @example\n * ```ts\n * fetchLazyModule(() => import(\"./test.ts\"), 3) // начнет загрузку test.ts\n * // Произошла ошибка загрузки test.ts, тогда fetchLazyModule повторно вызовет fn()\n * // Вызывать будет столько раз сколько указано attempts (по умолчанию 3)\n * ```\n */\nexport const fetchLazyModule = async <T>(\n fetchModule: () => Promise<T>,\n attempts = 3,\n delay = 1000,\n): Promise<T> => {\n const attemptsArray = Array.from<typeof fetchModule>({\n length: attempts,\n }).fill(fetchModule);\n\n let lastError: null | Error = null;\n\n for await (const attempt of attemptsArray) {\n try {\n if (lastError !== null) {\n await sleep(delay);\n }\n return await attempt();\n } catch (error) {\n lastError = error as Error;\n }\n }\n throw lastError;\n};\n\nexport type PackedAsyncModule<T> = Promise<T | { default: T }>;\n\nexport const unpackAsyncModule = async <T>(\n maybeModule: T | PackedAsyncModule<T>,\n): Promise<T> => {\n if (maybeModule instanceof Promise) {\n const data = (await maybeModule) as any;\n\n if ((data as any).default) {\n return (data as any).default;\n } else {\n return data;\n }\n }\n\n return maybeModule;\n};\n"],"names":["async","fetchModule","attempts","delay","attemptsArray","Array","from","length","fill","lastError","attempt","sleep","error","maybeModule","Promise","data","default"],"mappings":"yIAW+BA,MAC7BC,EACAC,EAAW,EACXC,EAAQ,OAER,MAAMC,EAAgBC,MAAMC,KAAyB,CACnDC,OAAQL,IACPM,KAAKP,GAER,IAAIQ,EAA0B,KAE9B,UAAA,MAAiBC,KAAWN,EAC1B,IAIE,OAHkB,OAAdK,SACIE,EAAAA,MAAMR,SAEDO,GACf,OAASE,GACPH,EAAYG,CACd,CAEF,MAAMH,6BAKyBT,MAC/Ba,IAEA,GAAIA,aAAuBC,QAAS,CAClC,MAAMC,QAAcF,EAEpB,OAAKE,EAAaC,QACRD,EAAaC,QAEdD,CAEX,CAEA,OAAOF"}
1
+ {"version":3,"file":"imports.cjs","sources":["../src/imports.ts"],"sourcesContent":["import { sleep } from 'yummies/async';\n\n/**\n * Функция ленивой загрузки модуля, с возможностью вызова доп. попыток\n * @example\n * ```ts\n * fetchLazyModule(() => import(\"./test.ts\"), 3) // начнет загрузку test.ts\n * // Произошла ошибка загрузки test.ts, тогда fetchLazyModule повторно вызовет fn()\n * // Вызывать будет столько раз сколько указано attempts (по умолчанию 3)\n * ```\n */\nexport const fetchLazyModule = async <T>(\n fetchModule: () => Promise<T>,\n attempts = 3,\n delay = 1000,\n): Promise<T> => {\n const attemptsArray = Array.from<typeof fetchModule>({\n length: attempts,\n }).fill(fetchModule);\n\n let lastError: null | Error = null;\n\n for await (const attempt of attemptsArray) {\n try {\n if (lastError !== null) {\n await sleep(delay);\n }\n return await attempt();\n } catch (error) {\n lastError = error as Error;\n }\n }\n throw lastError;\n};\n\nexport type PackedAsyncModule<T> = Promise<T | { default: T }>;\n\nexport const unpackAsyncModule = async <T>(\n maybeModule: T | PackedAsyncModule<T>,\n): Promise<T> => {\n if (maybeModule instanceof Promise) {\n const data = (await maybeModule) as any;\n\n if ((data as any).default) {\n return (data as any).default;\n } else {\n return data;\n }\n }\n\n return maybeModule;\n};\n"],"names":["sleep"],"mappings":";;;AAWO,MAAM,kBAAkB,OAC7B,aACA,WAAW,GACX,QAAQ,QACO;AACf,QAAM,gBAAgB,MAAM,KAAyB;AAAA,IACnD,QAAQ;AAAA,EAAA,CACT,EAAE,KAAK,WAAW;AAEnB,MAAI,YAA0B;AAE9B,mBAAiB,WAAW,eAAe;AACzC,QAAI;AACF,UAAI,cAAc,MAAM;AACtB,cAAMA,MAAAA,MAAM,KAAK;AAAA,MACnB;AACA,aAAO,MAAM,QAAA;AAAA,IACf,SAAS,OAAO;AACd,kBAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM;AACR;AAIO,MAAM,oBAAoB,OAC/B,gBACe;AACf,MAAI,uBAAuB,SAAS;AAClC,UAAM,OAAQ,MAAM;AAEpB,QAAK,KAAa,SAAS;AACzB,aAAQ,KAAa;AAAA,IACvB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;"}
package/imports.d.ts CHANGED
@@ -7,9 +7,11 @@
7
7
  * // Вызывать будет столько раз сколько указано attempts (по умолчанию 3)
8
8
  * ```
9
9
  */
10
- export declare const fetchLazyModule: <T>(fetchModule: () => Promise<T>, attempts?: number, delay?: number) => Promise<T>;
11
- export type PackedAsyncModule<T> = Promise<T | {
10
+ declare const fetchLazyModule: <T>(fetchModule: () => Promise<T>, attempts?: number, delay?: number) => Promise<T>;
11
+ type PackedAsyncModule<T> = Promise<T | {
12
12
  default: T;
13
13
  }>;
14
- export declare const unpackAsyncModule: <T>(maybeModule: T | PackedAsyncModule<T>) => Promise<T>;
15
- //# sourceMappingURL=imports.d.ts.map
14
+ declare const unpackAsyncModule: <T>(maybeModule: T | PackedAsyncModule<T>) => Promise<T>;
15
+
16
+ export { fetchLazyModule, unpackAsyncModule };
17
+ export type { PackedAsyncModule };