@revilise/web-utils 1.0.51

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/README.en.md ADDED
@@ -0,0 +1,112 @@
1
+ [Русская версия](README.md)
2
+
3
+ # @revilise/web-utils
4
+
5
+ A collection of utilities for web development, including React hooks and performance optimization functions.
6
+
7
+ ## 📦 Installation
8
+
9
+ ```bash
10
+ npm install @revilise/web-utils
11
+ ```
12
+
13
+ ## 🚀 Available Functions
14
+
15
+ ### React Hooks
16
+
17
+ #### `useBEM`
18
+ A hook for working with BEM methodology in React components. Allows easy creation of CSS classes following BEM methodology.
19
+
20
+ **Parameters:**
21
+ - `baseClass` - base block class
22
+
23
+ **Returns:**
24
+ - Object with `bem` method for class generation
25
+
26
+ **Usage example:**
27
+ ```tsx
28
+ import { useBEM } from '@revilise/web-utils/hooks';
29
+
30
+ const MyComponent = () => {
31
+ const { bem } = useBEM('button');
32
+
33
+ return (
34
+ <button
35
+ className={bem("button", {
36
+ extraCN: { isRed: true },
37
+ utilCN: ['active']
38
+ })}
39
+ >
40
+ Button
41
+ </button>
42
+ );
43
+ };
44
+ ```
45
+
46
+ ### Utilities
47
+
48
+ #### `debounce`
49
+ Creates a wrapper for a function that delays its execution until a specified time has passed since the last call.
50
+
51
+ **Parameters:**
52
+ - `callback` - function to execute
53
+ - `delay` - delay in milliseconds
54
+
55
+ **Usage example:**
56
+ ```tsx
57
+ import { debounce } from '@revilise/web-utils/libs';
58
+
59
+ const debouncedSearch = debounce((query: string) => {
60
+ console.log('Searching:', query);
61
+ }, 300);
62
+
63
+ // Usage in event handler
64
+ input.addEventListener('input', (e) => {
65
+ debouncedSearch(e.target.value);
66
+ });
67
+ ```
68
+
69
+ #### `throttle`
70
+ Limits the frequency of function calls. Calls the original function no more than once per specified interval.
71
+
72
+ **Parameters:**
73
+ - `callback` - function to execute
74
+ - `delay` - interval in milliseconds
75
+
76
+ **Usage example:**
77
+ ```tsx
78
+ import { throttle } from '@revilise/web-utils/libs';
79
+
80
+ const throttledScroll = throttle(() => {
81
+ console.log('Scroll event');
82
+ }, 100);
83
+
84
+ window.addEventListener('scroll', throttledScroll);
85
+ ```
86
+
87
+ ## 📁 Export Structure
88
+
89
+ The package exports functions in two formats:
90
+
91
+ ```tsx
92
+ // React hooks
93
+ import { useBEM } from '@revilise/web-utils/hooks';
94
+
95
+ // Utilities
96
+ import { debounce, throttle } from '@revilise/web-utils/libs';
97
+ ```
98
+
99
+ ## 🛠 Technical Details
100
+
101
+ - **TypeScript**: Full type support
102
+ - **Tree-shaking**: Optimized for tree-shaking
103
+ - **ESM/CJS**: Support for ES and CommonJS module systems
104
+ - **Size**: Minimal bundle size
105
+
106
+ ## 📄 License
107
+
108
+ MIT
109
+
110
+ ## 👥 Author
111
+
112
+ Anastasia Mutnykh (mutnyh.ao@mail.ru)
package/README.md ADDED
@@ -0,0 +1,117 @@
1
+ [English version](README.en.md)
2
+
3
+ # @revilise/web-utils
4
+
5
+ Набор утилит для веб-разработки, включающий React хуки и полезные функции для оптимизации производительности.
6
+
7
+ ## 📦 Установка
8
+
9
+ ```bash
10
+ npm install @revilise/web-utils
11
+ ```
12
+
13
+ ## 🚀 Доступные функции
14
+
15
+ ### React Hooks
16
+
17
+ #### `useBEM`
18
+ Хук для работы с BEM методологией в React компонентах. Позволяет легко создавать CSS классы по методологии БЭМ.
19
+
20
+ **Параметры:**
21
+ - `baseClass` - базовый класс блока
22
+
23
+ **Возвращает:**
24
+ - Объект с методом `bem` для генерации классов
25
+
26
+ **Пример использования:**
27
+ ```tsx
28
+ import { useBEM } from '@revilise/web-utils/hooks';
29
+
30
+ const MyComponent = () => {
31
+ const { bem } = useBEM('button');
32
+
33
+ return (
34
+ <button
35
+ className={bem("button", {
36
+ extraCN: { isRed: true },
37
+ utilCN: ['active']
38
+ })}
39
+ >
40
+ Нажми на меня
41
+ </button>
42
+ );
43
+ };
44
+ ```
45
+ Результат
46
+
47
+ ```html
48
+ <button class="button button--isRed active">Нажми на меня</button>
49
+ ```
50
+
51
+ ### Утилиты
52
+
53
+ #### `debounce`
54
+ Создает обёртку для функции, которая откладывает её выполнение до тех пор, пока не пройдет заданное время после последнего вызова.
55
+
56
+ **Параметры:**
57
+ - `callback` - функция для выполнения
58
+ - `delay` - задержка в миллисекундах
59
+
60
+ **Пример использования:**
61
+ ```tsx
62
+ import { debounce } from '@revilise/web-utils/libs';
63
+
64
+ const debouncedSearch = debounce((query: string) => {
65
+ console.log('Поиск:', query);
66
+ }, 300);
67
+
68
+ // Использование в обработчике событий
69
+ input.addEventListener('input', (e) => {
70
+ debouncedSearch(e.target.value);
71
+ });
72
+ ```
73
+
74
+ #### `throttle`
75
+ Ограничивает частоту вызовов функции. Вызывает исходную функцию не чаще одного раза в указанный интервал.
76
+
77
+ **Параметры:**
78
+ - `callback` - функция для выполнения
79
+ - `delay` - интервал в миллисекундах
80
+
81
+ **Пример использования:**
82
+ ```tsx
83
+ import { throttle } from '@revilise/web-utils/libs';
84
+
85
+ const throttledScroll = throttle(() => {
86
+ console.log('Событие прокрутки');
87
+ }, 100);
88
+
89
+ window.addEventListener('scroll', throttledScroll);
90
+ ```
91
+
92
+ ## 📁 Структура экспорта
93
+
94
+ Пакет экспортирует функции в двух форматах:
95
+
96
+ ```tsx
97
+ // React хуки
98
+ import { useBEM } from '@revilise/web-utils/hooks';
99
+
100
+ // Утилиты
101
+ import { debounce, throttle } from '@revilise/web-utils/libs';
102
+ ```
103
+
104
+ ## 🛠 Технические детали
105
+
106
+ - **TypeScript**: Полная поддержка типов
107
+ - **Tree-shaking**: Оптимизирован для tree-shaking
108
+ - **ESM/CJS**: Поддержка модульных систем ES и CommonJS
109
+ - **Размер**: Только самое важное
110
+
111
+ ## 📄 Лицензия
112
+
113
+ MIT
114
+
115
+ ## 👥 Автор
116
+
117
+ Anastasia Mutnykh (mutnyh.ao@mail.ru)
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),exports.useBEM=function(t){return{bem(e,r={}){const s=[],n=e?`${t}__${e}`:t;s.push(n);const{extraCN:o={},utilCN:i}=r;if(Object.keys(o).length>0)for(const t in o)o[t]&&s.push(`${n}--${t}`);if("string"==typeof i&&i)s.push(i);else if(Array.isArray(i))for(const t in i){const e=i[t];e&&s.push(e)}return s.join(" ")}}};
@@ -0,0 +1,11 @@
1
+ declare type bemOptions = {
2
+ baseCN: string;
3
+ extraCN?: Record<string, boolean>;
4
+ utilCN?: string | Array<string | boolean>;
5
+ };
6
+
7
+ export declare function useBEM(baseClass: string): {
8
+ bem(blockCN: string, options?: Omit<bemOptions, "baseCN">): string;
9
+ };
10
+
11
+ export { }
@@ -0,0 +1,29 @@
1
+ function useBEM(baseClass) {
2
+ return {
3
+ bem(blockCN, options = {}) {
4
+ const className = [];
5
+ const base = !blockCN ? baseClass : `${baseClass}__${blockCN}`;
6
+ className.push(base);
7
+ const { extraCN = {}, utilCN } = options;
8
+ if (Object.keys(extraCN).length > 0) {
9
+ for (const key in extraCN) {
10
+ if (extraCN[key]) {
11
+ className.push(`${base}--${key}`);
12
+ }
13
+ }
14
+ }
15
+ if (typeof utilCN === "string" && utilCN) {
16
+ className.push(utilCN);
17
+ } else if (Array.isArray(utilCN)) {
18
+ for (const i in utilCN) {
19
+ const cn = utilCN[i];
20
+ cn && className.push(cn);
21
+ }
22
+ }
23
+ return className.join(" ");
24
+ }
25
+ };
26
+ }
27
+ export {
28
+ useBEM
29
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./hooks.cjs.js"),t=require("./libs.cjs.js");exports.useBEM=e.useBEM,exports.debounce=t.debounce,exports.throttle=t.throttle;
@@ -0,0 +1,61 @@
1
+ declare type bemOptions = {
2
+ baseCN: string;
3
+ extraCN?: Record<string, boolean>;
4
+ utilCN?: string | Array<string | boolean>;
5
+ };
6
+
7
+ /**
8
+ * Создает обёртку для функции, которая откладывает её выполнение
9
+ * до тех пор, пока не пройдет заданное время `delay` после последнего вызова.
10
+ *
11
+ * Это полезно для оптимизации частых событий, например:
12
+ * ввод текста, изменение размера окна, прокрутка или ресайз изображений.
13
+ *
14
+ * Например, если пользователь непрерывно вводит текст, обработчик срабатывает
15
+ * только один раз — спустя `delay` миллисекунд после последнего нажатия клавиши.
16
+ *
17
+ * @template T
18
+ * @param {T} callback - Функция, которую нужно выполнить после периода "тишины".
19
+ * @param {number} delay - Время задержки (в миллисекундах) перед вызовом `callback`.
20
+ *
21
+ * @returns Возвращает новую функцию, которая реализует поведение debounce.
22
+ *
23
+ * @example
24
+ * // Пример: выполнение запроса только после паузы в наборе текста
25
+ * const debouncedSearch = debounce((query: string) => {
26
+ * console.log('Ищем:', query);
27
+ * }, 300);
28
+ *
29
+ * document.querySelector('input')?.addEventListener('input', (e) => {
30
+ * debouncedSearch((e.target as HTMLInputElement).value);
31
+ * });
32
+ */
33
+ export declare function debounce<T extends (...args: any[]) => void>(callback: T, delay: number): (this: ThisParameterType<T>, ...args: Parameters<T>) => void;
34
+
35
+ /**
36
+ * Ограничивает частоту вызовов функции.
37
+ *
38
+ * Возвращает новую обёртку, которая вызывает исходный `callback` не чаще,
39
+ * чем один раз в указанный интервал `delay`. Если во время ожидания поступают
40
+ * новые вызовы, они откладываются и выполняются после следующего разрешённого интервала.
41
+ *
42
+ * @template T
43
+ * @param {T} callback - Исходная функция, которую нужно ограничить по частоте вызова.
44
+ * @param {number} delay - Интервал в миллисекундах, определяющий, как часто можно вызывать `callback`.
45
+ *
46
+ * @returns {(...args: Parameters<T>) => void} Обёртка, выполняющая throttle‑логику.
47
+ *
48
+ * @example
49
+ * const throttledScroll = throttle(() => {
50
+ * console.log('scroll event');
51
+ * }, 1000);
52
+ *
53
+ * window.addEventListener('scroll', throttledScroll);
54
+ */
55
+ export declare function throttle<T extends (...args: any[]) => void>(callback: T, delay: number): (this: ThisParameterType<T>, ...args: Parameters<T>) => void;
56
+
57
+ export declare function useBEM(baseClass: string): {
58
+ bem(blockCN: string, options?: Omit<bemOptions, "baseCN">): string;
59
+ };
60
+
61
+ export { }
@@ -0,0 +1,7 @@
1
+ import { useBEM } from "./hooks.es.js";
2
+ import { debounce, throttle } from "./libs.es.js";
3
+ export {
4
+ debounce,
5
+ throttle,
6
+ useBEM
7
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),exports.debounce=function(t,e){let o;return function(...n){clearTimeout(o),o=setTimeout(()=>t.apply(this,n),e)}},exports.throttle=function(t,e){let o=!1,n=null;const u=()=>{null===n?o=!1:(t(...n),n=null,setTimeout(u,e))};return function(...l){o?n=l:(t.apply(this,l),o=!0,setTimeout(u,e))}};
package/dist/libs.d.ts ADDED
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Создает обёртку для функции, которая откладывает её выполнение
3
+ * до тех пор, пока не пройдет заданное время `delay` после последнего вызова.
4
+ *
5
+ * Это полезно для оптимизации частых событий, например:
6
+ * ввод текста, изменение размера окна, прокрутка или ресайз изображений.
7
+ *
8
+ * Например, если пользователь непрерывно вводит текст, обработчик срабатывает
9
+ * только один раз — спустя `delay` миллисекунд после последнего нажатия клавиши.
10
+ *
11
+ * @template T
12
+ * @param {T} callback - Функция, которую нужно выполнить после периода "тишины".
13
+ * @param {number} delay - Время задержки (в миллисекундах) перед вызовом `callback`.
14
+ *
15
+ * @returns Возвращает новую функцию, которая реализует поведение debounce.
16
+ *
17
+ * @example
18
+ * // Пример: выполнение запроса только после паузы в наборе текста
19
+ * const debouncedSearch = debounce((query: string) => {
20
+ * console.log('Ищем:', query);
21
+ * }, 300);
22
+ *
23
+ * document.querySelector('input')?.addEventListener('input', (e) => {
24
+ * debouncedSearch((e.target as HTMLInputElement).value);
25
+ * });
26
+ */
27
+ export declare function debounce<T extends (...args: any[]) => void>(callback: T, delay: number): (this: ThisParameterType<T>, ...args: Parameters<T>) => void;
28
+
29
+ /**
30
+ * Ограничивает частоту вызовов функции.
31
+ *
32
+ * Возвращает новую обёртку, которая вызывает исходный `callback` не чаще,
33
+ * чем один раз в указанный интервал `delay`. Если во время ожидания поступают
34
+ * новые вызовы, они откладываются и выполняются после следующего разрешённого интервала.
35
+ *
36
+ * @template T
37
+ * @param {T} callback - Исходная функция, которую нужно ограничить по частоте вызова.
38
+ * @param {number} delay - Интервал в миллисекундах, определяющий, как часто можно вызывать `callback`.
39
+ *
40
+ * @returns {(...args: Parameters<T>) => void} Обёртка, выполняющая throttle‑логику.
41
+ *
42
+ * @example
43
+ * const throttledScroll = throttle(() => {
44
+ * console.log('scroll event');
45
+ * }, 1000);
46
+ *
47
+ * window.addEventListener('scroll', throttledScroll);
48
+ */
49
+ export declare function throttle<T extends (...args: any[]) => void>(callback: T, delay: number): (this: ThisParameterType<T>, ...args: Parameters<T>) => void;
50
+
51
+ export { }
@@ -0,0 +1,33 @@
1
+ function debounce(callback, delay) {
2
+ let timeoutId;
3
+ return function(...args) {
4
+ clearTimeout(timeoutId);
5
+ timeoutId = setTimeout(() => callback.apply(this, args), delay);
6
+ };
7
+ }
8
+ function throttle(callback, delay) {
9
+ let shouldWait = false;
10
+ let pendingArgs = null;
11
+ const timeoutFunc = () => {
12
+ if (pendingArgs === null) {
13
+ shouldWait = false;
14
+ } else {
15
+ callback(...pendingArgs);
16
+ pendingArgs = null;
17
+ setTimeout(timeoutFunc, delay);
18
+ }
19
+ };
20
+ return function(...args) {
21
+ if (shouldWait) {
22
+ pendingArgs = args;
23
+ return;
24
+ }
25
+ callback.apply(this, args);
26
+ shouldWait = true;
27
+ setTimeout(timeoutFunc, delay);
28
+ };
29
+ }
30
+ export {
31
+ debounce,
32
+ throttle
33
+ };
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@revilise/web-utils",
3
+ "version": "1.0.51",
4
+ "description": "Utility functions",
5
+ "homepage": "https://github.com/revilise/web-utils#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/revilise/web-utils/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/revilise/web-utils.git"
12
+ },
13
+ "license": "MIT",
14
+ "author": "Anastasia Mutnykh <mutnyh.ao@mail.ru>",
15
+ "sideEffects": false,
16
+ "main": "./dist/index.cjs.js",
17
+ "module": "./dist/index.es.js",
18
+ "types": "./dist/index.d.ts",
19
+ "scripts": {
20
+ "build": "vite build",
21
+ "test": "vitest run",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "exports": {
28
+ ".": {
29
+ "import": "./dist/index.es.js",
30
+ "types": "./dist/index.d.ts",
31
+ "require": "./dist/index.cjs.js"
32
+ },
33
+ "./libs": {
34
+ "import": "./dist/libs.es.js",
35
+ "types": "./dist/libs.d.ts",
36
+ "require": "./dist/libs.cjs.js"
37
+ },
38
+ "./hooks": {
39
+ "import": "./dist/hooks.es.js",
40
+ "types": "./dist/hooks.d.ts",
41
+ "require": "./dist/hooks.cjs.js"
42
+ }
43
+ },
44
+ "files": [
45
+ "dist"
46
+ ],
47
+ "devDependencies": {
48
+ "@types/node": "^24.9.1",
49
+ "@vitest/coverage-v8": "^4.0.4",
50
+ "jsdom": "^27.0.1",
51
+ "terser": "^5.44.0",
52
+ "typescript": "^5.9.3",
53
+ "vite": "^7.1.12",
54
+ "vite-plugin-dts": "^4.5.4",
55
+ "vitest": "^4.0.4"
56
+ }
57
+ }