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.
- package/LICENSE +21 -0
- package/README.md +69 -0
- package/assets/logo.png +0 -0
- package/assets/logo.pxz +0 -0
- package/async.d.ts +18 -0
- package/async.d.ts.map +1 -0
- package/async.js +28 -0
- package/cookie.d.ts +3 -0
- package/cookie.d.ts.map +1 -0
- package/cookie.js +11 -0
- package/css.d.ts +10 -0
- package/css.d.ts.map +1 -0
- package/css.js +10 -0
- package/date-time.d.ts +14 -0
- package/date-time.d.ts.map +1 -0
- package/date-time.js +72 -0
- package/device.d.ts +8 -0
- package/device.d.ts.map +1 -0
- package/device.js +28 -0
- package/html.d.ts +17 -0
- package/html.d.ts.map +1 -0
- package/html.js +137 -0
- package/id.d.ts +57 -0
- package/id.d.ts.map +1 -0
- package/id.js +65 -0
- package/imports.d.ts +11 -0
- package/imports.d.ts.map +1 -0
- package/imports.js +28 -0
- package/math.d.ts +13 -0
- package/math.d.ts.map +1 -0
- package/math.js +17 -0
- package/media.d.ts +12 -0
- package/media.d.ts.map +1 -0
- package/media.js +91 -0
- package/ms.d.ts +20 -0
- package/ms.d.ts.map +1 -0
- package/ms.js +18 -0
- package/package.json +140 -0
- package/price.d.ts +6 -0
- package/price.d.ts.map +1 -0
- package/price.js +17 -0
- package/sound.d.ts +7 -0
- package/sound.d.ts.map +1 -0
- package/sound.js +13 -0
- package/storage.d.ts +39 -0
- package/storage.d.ts.map +1 -0
- package/storage.js +43 -0
- package/text.d.ts +11 -0
- package/text.d.ts.map +1 -0
- package/text.js +10 -0
- package/type-guard.d.ts +18 -0
- package/type-guard.d.ts.map +1 -0
- package/type-guard.js +46 -0
- package/utils/types.d.ts +30 -0
- package/utils/types.d.ts.map +1 -0
- package/utils/types.js +1 -0
- package/vibrate.d.ts +5 -0
- package/vibrate.d.ts.map +1 -0
- 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
|
package/assets/logo.png
ADDED
|
Binary file
|
package/assets/logo.pxz
ADDED
|
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
package/cookie.d.ts.map
ADDED
|
@@ -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
|
package/device.d.ts.map
ADDED
|
@@ -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
|
package/imports.d.ts.map
ADDED
|
@@ -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"}
|