yummies 3.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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +69 -0
  3. package/assets/logo.png +0 -0
  4. package/assets/logo.pxz +0 -0
  5. package/async.d.ts +18 -0
  6. package/async.d.ts.map +1 -0
  7. package/async.js +28 -0
  8. package/cookie.d.ts +3 -0
  9. package/cookie.d.ts.map +1 -0
  10. package/cookie.js +11 -0
  11. package/css.d.ts +10 -0
  12. package/css.d.ts.map +1 -0
  13. package/css.js +10 -0
  14. package/date-time.d.ts +14 -0
  15. package/date-time.d.ts.map +1 -0
  16. package/date-time.js +72 -0
  17. package/device.d.ts +8 -0
  18. package/device.d.ts.map +1 -0
  19. package/device.js +28 -0
  20. package/html.d.ts +17 -0
  21. package/html.d.ts.map +1 -0
  22. package/html.js +137 -0
  23. package/id.d.ts +57 -0
  24. package/id.d.ts.map +1 -0
  25. package/id.js +65 -0
  26. package/imports.d.ts +11 -0
  27. package/imports.d.ts.map +1 -0
  28. package/imports.js +28 -0
  29. package/math.d.ts +13 -0
  30. package/math.d.ts.map +1 -0
  31. package/math.js +17 -0
  32. package/media.d.ts +12 -0
  33. package/media.d.ts.map +1 -0
  34. package/media.js +91 -0
  35. package/ms.d.ts +20 -0
  36. package/ms.d.ts.map +1 -0
  37. package/ms.js +18 -0
  38. package/package.json +140 -0
  39. package/price.d.ts +6 -0
  40. package/price.d.ts.map +1 -0
  41. package/price.js +17 -0
  42. package/sound.d.ts +7 -0
  43. package/sound.d.ts.map +1 -0
  44. package/sound.js +13 -0
  45. package/storage.d.ts +39 -0
  46. package/storage.d.ts.map +1 -0
  47. package/storage.js +43 -0
  48. package/text.d.ts +11 -0
  49. package/text.d.ts.map +1 -0
  50. package/text.js +10 -0
  51. package/type-guard.d.ts +18 -0
  52. package/type-guard.d.ts.map +1 -0
  53. package/type-guard.js +46 -0
  54. package/utils/types.d.ts +30 -0
  55. package/utils/types.d.ts.map +1 -0
  56. package/utils/types.js +1 -0
  57. package/vibrate.d.ts +5 -0
  58. package/vibrate.d.ts.map +1 -0
  59. package/vibrate.js +8 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Sergey
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,69 @@
1
+ <img src="assets/logo.png" align="right" height="156" alt="logo" />
2
+
3
+ # yummies
4
+
5
+ [![NPM version][npm-image]][npm-url] [![build status][github-build-actions-image]][github-actions-url] [![npm download][download-image]][download-url] [![bundle size][bundlephobia-image]][bundlephobia-url]
6
+
7
+
8
+ [npm-image]: http://img.shields.io/npm/v/yummies.svg
9
+ [npm-url]: http://npmjs.org/package/yummies
10
+ [github-build-actions-image]: https://github.com/js2me/yummies/workflows/Build/badge.svg
11
+ [github-actions-url]: https://github.com/js2me/yummies/actions
12
+ [download-image]: https://img.shields.io/npm/dm/yummies.svg
13
+ [download-url]: https://npmjs.org/package/yummies
14
+ [bundlephobia-url]: https://bundlephobia.com/result?p=yummies
15
+ [bundlephobia-image]: https://badgen.net/bundlephobia/minzip/yummies
16
+
17
+
18
+ Yummies - это набор разнообразных утилит для JavaScript-проектов с открытым исходным кодом, предназначенный для упрощения выполнения общих задач и повышения производительности. Этот проект предоставляет разработчикам мощные и простые в использовании функции, которые легко интегрировать в любой JavaScript-код.
19
+
20
+ ## [yummies/async](src/async.ts)
21
+ Утилиты по работе с асинхронным кодом
22
+
23
+ ## [yummies/cookie](src/cookie.ts)
24
+ Утилиты по работе с куками
25
+
26
+ ## [yummies/css](src/css.ts)
27
+ Утилиты по работе с CSS
28
+
29
+ ## [yummies/date-time](src/date-time.ts)
30
+ Утилиты по работе с датой и временем (основаны на dayjs)
31
+
32
+ ## [yummies/device](src/device.ts)
33
+ Утилиты по работе с устройствами
34
+
35
+ ## [yummies/html](src/html.ts)
36
+ Утилиты по работе с HTML
37
+
38
+ ## [yummies/id](src/id.ts)
39
+ Утилиты по работе с идентификаторами
40
+
41
+ ## [yummies/imports](src/imports.ts)
42
+ Утилиты по работе с импортом модулей
43
+
44
+ ## [yummies/math](src/math.ts)
45
+ Утилиты по работе с устройствами
46
+
47
+ ## [yummies/media](src/media.ts)
48
+ Утилиты по работе с медиа (изображением, канвасом и блобом)
49
+
50
+ ## [yummies/ms](src/ms.ts)
51
+ Утилиты по работе с миллисекундами
52
+
53
+ ## [yummies/price](src/price.ts)
54
+ Утилиты по работе с денежными значениями (форматирование)
55
+
56
+ ## [yummies/sound](src/sound.ts)
57
+ Утилиты по работе со звуком
58
+
59
+ ## [yummies/storage](src/storage.ts)
60
+ Утилиты по работе с хранилищем (localStorage, sessionStorage)
61
+
62
+ ## [yummies/text](src/text.ts)
63
+ Утилиты по работе с текстом
64
+
65
+ ## [yummies/type-guard](src/type-guard.ts)
66
+ Утилита для проверок на типы
67
+
68
+ ## [yummies/vibrate](src/vibrate.ts)
69
+ Утилиты по работе с vibrate api
Binary file
Binary file
package/async.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Создает промис, который будет ждать указанное количество ms, чтобы выполниться
3
+ *
4
+ * @param ms значение в миллисекундах
5
+ * @returns Promise
6
+ */
7
+ export declare const waitAsync: (ms?: number) => Promise<unknown>;
8
+ /**
9
+ * Создает вызов requestAnimationFrame, посылая туда фукнцию {quitFn}, если она возвращает true,
10
+ * тогда повторно не будет создан вызов requestAnimationFrame, иначе будут создаваться повторно
11
+ * вызовы requestAnimationFrame до тем пор, пока эта функция не вернёт true
12
+ *
13
+ * @param quitFn - сама фукнция которая исполнится в requestAnimationFrame
14
+ * @param asMicrotask - дополнительно оборачивает RAF в queueMicrotask
15
+ * @returns void
16
+ */
17
+ export declare const endlessRAF: (quitFunction: () => boolean | void, asMicrotask?: boolean) => void;
18
+ //# sourceMappingURL=async.d.ts.map
package/async.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,SAAS,mCAC6B,CAAC;AAEpD;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,iBACP,MAAM,OAAO,GAAG,IAAI,gBACpB,OAAO,SAYtB,CAAC"}
package/async.js ADDED
@@ -0,0 +1,28 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /**
3
+ * Создает промис, который будет ждать указанное количество ms, чтобы выполниться
4
+ *
5
+ * @param ms значение в миллисекундах
6
+ * @returns Promise
7
+ */
8
+ export const waitAsync = (ms = 1000) => new Promise((resolve) => setTimeout(resolve, ms));
9
+ /**
10
+ * Создает вызов requestAnimationFrame, посылая туда фукнцию {quitFn}, если она возвращает true,
11
+ * тогда повторно не будет создан вызов requestAnimationFrame, иначе будут создаваться повторно
12
+ * вызовы requestAnimationFrame до тем пор, пока эта функция не вернёт true
13
+ *
14
+ * @param quitFn - сама фукнция которая исполнится в requestAnimationFrame
15
+ * @param asMicrotask - дополнительно оборачивает RAF в queueMicrotask
16
+ * @returns void
17
+ */
18
+ export const endlessRAF = (quitFunction, asMicrotask) => {
19
+ if (quitFunction())
20
+ return;
21
+ const raf = () => requestAnimationFrame(() => endlessRAF(quitFunction, asMicrotask));
22
+ if (asMicrotask) {
23
+ queueMicrotask(raf);
24
+ }
25
+ else {
26
+ raf();
27
+ }
28
+ };
package/cookie.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { AnyObject } from './utils/types';
2
+ export declare const parseCookie: (cookiesString?: string) => AnyObject;
3
+ //# sourceMappingURL=cookie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../src/cookie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,eAAO,MAAM,WAAW,uCAUvB,CAAC"}
package/cookie.js ADDED
@@ -0,0 +1,11 @@
1
+ export const parseCookie = (cookiesString = document.cookie) => {
2
+ return cookiesString
3
+ .split(';')
4
+ .map(function (cookieString) {
5
+ return cookieString.trim().split('=');
6
+ })
7
+ .reduce(function (acc, current) {
8
+ acc[current[0]] = current[1];
9
+ return acc;
10
+ }, {});
11
+ };
package/css.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import clsx from 'clsx';
2
+ /**
3
+ * Перевод значения в пикселях в rem строковое
4
+ */
5
+ export declare const toRem: (px: number, remValue?: number) => string;
6
+ /**
7
+ * classNames/clsx но с примесями tailwind-merge
8
+ */
9
+ export declare const cx: (...args: Parameters<typeof clsx>) => string;
10
+ //# sourceMappingURL=css.d.ts.map
package/css.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB;;GAEG;AACH,eAAO,MAAM,KAAK,OAAQ,MAAM,8BAAyC,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,EAAE,YAAa,UAAU,CAAC,OAAO,IAAI,CAAC,WAA2B,CAAC"}
package/css.js ADDED
@@ -0,0 +1,10 @@
1
+ import clsx from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+ /**
4
+ * Перевод значения в пикселях в rem строковое
5
+ */
6
+ export const toRem = (px, remValue = 16) => `${px / remValue}rem`;
7
+ /**
8
+ * classNames/clsx но с примесями tailwind-merge
9
+ */
10
+ export const cx = (...args) => twMerge(clsx(...args));
package/date-time.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { Dayjs } from 'dayjs';
2
+ import { Maybe } from './utils/types';
3
+ import 'dayjs/locale/ru';
4
+ export declare const formatDate: (value: Maybe<string | number | Dayjs>, settings?: Maybe<{
5
+ format?: "human" | "full" | "short" | "day" | "day-only" | "date" | "month" | "spent-time" | "time" | "time-short";
6
+ pattern?: string;
7
+ asTime?: boolean;
8
+ }>) => string;
9
+ export declare const timeDuration: (timeInMs: number) => {
10
+ hours: number;
11
+ minutes: number;
12
+ seconds: number;
13
+ };
14
+ //# sourceMappingURL=date-time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-time.d.ts","sourceRoot":"","sources":["../src/date-time.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAKrC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,iBAAiB,CAAC;AAwBzB,eAAO,MAAM,UAAU,UACd,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,aAC1B,KAAK,CAAC;IACf,MAAM,CAAC,EACH,OAAO,GACP,MAAM,GACN,OAAO,GACP,KAAK,GACL,UAAU,GACV,MAAM,GACN,OAAO,GACP,YAAY,GACZ,MAAM,GACN,YAAY,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC,WA6CH,CAAC;AAEF,eAAO,MAAM,YAAY,aAAc,MAAM;;;;CAQ5C,CAAC"}
package/date-time.js ADDED
@@ -0,0 +1,72 @@
1
+ import dayjs from 'dayjs';
2
+ import duration from 'dayjs/plugin/duration';
3
+ import relativeTime from 'dayjs/plugin/relativeTime';
4
+ import { typeGuard } from './type-guard';
5
+ import 'dayjs/locale/ru';
6
+ dayjs.extend(relativeTime);
7
+ dayjs.extend(duration);
8
+ dayjs.locale('ru');
9
+ const NO_VALUE = '–'; // en-dash
10
+ const toLibFormat = function (value, asTime) {
11
+ if (typeGuard.isNumber(value)) {
12
+ if (asTime) {
13
+ return dayjs.duration(value);
14
+ }
15
+ return dayjs(value);
16
+ }
17
+ else if (typeGuard.isString(value)) {
18
+ return dayjs(value);
19
+ }
20
+ else if (dayjs.isDayjs(value)) {
21
+ return value;
22
+ }
23
+ };
24
+ export const formatDate = function (value, settings) {
25
+ const dateFormat = settings === null || settings === void 0 ? void 0 : settings.format;
26
+ const datePattern = settings === null || settings === void 0 ? void 0 : settings.pattern;
27
+ const asTime = settings === null || settings === void 0 ? void 0 : settings.asTime;
28
+ value = toLibFormat(value, asTime);
29
+ if (typeGuard.isUndefined(value)) {
30
+ return NO_VALUE;
31
+ }
32
+ if (datePattern) {
33
+ return value.format(datePattern);
34
+ }
35
+ switch (dateFormat) {
36
+ case 'human': {
37
+ return value.fromNow();
38
+ }
39
+ case 'spent-time': {
40
+ return value.fromNow(true);
41
+ }
42
+ case 'full': {
43
+ return value.format('DD MMM YYYY HH:mm:ss');
44
+ }
45
+ case 'short': {
46
+ return value.format('DD MMM HH:mm');
47
+ }
48
+ case 'time': {
49
+ return value.format('HH:mm:ss');
50
+ }
51
+ case 'time-short': {
52
+ return value.format('HH:mm');
53
+ }
54
+ case 'day': {
55
+ return value.format('DD MMM YYYY');
56
+ }
57
+ case 'month': {
58
+ return value.format('MMMM YYYY');
59
+ }
60
+ default: {
61
+ return value.format('DD.MM.YYYY');
62
+ }
63
+ }
64
+ };
65
+ export const timeDuration = (timeInMs) => {
66
+ const duration = dayjs.duration(timeInMs);
67
+ return {
68
+ hours: duration.hours(),
69
+ minutes: duration.minutes(),
70
+ seconds: duration.seconds(),
71
+ };
72
+ };
package/device.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ export declare const getUserAgent: () => any;
2
+ export declare const checkIsMobileDevice: () => boolean;
3
+ export declare const checkIsTabletDevice: () => boolean;
4
+ export declare const checkIsTouchDevice: () => boolean;
5
+ export declare const isMobileDevice: boolean;
6
+ export declare const isTabletDevice: boolean;
7
+ export declare const isTouchDevice: boolean;
8
+ //# sourceMappingURL=device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,YAAY,WAOR,CAAC;AAElB,eAAO,MAAM,mBAAmB,eAe/B,CAAC;AAEF,eAAO,MAAM,mBAAmB,eAM/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,eACiB,CAAC;AAEjD,eAAO,MAAM,cAAc,SAAwB,CAAC;AAEpD,eAAO,MAAM,cAAc,SAAwB,CAAC;AAEpD,eAAO,MAAM,aAAa,SAAmC,CAAC"}
package/device.js ADDED
@@ -0,0 +1,28 @@
1
+ /* eslint-disable sonarjs/single-character-alternation */
2
+ /* eslint-disable sonarjs/unnecessary-character-escapes */
3
+ /* eslint-disable sonarjs/regex-complexity */
4
+ /* eslint-disable sonarjs/slow-regex */
5
+ /* eslint-disable sonarjs/deprecation */
6
+ /* eslint-disable no-useless-escape */
7
+ /* eslint-disable max-len */
8
+ export const getUserAgent = () => (navigator.userAgent ||
9
+ navigator.vendor ||
10
+ // @ts-expect-error skip opera
11
+ globalThis.opera ||
12
+ '').toLowerCase();
13
+ export const checkIsMobileDevice = () => {
14
+ const userAgent = getUserAgent();
15
+ if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(userAgent || '') ||
16
+ /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test((userAgent || '').slice(0, 4))) {
17
+ return true;
18
+ }
19
+ return false;
20
+ };
21
+ export const checkIsTabletDevice = () => {
22
+ const userAgent = getUserAgent();
23
+ return /(ipad|tablet|(android(?!.*mobile))|(windows(?!.*phone)(.*touch))|kindle|playbook|silk|(puffin(?!.*(IP|AP|WP))))/.test(userAgent);
24
+ };
25
+ export const checkIsTouchDevice = () => checkIsMobileDevice() || checkIsTabletDevice();
26
+ export const isMobileDevice = checkIsMobileDevice();
27
+ export const isTabletDevice = checkIsTabletDevice();
28
+ export const isTouchDevice = isMobileDevice || isTabletDevice;
package/html.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { SanitizeOptions } from 'insane';
2
+ import { Maybe } from './utils/types';
3
+ /**
4
+ * Вытаскивает RGB из любого цвета
5
+ */
6
+ export declare const getComputedColor: (color?: string) => string | null;
7
+ export declare const downloadUsingAnchor: (urlOrBlob: string | Blob, fileName?: string) => void;
8
+ /**
9
+ * Surrounds string in an anchor tag
10
+ */
11
+ export declare function wrapTextToTagLink(link: string): string;
12
+ export declare const collectOffsetTop: (element: HTMLElement | null) => number;
13
+ export declare const skipEvent: (e: Event) => boolean;
14
+ export declare const globalScrollIntoViewForY: (node: HTMLElement) => void;
15
+ export declare const sanitizeHtml: (html: Maybe<string>, config?: Partial<SanitizeOptions>) => string;
16
+ export declare const checkElementHasParent: (element: HTMLElement | null, parent: Maybe<HTMLElement>) => boolean;
17
+ //# sourceMappingURL=html.d.ts.map
package/html.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAIjD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC;;GAEG;AACH,eAAO,MAAM,gBAAgB,WAAY,MAAM,KAAG,MAAM,GAAG,IAa1D,CAAC;AAEF,eAAO,MAAM,mBAAmB,cACnB,MAAM,GAAG,IAAI,aACb,MAAM,SAgBlB,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,UAI7C;AAED,eAAO,MAAM,gBAAgB,YAAa,WAAW,GAAG,IAAI,WAU3D,CAAC;AAEF,eAAO,MAAM,SAAS,MAAO,KAAK,YAKjC,CAAC;AAEF,eAAO,MAAM,wBAAwB,SAAU,WAAW,SAgBzD,CAAC;AA0DF,eAAO,MAAM,YAAY,SACjB,KAAK,CAAC,MAAM,CAAC,WACV,OAAO,CAAC,eAAe,CAAC,WAMlC,CAAC;AAEF,eAAO,MAAM,qBAAqB,YACvB,WAAW,GAAG,IAAI,UACnB,KAAK,CAAC,WAAW,CAAC,YAe3B,CAAC"}
package/html.js ADDED
@@ -0,0 +1,137 @@
1
+ import insane from 'insane';
2
+ import { clamp } from 'lodash-es';
3
+ import { blobToUrl } from './media';
4
+ /**
5
+ * Вытаскивает RGB из любого цвета
6
+ */
7
+ export const getComputedColor = (color) => {
8
+ if (!color)
9
+ return null;
10
+ const d = document.createElement('div');
11
+ d.style.color = color;
12
+ document.body.append(d);
13
+ const rgbcolor = globalThis.getComputedStyle(d).color;
14
+ const match = /rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*\d+[.d+]*)*\)/g.exec(rgbcolor);
15
+ if (!match)
16
+ return null;
17
+ return `${match[1]}, ${match[2]}, ${match[3]}`;
18
+ };
19
+ export const downloadUsingAnchor = (urlOrBlob, fileName) => {
20
+ const url = blobToUrl(urlOrBlob);
21
+ const a = document.createElement('a');
22
+ a.href = url;
23
+ a.download = fileName !== null && fileName !== void 0 ? fileName : 'file';
24
+ a.target = '_blank';
25
+ document.body.append(a);
26
+ a.click();
27
+ a.remove();
28
+ };
29
+ /**
30
+ * Surrounds string in an anchor tag
31
+ */
32
+ export function wrapTextToTagLink(link) {
33
+ const descr = String(link).replace(/^(https?:\/{0,2})?(w{3}\.)?/, 'www.');
34
+ if (!/^https?:\/{2}/.test(link))
35
+ link = `http://${link}`;
36
+ return `<a href=${link} target="_blank">${descr}</a>`;
37
+ }
38
+ export const collectOffsetTop = (element) => {
39
+ let offsetTop = 0;
40
+ let node = element;
41
+ while (node != null) {
42
+ offsetTop += node.offsetTop;
43
+ node = node.parentElement;
44
+ }
45
+ return offsetTop;
46
+ };
47
+ export const skipEvent = (e) => {
48
+ e.preventDefault();
49
+ e.stopPropagation();
50
+ return false;
51
+ };
52
+ export const globalScrollIntoViewForY = (node) => {
53
+ const scrollContainer = document.body;
54
+ const pageHeight = window.innerHeight;
55
+ const nodeBounding = node.getBoundingClientRect();
56
+ const scrollPagesCount = scrollContainer.scrollHeight / pageHeight;
57
+ const scrollPageNumber = clamp(nodeBounding.top / pageHeight, 1, scrollPagesCount);
58
+ window.scroll({
59
+ top: scrollPageNumber * pageHeight,
60
+ behavior: 'smooth',
61
+ });
62
+ };
63
+ const sanitizeDefaults = {
64
+ allowedAttributes: {
65
+ a: ['href', 'name', 'target'],
66
+ img: ['src'],
67
+ span: ['class'],
68
+ code: ['class'],
69
+ },
70
+ allowedClasses: {},
71
+ allowedSchemes: ['http', 'https', 'mailto'],
72
+ allowedTags: [
73
+ 'a',
74
+ 'article',
75
+ 'b',
76
+ 'blockquote',
77
+ 'br',
78
+ 'caption',
79
+ 'code',
80
+ 'del',
81
+ 'details',
82
+ 'div',
83
+ 'em',
84
+ 'h1',
85
+ 'h2',
86
+ 'h3',
87
+ 'h4',
88
+ 'h5',
89
+ 'h6',
90
+ 'hr',
91
+ 'i',
92
+ 'img',
93
+ 'ins',
94
+ 'kbd',
95
+ 'li',
96
+ 'main',
97
+ 'ol',
98
+ 'p',
99
+ 'pre',
100
+ 'section',
101
+ 'span',
102
+ 'strong',
103
+ 'sub',
104
+ 'summary',
105
+ 'sup',
106
+ 'table',
107
+ 'tbody',
108
+ 'td',
109
+ 'th',
110
+ 'thead',
111
+ 'tr',
112
+ 'u',
113
+ 'ul',
114
+ ],
115
+ filter: undefined,
116
+ transformText: undefined,
117
+ };
118
+ export const sanitizeHtml = (html, config) => {
119
+ return insane(html !== null && html !== void 0 ? html : '', {
120
+ ...sanitizeDefaults,
121
+ ...config,
122
+ });
123
+ };
124
+ export const checkElementHasParent = (element, parent) => {
125
+ let node = element;
126
+ if (!parent)
127
+ return false;
128
+ while (node != null) {
129
+ if (node === parent) {
130
+ return true;
131
+ }
132
+ else {
133
+ node = node.parentElement;
134
+ }
135
+ }
136
+ return false;
137
+ };
package/id.d.ts ADDED
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789
3
+ * Размер 6
4
+ */
5
+ export declare const generateId: (size?: number) => string;
6
+ /**
7
+ * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789
8
+ * Размер 4
9
+ */
10
+ export declare const generateShortId: (size?: number) => string;
11
+ /**
12
+ * Использует алфавит 0123456789
13
+ * Размер 6
14
+ */
15
+ export declare const generateNumericId: (size?: number) => string;
16
+ /**
17
+ * Использует алфавит 0123456789
18
+ * Размер 4
19
+ */
20
+ export declare const generateNumericShortId: (size?: number) => string;
21
+ /**
22
+ * Создает функцию, которая будет создавать уникальную строку, уникальность которой основана на порядке вызова этой функции
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * generateLinearNumericId = createLinearNumericIdGenerator(6);
27
+ * generateLinearNumericId() // '000000'
28
+ * generateLinearNumericId() // '000001'
29
+ * ...
30
+ * generateLinearNumericId() // '999999'
31
+ * generateLinearNumericId() // '1000000'
32
+ * ...
33
+ * generateLinearNumericId() // '9999999'
34
+ * generateLinearNumericId() // '10000000'
35
+ * ```
36
+ *
37
+ * @param size размер
38
+ * @returns {()=>string}
39
+ */
40
+ export declare const createLinearNumericIdGenerator: (size?: number) => () => string;
41
+ /**
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * generateLinearNumericId() // '000000000'
46
+ * generateLinearNumericId() // '000000001'
47
+ * ...
48
+ * generateLinearNumericId() // '999999999'
49
+ * generateLinearNumericId() // '1000000000'
50
+ * ...
51
+ * generateLinearNumericId() // '9999999999'
52
+ * generateLinearNumericId() // '10000000000'
53
+ * ```
54
+ *
55
+ */
56
+ export declare const generateLinearNumericId: () => string;
57
+ //# sourceMappingURL=id.d.ts.map
package/id.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,eAAO,MAAM,UAAU,2BAA8B,CAAC;AAEtD;;;GAGG;AACH,eAAO,MAAM,eAAe,2BAA8B,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,2BAA4B,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,sBAAsB,2BAA4B,CAAC;AAEhE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,8BAA8B,UAAU,MAAM,iBAK1D,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB,cAAmC,CAAC"}
package/id.js ADDED
@@ -0,0 +1,65 @@
1
+ import { customAlphabet } from 'nanoid';
2
+ const DIGITS = '0123456789';
3
+ const LATIN_CHARS = 'abcdefghijklmnopqrstuvwxyz';
4
+ const ALPHABET = `${LATIN_CHARS}${DIGITS}`;
5
+ /**
6
+ * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789
7
+ * Размер 6
8
+ */
9
+ export const generateId = customAlphabet(ALPHABET, 6);
10
+ /**
11
+ * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789
12
+ * Размер 4
13
+ */
14
+ export const generateShortId = customAlphabet(ALPHABET, 4);
15
+ /**
16
+ * Использует алфавит 0123456789
17
+ * Размер 6
18
+ */
19
+ export const generateNumericId = customAlphabet(DIGITS, 6);
20
+ /**
21
+ * Использует алфавит 0123456789
22
+ * Размер 4
23
+ */
24
+ export const generateNumericShortId = customAlphabet(DIGITS, 4);
25
+ /**
26
+ * Создает функцию, которая будет создавать уникальную строку, уникальность которой основана на порядке вызова этой функции
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * generateLinearNumericId = createLinearNumericIdGenerator(6);
31
+ * generateLinearNumericId() // '000000'
32
+ * generateLinearNumericId() // '000001'
33
+ * ...
34
+ * generateLinearNumericId() // '999999'
35
+ * generateLinearNumericId() // '1000000'
36
+ * ...
37
+ * generateLinearNumericId() // '9999999'
38
+ * generateLinearNumericId() // '10000000'
39
+ * ```
40
+ *
41
+ * @param size размер
42
+ * @returns {()=>string}
43
+ */
44
+ export const createLinearNumericIdGenerator = (size = 9) => {
45
+ let lastCount = 0;
46
+ return () => {
47
+ return (lastCount++).toString().padStart(size, '0');
48
+ };
49
+ };
50
+ /**
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * generateLinearNumericId() // '000000000'
55
+ * generateLinearNumericId() // '000000001'
56
+ * ...
57
+ * generateLinearNumericId() // '999999999'
58
+ * generateLinearNumericId() // '1000000000'
59
+ * ...
60
+ * generateLinearNumericId() // '9999999999'
61
+ * generateLinearNumericId() // '10000000000'
62
+ * ```
63
+ *
64
+ */
65
+ export const generateLinearNumericId = createLinearNumericIdGenerator();
package/imports.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Функция ленивой загрузки модуля, с возможностью вызова доп. попыток
3
+ * @example
4
+ * ```ts
5
+ * fetchLazyModule(() => import("./test.ts"), 3) // начнет загрузку test.ts
6
+ * // Произошла ошибка загрузки test.ts, тогда fetchLazyModule повторно вызовет fn()
7
+ * // Вызывать будет столько раз сколько указано attempts (по умолчанию 3)
8
+ * ```
9
+ */
10
+ export declare const fetchLazyModule: <T>(fetchModule: () => Promise<T>, attempts?: number, delay?: number) => Promise<T>;
11
+ //# sourceMappingURL=imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.d.ts","sourceRoot":"","sources":["../src/imports.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAAU,CAAC,eACxB,MAAM,OAAO,CAAC,CAAC,CAAC,wCAG5B,OAAO,CAAC,CAAC,CAkBX,CAAC"}