@minsize/utils 0.2.2 → 0.3.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/README.md +3 -2
- package/index.d.ts +158 -3
- package/index.js +1 -1
- package/index.mjs +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -43,5 +43,6 @@ yarn add @minsize/utils
|
|
|
43
43
|
| `parseVersionString` | Преобразует строку версии в объект JSON, разделяя её на основные части версии. |
|
|
44
44
|
| `parseVersionString` | Преобразует строку версии в объект JSON, разделяя её на основные части версии. |
|
|
45
45
|
| `EventEmitter` | Класс для работы с событиями (подписка/отписка/вызов). |
|
|
46
|
-
| `elasticClamp` | Ограничивает число указанным минимальным и максимальным значением. С эффектов
|
|
47
|
-
| `DebouncedFunction` | Класс для отложенного выполнения функции с возможностью накопления и обновления
|
|
46
|
+
| `elasticClamp` | Ограничивает число указанным минимальным и максимальным значением. С эффектов упругости. |
|
|
47
|
+
| `DebouncedFunction` | Класс для отложенного выполнения функции с возможностью накопления и обновления аргументов. |
|
|
48
|
+
| `UrlSecurityManager` | Менеджер безопасности URL. |
|
package/index.d.ts
CHANGED
|
@@ -108,9 +108,9 @@ declare const distributor: <VALUE extends unknown>(prev: VALUE, next: VALUE) =>
|
|
|
108
108
|
* @param {any} obj Произвольный JavaScript объект (string, number, array, object, итд.).
|
|
109
109
|
* @returns {string} Строка, представляющая собой уникальный ключ (хеш) для переданного объекта.
|
|
110
110
|
*/
|
|
111
|
-
declare const generateUniqueKey: <VALUE extends
|
|
111
|
+
declare const generateUniqueKey: <VALUE extends any>(obj: VALUE) => string;
|
|
112
112
|
|
|
113
|
-
declare const unlink: <VALUE extends
|
|
113
|
+
declare const unlink: <VALUE extends any>(value: VALUE) => VALUE;
|
|
114
114
|
|
|
115
115
|
interface TextParserOptions {
|
|
116
116
|
onToken?: (token: TextToken) => TextToken;
|
|
@@ -326,4 +326,159 @@ declare class DataKeeper<VALUE extends unknown> {
|
|
|
326
326
|
get updateValues(): VALUE | undefined;
|
|
327
327
|
}
|
|
328
328
|
|
|
329
|
-
|
|
329
|
+
interface UrlRule {
|
|
330
|
+
hosts: string[];
|
|
331
|
+
paths?: (string | RegExp)[];
|
|
332
|
+
hash?: (string | RegExp)[];
|
|
333
|
+
allowedParams?: string[];
|
|
334
|
+
ignoreParams?: string[];
|
|
335
|
+
priority?: number;
|
|
336
|
+
action?: UrlAction;
|
|
337
|
+
id?: string;
|
|
338
|
+
}
|
|
339
|
+
declare const enum UrlAction {
|
|
340
|
+
ALLOW = 1,
|
|
341
|
+
DENY = 2
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Менеджер безопасности URL
|
|
345
|
+
* Обеспечивает проверку и контроль доступа к URL на основе настроенных правил
|
|
346
|
+
*
|
|
347
|
+
* @example
|
|
348
|
+
* const securityManager = new UrlSecurityManager(ALLOWED_URLS);
|
|
349
|
+
* if (securityManager.isAllowed(someUrl)) {
|
|
350
|
+
* openUrl(someUrl);
|
|
351
|
+
* } else {
|
|
352
|
+
* showWarningModal(someUrl);
|
|
353
|
+
* }
|
|
354
|
+
*/
|
|
355
|
+
declare class UrlSecurityManager {
|
|
356
|
+
private rules;
|
|
357
|
+
private cache;
|
|
358
|
+
private cacheEnabled;
|
|
359
|
+
/**
|
|
360
|
+
* Создает экземпляр менеджера безопасности URL
|
|
361
|
+
*
|
|
362
|
+
* @param rules - Массив правил для проверки URL
|
|
363
|
+
* @param enableCache - Включить кеширование результатов проверки для производительности
|
|
364
|
+
*/
|
|
365
|
+
constructor(rules?: UrlRule[], enableCache?: boolean);
|
|
366
|
+
/**
|
|
367
|
+
* Проверяет, разрешен ли доступ к указанному URL
|
|
368
|
+
*
|
|
369
|
+
* @param inputUrl - URL для проверки (строка или объект URL)
|
|
370
|
+
* @returns true если доступ разрешен, false если запрещен
|
|
371
|
+
*
|
|
372
|
+
* @example
|
|
373
|
+
* securityManager.isAllowed('https://example.com') // true/false
|
|
374
|
+
* securityManager.isAllowed(new URL('https://example.com')) // true/false
|
|
375
|
+
*/
|
|
376
|
+
isAllowed(inputUrl: string | URL): boolean;
|
|
377
|
+
/**
|
|
378
|
+
* Оценивает URL по всем правилам в порядке приоритета
|
|
379
|
+
* Первое совпавшее правило определяет результат
|
|
380
|
+
*
|
|
381
|
+
* @param url - URL объект для проверки
|
|
382
|
+
* @returns Результат проверки доступа
|
|
383
|
+
*/
|
|
384
|
+
private evaluateRules;
|
|
385
|
+
/**
|
|
386
|
+
* Проверяет соответствие URL конкретному правилу
|
|
387
|
+
*
|
|
388
|
+
* @param url - URL для проверки
|
|
389
|
+
* @param rule - Правило для проверки
|
|
390
|
+
* @returns true если URL соответствует правилу
|
|
391
|
+
*/
|
|
392
|
+
private ruleMatches;
|
|
393
|
+
/**
|
|
394
|
+
* Проверяет соответствие хоста URL правилу
|
|
395
|
+
*
|
|
396
|
+
* @param rule - Правило для проверки
|
|
397
|
+
* @param url - URL для проверки
|
|
398
|
+
* @returns true если хост соответствует
|
|
399
|
+
*/
|
|
400
|
+
private checkHost;
|
|
401
|
+
/**
|
|
402
|
+
* Проверяет соответствие пути URL правилу
|
|
403
|
+
* Поддерживает как строки, так и регулярные выражения
|
|
404
|
+
*
|
|
405
|
+
* @param rule - Правило для проверки
|
|
406
|
+
* @param url - URL для проверки
|
|
407
|
+
* @returns true если путь соответствует
|
|
408
|
+
*/
|
|
409
|
+
private checkPaths;
|
|
410
|
+
/**
|
|
411
|
+
* Проверяет соответствие hash части URL правилу
|
|
412
|
+
* Поддерживает как строки, так и регулярные выражения
|
|
413
|
+
*
|
|
414
|
+
* @param rule - Правило для проверки
|
|
415
|
+
* @param url - URL для проверки
|
|
416
|
+
* @returns true если hash соответствует
|
|
417
|
+
*/
|
|
418
|
+
private checkHash;
|
|
419
|
+
/**
|
|
420
|
+
* Проверяет параметры запроса URL на соответствие правилу
|
|
421
|
+
*
|
|
422
|
+
* @param rule - Правило для проверки
|
|
423
|
+
* @param url - URL для проверки
|
|
424
|
+
* @returns true если параметры соответствуют
|
|
425
|
+
*/
|
|
426
|
+
private checkParams;
|
|
427
|
+
/**
|
|
428
|
+
* Обнаруживает обфусцированные и потенциально опасные URL
|
|
429
|
+
*
|
|
430
|
+
* @param url - URL для проверки
|
|
431
|
+
* @returns true если URL считается обфусцированным
|
|
432
|
+
*/
|
|
433
|
+
private isObfuscatedUrl;
|
|
434
|
+
/**
|
|
435
|
+
* Создает ключ для кеширования на основе нормализованного URL
|
|
436
|
+
*
|
|
437
|
+
* @param url - URL для нормализации
|
|
438
|
+
* @returns Ключ кеша
|
|
439
|
+
*/
|
|
440
|
+
private getCacheKey;
|
|
441
|
+
/**
|
|
442
|
+
* Логирует результат проверки доступа
|
|
443
|
+
*
|
|
444
|
+
* @param url - Проверяемый URL
|
|
445
|
+
* @param allowed - Результат проверки
|
|
446
|
+
*/
|
|
447
|
+
private logAccess;
|
|
448
|
+
/**
|
|
449
|
+
* Валидирует конфигурацию правил при инициализации
|
|
450
|
+
* Выводит предупреждения в консоль при некорректных правилах
|
|
451
|
+
*/
|
|
452
|
+
private validateConfig;
|
|
453
|
+
/**
|
|
454
|
+
* Находит правило, которое применилось к указанному URL
|
|
455
|
+
* Полезно для отображения пользователю причины блокировки
|
|
456
|
+
*
|
|
457
|
+
* @param inputUrl - URL для проверки
|
|
458
|
+
* @returns Найденное правило или null если не найдено
|
|
459
|
+
*
|
|
460
|
+
* @example
|
|
461
|
+
* const rule = securityManager.findMatchingRule(blockedUrl);
|
|
462
|
+
* console.log(`Access blocked by: ${rule?.id}`);
|
|
463
|
+
*/
|
|
464
|
+
findMatchingRule(inputUrl: string | URL): UrlRule | null;
|
|
465
|
+
/**
|
|
466
|
+
* Очищает кеш проверок
|
|
467
|
+
* Полезно при обновлении правил в runtime
|
|
468
|
+
*/
|
|
469
|
+
clearCache(): void;
|
|
470
|
+
/**
|
|
471
|
+
* Включает или выключает кеширование
|
|
472
|
+
*
|
|
473
|
+
* @param enabled - Состояние кеширования
|
|
474
|
+
*/
|
|
475
|
+
setCacheEnabled(enabled: boolean): void;
|
|
476
|
+
/**
|
|
477
|
+
* Возвращает текущее количество закешированных результатов
|
|
478
|
+
*
|
|
479
|
+
* @returns Количество закешированных записей
|
|
480
|
+
*/
|
|
481
|
+
getCacheSize(): number;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
export { DataKeeper, DebouncedFunction, EventEmitter, HEXtoRGB, HSVtoRGB, RGBtoHEX, RGBtoHSV, UrlAction, type UrlRule, UrlSecurityManager, alignTo, chunks, clamp, distributor as comparison, copyText, createLinksFromText, decWord, elasticClamp, formatNumber, generateUniqueKey, getChangedData, groupBy, isType, memoize, omit, orderBy, parseQueryString, parseVersionString, pick, random, randomByWeight, retry, shuffle, sleep, textParserUrl, timeAgo, toShort, unique, unlink, updateCurrent };
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const t=(t,e)=>e[t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2];function e(t,e,r){if(!r){const t=new Date;r=t.getDate()*t.getFullYear()*(t.getHours()??1)*t.getMilliseconds()}const n=function(t){const e=2**32;let r=t;return function(){var t;return r=(1664525*r+1013904223)%e,t=r,t^=t>>>21,r=(t^=t<<35)^t>>>4,(r>>>0)/e}}(r);return function(t,e,r){if(e>r)throw new Error("Минимальная граница не может быть больше максимальной.");return Math.floor(t()*(r-e+1))+e}(n,t,e)}function r(t,e){var r=Object.prototype.toString.call(t).replace("[object ","").replace("]","").toLowerCase();try{t instanceof Buffer?r="buffer":"number"===r&&isNaN(t)&&(r="nan")}catch{}return void 0!==e?r===e:r}const n=(t,e)=>{switch(r(t)){case"array":if(!function(t,e,r){if(!s(t,e,"array",r))return!1;if(t.length!==e.length)return!1;for(var o=0;o<t.length;o++)if(!n(t[o],e[o]))return!1;return!0}(t,e,{skipCheckPrev:!0}))return!1;break;case"object":if(!function(t,e,r){if(!s(t,e,"object",r))return!1;const o=Object.keys(t),i=Object.keys(e);if(o.length!==i.length)return!1;for(var c of o){if(!e.hasOwnProperty(c))return!1;if(!n(t[c],e[c]))return!1}return!0}(t,e,{skipCheckPrev:!0}))return!1;break;case"function":if(!function(t,e,r){return!!s(t,e,"function",r)&&t===e}(t,e,{skipCheckPrev:!0}))return!1;break;case"date":if(!function(t,e,r){return!!s(t,e,"date",r)&&t.getTime()===e.getTime()}(t,e,{skipCheckPrev:!0}))return!1;break;case"map":if(!function(t,e,r){if(!s(t,e,"map",r))return!1;if(t.size!==e.size)return!1;for(const[r,s]of t)if(!n(s,e.get(r)))return!1;return!0}(t,e,{skipCheckPrev:!0}))return!1;break;case"set":if(!function(t,e,r){if(!s(t,e,"set",r))return!1;if(t.size!==e.size)return!1;const o=Array.from(t.keys()),i=Array.from(e.keys());for(var c=0;c<o.length;c++)if(!n(o[c],i[c]))return!1;return!0}(t,e,{skipCheckPrev:!0}))return!1;break;default:if(t!==e)return!1}return!0};function s(t,e,n,s){return!(!s?.skipCheckPrev&&!r(t,n)||!r(e,n))}const o=t=>{switch(r(t)){case"array":return i(t);case"object":return c(t);case"number":return Number(String(t));case"string":return String(t);case"bigint":return BigInt(String(t));case"map":return new Map(t);case"set":return new Set(t);default:return t}},i=t=>{const e=[];for(const r of t)e.push(o(r));return e},c=t=>{const e={};for(const r in t)e[r]=o(t[r]);return e},a=new RegExp(/(?:https?:\/\/)?(?:www\.)?([А-Яа-яa-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*\.(?:ru|com|org|net|me|su|рф|biz|info|co|uk|de|fr|jp|cn|es|it|ca|au|nl|se|no|dk|fi|pl|at|ch|be|cz|ie|pt|ro|hu|gr|sk|bg|hr|si|lt|lv|ee|is|mt|lu|li|mc|sm|va|ad|al|ba|mk|me|rs|tr|ua|by|kz|uz|am|ge|az|tm|kg|tj|md|kg|tj|af|dz|bh|eg|iq|ir|jo|kw|lb|ly|ma|om|ps|qa|sa|sd|sy|tn|ae|ye|ar|bo|br|cl|co|ec|gf|gy|pe|py|sr|uy|ve|ag|ai|aw|bb|bm|bs|bz|ca|cr|cu|dm|do|gd|gp|gt|hn|ht|jm|kn|ky|lc|ms|mx|ni|pa|pr|sv|tc|tt|vc|vg|vi|an|aq|as|fj|fm|gu|hm|id|ki|mh|mp|nc|nf|nr|nu|pf|pg|pw|sb|tk|to|tv|vu|wf|ws)(?:\/[a-zA-Z0-9._~:\/?#[\]@!$&'()*+,;=-]*)?)(?:\s)/),u=new RegExp(/(?:https?:\/\/)(?:www\.)?([А-Яа-яa-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*\.(?:ru|com|org|net|me|su|рф|biz|info|co|uk|de|fr|jp|cn|es|it|ca|au|nl|se|no|dk|fi|pl|at|ch|be|cz|ie|pt|ro|hu|gr|sk|bg|hr|si|lt|lv|ee|is|mt|lu|li|mc|sm|va|ad|al|ba|mk|me|rs|tr|ua|by|kz|uz|am|ge|az|tm|kg|tj|md|kg|tj|af|dz|bh|eg|iq|ir|jo|kw|lb|ly|ma|om|ps|qa|sa|sd|sy|tn|ae|ye|ar|bo|br|cl|co|ec|gf|gy|pe|py|sr|uy|ve|ag|ai|aw|bb|bm|bs|bz|ca|cr|cu|dm|do|gd|gp|gt|hn|ht|jm|kn|ky|lc|ms|mx|ni|pa|pr|sv|tc|tt|vc|vg|vi|an|aq|as|fj|fm|gu|hm|id|ki|mh|mp|nc|nf|nr|nu|pf|pg|pw|sb|tk|to|tv|vu|wf|ws)(?:\/[a-zA-Z0-9._~:\/?#[\]@!$&'()*+,;=-]*)?)(?:\s)/),l=t=>t;function f(t){return Array.from(new Set(t))}function h(t,e){switch(r(t)){case"object":return function(t,e){const r={},n=Object.keys(t),s=Object.keys(e),o=f([...n,...s]);for(const n of o)r[n]=h(t[n],e[n]);return r}(t,e);case"array":return function(t,e){const r=[];for(var n=0;n<t.length;n++)r.push(h(t?.[n],e?.[n]));for(n=t.length;n<e.length;n++)r.push(h(t?.[n],e?.[n]));return r}(t,e);default:return t??e}}function p(t,e){switch(r(t)){case"object":return function(t,e){const r={};var n=!1;for(const s in e)if(t.hasOwnProperty(s)){const o=p(t?.[s],e?.[s]);void 0!==o&&(r[s]=o,n=!0)}else r[s]=e[s],n=!0;for(const s in t)s in e||(r[s]=void 0,n=!0);return n?r:void 0}(t,e);case"array":return function(t,e){const r=[];for(var n=!1,s=0;s<t.length;s++){const o=p(t?.[s],e?.[s]);void 0===o&&void 0!==e?.[s]||(r[s]=o,n=!0)}for(s=0;s<e.length;s++){const o=p(t?.[s],e?.[s]);void 0!==o&&(r[s]=o,n=!0)}return n?r:void 0}(t,e);default:if(t!==e)return e}}function g(t,e){return e.split(".").reduce(((t,e)=>t?t[e]:void 0),t)}const m=t=>{const e=t.toString(16);return 1==e.length?"0"+e:e};var b=Object.defineProperty,d=(t,e,r)=>(((t,e,r)=>{e in t?b(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r})(t,"symbol"!=typeof e?e+"":e,r),r);var y=Object.defineProperty,k=(t,e,r)=>(((t,e,r)=>{e in t?y(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r})(t,"symbol"!=typeof e?e+"":e,r),r);var x=Object.defineProperty,v=(t,e,r)=>(((t,e,r)=>{e in t?x(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r})(t,"symbol"!=typeof e?e+"":e,r),r);exports.DataKeeper=class{constructor(t){v(this,"initValue"),v(this,"currentValue"),this.initValue=o(t),this.currentValue=t}setter(t){this.currentValue=t(this.currentValue)}reset(t){this.initValue=o(t),this.currentValue=t}isModified(){return!n(this.initValue,this.currentValue)}get updateValues(){return p(this.initValue,this.currentValue)}},exports.DebouncedFunction=class{constructor(t,e){k(this,"cb"),k(this,"o"),k(this,"tId",null),k(this,"s"),this.cb=t,this.o=e,this.s=[]}execute(...t){if(this.cancel(),"[object Function]"===Object.prototype.toString.call(t[0]))this.s=t[0](...this.s);else for(let e=0;e<this.cb.length;e++)this.s[e]=t[e];this.tId=setTimeout(this.executeImmediately.bind(this),this.o.delay)}executeImmediately(){this.cancel(),this.cb(...this.s),this.s=[]}cancel(){this.tId&&(clearTimeout(this.tId),this.tId=null)}},exports.EventEmitter=class{constructor(){d(this,"e",{})}on(t,e){return this.e[t]||(this.e[t]=[]),this.e[t].push(e),()=>this.off(t,e)}off(t,e){if(!this.e[t])return;const r=this.e[t].findIndex((t=>t===e));-1!==r&&(this.e[t].splice(r,1),0===this.e[t].length&&delete this.e[t])}emit(t,...e){if(!this.e[t])return;const r=this.e[t].slice();for(const n of r)try{n(...e)}catch(e){console.error(`Ошибка в обработчике события ${t}:`,e)}}once(t,e){const r=(...n)=>{this.off(t,r),e(...n)};return this.on(t,r)}clear(t){t?delete this.e[t]:this.e={}}},exports.HEXtoRGB=t=>{if(3===(t=t.replace("#","")).length&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),6!==t.length)return[0,0,0];const e=parseInt(t.substring(0,2),16),r=parseInt(t.substring(2,4),16),n=parseInt(t.substring(4,6),16);return isNaN(e)||isNaN(r)||isNaN(n)||e<0||e>255||r<0||r>255||n<0||n>255?[0,0,0]:[e,r,n]},exports.HSVtoRGB=(t,e,r)=>{var n,s,o,i,c,a,u,l;switch(a=r*(1-e),u=r*(1-(c=6*t-(i=Math.floor(6*t)))*e),l=r*(1-(1-c)*e),i%6){case 0:n=r,s=l,o=a;break;case 1:n=u,s=r,o=a;break;case 2:n=a,s=r,o=l;break;case 3:n=a,s=u,o=r;break;case 4:n=l,s=a,o=r;break;case 5:n=r,s=a,o=u}return[Math.round(255*n),Math.round(255*s),Math.round(255*o)]},exports.RGBtoHEX=(t,e,r)=>"#"+m(t)+m(e)+m(r),exports.RGBtoHSV=(t,e,r)=>{var n=Math.max(t,e,r),s=Math.min(t,e,r),o=n-s,i=0,c=0===n?0:o/n,a=n/255;switch(n){case s:i=0;break;case t:i=e-r+o*(e<r?6:0),i/=6*o;break;case e:i=r-t+2*o,i/=6*o;break;case r:i=t-e+4*o,i/=6*o}return[i,c,a]},exports.alignTo=function(t,e){return t<=0?e:t+(e-t%e)%e},exports.chunks=(t,e)=>{const r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r},exports.clamp=(t,e,r)=>t>e?t<r?t:r:e,exports.comparison=n,exports.copyText=t=>{if(t){try{navigator.clipboard?.writeText(t)}catch{}try{var e=document.createElement("input");e.value=t,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e)}catch{}}},exports.createLinksFromText=(t,e)=>{const r=[],n=/{{([^}]+):([^}]+)}}/g;let s,o=0;for(;null!==(s=n.exec(t));)r.push(t.substring(o,s.index)),o=s.index+s[0].length,r.push({key:s[1],text:s[2]});return r.push(t.substring(o)),r.map((t=>"string"==typeof t?t:e(t.key,t.text)))},exports.decWord=t,exports.elasticClamp=(t,e,r,n={})=>{const{threshold:s=50,resistance:o=.2}=n;if(t<e){const r=e-t;return e-s*(1-Math.exp(-r*o/s))}if(t>r){const e=t-r;return r+s*(1-Math.exp(-e*o/s))}return t},exports.formatNumber=t=>(t||0).toString().replace(/\B(?=(\d{3})+(?!\d))/g,"."),exports.generateUniqueKey=t=>{const e=t=>{if("string"==typeof t||"number"==typeof t||"boolean"==typeof t||null===t)return JSON.stringify(t);if(Array.isArray(t))return"["+t.map(e).join(",")+"]";if("object"==typeof t){const r=Object.keys(t).sort();let n="{";for(let s=0;s<r.length;s++){const o=r[s];n+=JSON.stringify(o)+":"+e(t[o]),s<r.length-1&&(n+=",")}return n+="}",n}return String(t)},r=t=>{let e=0;if(0===t.length)return e;for(let r=0;r<t.length;r++){e=(e<<5)-e+t.charCodeAt(r),e|=0}return e};try{const n=e(t);return r(n).toString(16)}catch(e){return console.warn(`Object could not be fully stringified. Using a simple string conversion. Error: ${e}`),r(String(t)).toString(16)}},exports.getChangedData=p,exports.groupBy=function(t,e){return t.reduce(((t,r)=>{const n=e(r);return t[n]||(t[n]=[]),t[n].push(r),t}),{})},exports.isType=r,exports.memoize=function(t){const e=new Map;return function(...r){const n=JSON.stringify(r);if(e.has(n))return e.get(n);const s=t(...r);return e.set(n,s),s}},exports.omit=function(t,e){return Object.keys(t).reduce(((r,n)=>(e.includes(n)||(r[n]=t[n]),r)),{})},exports.orderBy=function(t,e){const r=Object.keys(e);return t.slice().sort(((t,n)=>{for(const s of r){const r="desc"===e[s]?-1:1,o=g(t,s),i=g(n,s);if(o<i)return-r;if(o>i)return r}return 0}))},exports.parseQueryString=function(t){const e={},r=(t.startsWith("?")?t.slice(1):t).split("&");for(const t of r){const[r,n]=t.split("=");if(r){const t=decodeURIComponent(r),s=n?decodeURIComponent(n):"";e[t]=s}}return e},exports.parseVersionString=function(t){const e=t.match(/^(\d+|\*)\.(\d+|\*)\.(\d+|\*)(?:-([a-zA-Z0-9-.]+))?$/);if(!e)throw new Error("Invalid version string");const[,r,n,s,o]=e,i=t=>"*"===t?"*":parseInt(t,10);return{major:i(r),minor:i(n),patch:i(s),prerelease:o||null}},exports.pick=function(t,e){return Object.keys(t).reduce(((r,n)=>(e.includes(n)&&(r[n]=t[n]),r)),{})},exports.random=e,exports.randomByWeight=function(t,r){let n=0;for(const e in t)n+=t[e];const s=e(0,n,r);let o=0;for(const e in t)if(o+=t[e],s<o)return e;const i=Object.keys(t);return i[e(0,i.length-1,r)]},exports.retry=function(t,e,r){return new Promise(((n,s)=>{const o=e=>{t().then(n).catch((t=>{0===e?s(t):(console.log(`Retrying... attempts left: ${e}`),setTimeout((()=>o(e-1)),r))}))};o(e)}))},exports.shuffle=(t,r)=>{for(let n=t.length-1;n>0;n--){const s=e(0,n,r);[t[n],t[s]]=[t[s],t[n]]}return t},exports.sleep=async t=>await new Promise((e=>setTimeout(e,t))),exports.textParserUrl=(t,e)=>{const r=e?.onToken??l,n=e?.requireProtocol??!1,s=e?.regex??n?u:a,o=[];let i=t+" ",c=s.exec(i);for(;c;){const t=c[0].trim(),e=c.index;e>0&&(o.push(r({type:"raw",value:i.substring(0,e)})),i=i.substring(e)),o.push(r({type:"url",value:t})),i=i.substring(t.length),c=s.exec(i)}return i.length>0&&o.push(r({type:"raw",value:i})),o},exports.timeAgo=e=>{if(!e)return"только что";const r=new Date(e),n=Math.floor((Date.now()-r.getTime())/1e3),s=()=>new Intl.DateTimeFormat("RU-ru",{day:"numeric",month:"short"}).format(r).replace(".",""),o=()=>r.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),i=(e,r,n)=>Array.isArray(e)?`${n} ${t(n,e)} ${r}`:`${e} ${r}`;switch(!0){case n<0:return"скоро";case n<60:return i(["секунду","секунды","секунд"],"назад",n);case n<3600:return i(["минуту","минуты","минут"],"назад",Math.floor(n/60));case n<7200:return i("час","назад",Math.floor(n/3600));case n<10800:return i("два часа","назад",Math.floor(n/3600));case n<14400:return i("три часа","назад",Math.floor(n/3600));case n<86400:return i(`сегодня в ${o()}`,"",Math.floor(n/3600));case n<172800:return i(`вчера в ${o()}`,"",Math.floor(n/86400));case n<259200:return i("два дня","назад",Math.floor(n/86400));case n<345600:return i("три дня","назад",Math.floor(n/86400));case n<31536e3:return i(`${s()} в ${o()}`,"",Math.floor(n/86400));case n>=31536e3:return i(`${s()} ${r.getFullYear()} г.`,"",Math.floor(n/31536e3))}return"только что"},exports.toShort=(t,e,r=1)=>{const n=e||["","k","M","G","T","P"],s=t<0,o=Math.abs(t),i=Math.log10(o)/3|0,c=o/10**(3*i);return parseFloat(`${s?"-":""}${c%1?(Math.floor(10*c)/10).toFixed(r):c}`)+n[i]},exports.unique=f,exports.unlink=o,exports.updateCurrent=h;
|
|
1
|
+
"use strict";const e=(e,t)=>t[e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2];function t(e,t,r){if(!r){const e=new Date;r=e.getDate()*e.getFullYear()*(e.getHours()??1)*e.getMilliseconds()}const n=function(e){const t=2**32;let r=e;return function(){var e;return r=(1664525*r+1013904223)%t,e=r,e^=e>>>21,r=(e^=e<<35)^e>>>4,(r>>>0)/t}}(r);return function(e,t,r){if(t>r)throw new Error("Минимальная граница не может быть больше максимальной.");return Math.floor(e()*(r-t+1))+t}(n,e,t)}function r(e,t){var r=Object.prototype.toString.call(e).replace("[object ","").replace("]","").toLowerCase();try{"number"===r?isNaN(e)&&(r="nan"):e instanceof Buffer&&(r="buffer")}catch{}return void 0!==t?r===t:r}const n=(e,t)=>{switch(r(e)){case"array":if(!function(e,t,r){if(!s(e,t,"array",r))return!1;if(e.length!==t.length)return!1;for(var o=0;o<e.length;o++)if(!n(e[o],t[o]))return!1;return!0}(e,t,{skipCheckPrev:!0}))return!1;break;case"object":if(!function(e,t,r){if(!s(e,t,"object",r))return!1;const o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var a of o){if(!t.hasOwnProperty(a))return!1;if(!n(e[a],t[a]))return!1}return!0}(e,t,{skipCheckPrev:!0}))return!1;break;case"function":if(!function(e,t,r){return!!s(e,t,"function",r)&&e===t}(e,t,{skipCheckPrev:!0}))return!1;break;case"date":if(!function(e,t,r){return!!s(e,t,"date",r)&&e.getTime()===t.getTime()}(e,t,{skipCheckPrev:!0}))return!1;break;case"map":if(!function(e,t,r){if(!s(e,t,"map",r))return!1;if(e.size!==t.size)return!1;for(const[r,s]of e)if(!n(s,t.get(r)))return!1;return!0}(e,t,{skipCheckPrev:!0}))return!1;break;case"set":if(!function(e,t,r){if(!s(e,t,"set",r))return!1;if(e.size!==t.size)return!1;const o=Array.from(e.keys()),i=Array.from(t.keys());for(var a=0;a<o.length;a++)if(!n(o[a],i[a]))return!1;return!0}(e,t,{skipCheckPrev:!0}))return!1;break;default:if(e!==t)return!1}return!0};function s(e,t,n,s){return!(!s?.skipCheckPrev&&!r(e,n)||!r(t,n))}const o=e=>{switch(r(e)){case"array":return i(e);case"object":return a(e);case"number":return Number(String(e));case"string":return String(e);case"bigint":return BigInt(String(e));case"map":return new Map(e);case"set":return new Set(e);default:return e}},i=e=>{const t=[];for(const r of e)t.push(o(r));return t},a=e=>{const t={};for(const r in e)t[r]=o(e[r]);return t},c=new RegExp(/(?:https?:\/\/)?(?:www\.)?([А-Яа-яa-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*\.(?:ru|com|org|net|me|su|рф|biz|info|co|uk|de|fr|jp|cn|es|it|ca|au|nl|se|no|dk|fi|pl|at|ch|be|cz|ie|pt|ro|hu|gr|sk|bg|hr|si|lt|lv|ee|is|mt|lu|li|mc|sm|va|ad|al|ba|mk|me|rs|tr|ua|by|kz|uz|am|ge|az|tm|kg|tj|md|kg|tj|af|dz|bh|eg|iq|ir|jo|kw|lb|ly|ma|om|ps|qa|sa|sd|sy|tn|ae|ye|ar|bo|br|cl|co|ec|gf|gy|pe|py|sr|uy|ve|ag|ai|aw|bb|bm|bs|bz|ca|cr|cu|dm|do|gd|gp|gt|hn|ht|jm|kn|ky|lc|ms|mx|ni|pa|pr|sv|tc|tt|vc|vg|vi|an|aq|as|fj|fm|gu|hm|id|ki|mh|mp|nc|nf|nr|nu|pf|pg|pw|sb|tk|to|tv|vu|wf|ws)(?:\/[a-zA-Z0-9._~:\/?#[\]@!$&'()*+,;=-]*)?)(?:\s)/),u=new RegExp(/(?:https?:\/\/)(?:www\.)?([А-Яа-яa-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*\.(?:ru|com|org|net|me|su|рф|biz|info|co|uk|de|fr|jp|cn|es|it|ca|au|nl|se|no|dk|fi|pl|at|ch|be|cz|ie|pt|ro|hu|gr|sk|bg|hr|si|lt|lv|ee|is|mt|lu|li|mc|sm|va|ad|al|ba|mk|me|rs|tr|ua|by|kz|uz|am|ge|az|tm|kg|tj|md|kg|tj|af|dz|bh|eg|iq|ir|jo|kw|lb|ly|ma|om|ps|qa|sa|sd|sy|tn|ae|ye|ar|bo|br|cl|co|ec|gf|gy|pe|py|sr|uy|ve|ag|ai|aw|bb|bm|bs|bz|ca|cr|cu|dm|do|gd|gp|gt|hn|ht|jm|kn|ky|lc|ms|mx|ni|pa|pr|sv|tc|tt|vc|vg|vi|an|aq|as|fj|fm|gu|hm|id|ki|mh|mp|nc|nf|nr|nu|pf|pg|pw|sb|tk|to|tv|vu|wf|ws)(?:\/[a-zA-Z0-9._~:\/?#[\]@!$&'()*+,;=-]*)?)(?:\s)/),h=e=>e;function l(e){return Array.from(new Set(e))}function f(e,t){switch(r(e)){case"object":return function(e,t){const r={},n=Object.keys(e),s=Object.keys(t),o=l([...n,...s]);for(const n of o)r[n]=f(e[n],t[n]);return r}(e,t);case"array":return function(e,t){const r=[];for(var n=0;n<e.length;n++)r.push(f(e?.[n],t?.[n]));for(n=e.length;n<t.length;n++)r.push(f(e?.[n],t?.[n]));return r}(e,t);default:return e??t}}function p(e,t){switch(r(e)){case"object":return function(e,t){const r={};var n=!1;for(const s in t)if(e.hasOwnProperty(s)){const o=p(e?.[s],t?.[s]);void 0!==o&&(r[s]=o,n=!0)}else r[s]=t[s],n=!0;for(const s in e)s in t||(r[s]=void 0,n=!0);return n?r:void 0}(e,t);case"array":return function(e,t){const r=[];for(var n=!1,s=0;s<e.length;s++){const o=p(e?.[s],t?.[s]);void 0===o&&void 0!==t?.[s]||(r[s]=o,n=!0)}for(s=0;s<t.length;s++){const o=p(e?.[s],t?.[s]);void 0!==o&&(r[s]=o,n=!0)}return n?r:void 0}(e,t);default:if(e!==t)return t}}function g(e,t){return t.split(".").reduce(((e,t)=>e?e[t]:void 0),e)}const d=e=>{const t=e.toString(16);return 1==t.length?"0"+t:t};var m=Object.defineProperty,b=(e,t,r)=>(((e,t,r)=>{t in e?m(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r})(e,"symbol"!=typeof t?t+"":t,r),r);var y=Object.defineProperty,k=(e,t,r)=>(((e,t,r)=>{t in e?y(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r})(e,"symbol"!=typeof t?t+"":t,r),r);var v=Object.defineProperty,w=(e,t,r)=>(((e,t,r)=>{t in e?v(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r})(e,"symbol"!=typeof t?t+"":t,r),r);var x=Object.defineProperty,j=(e,t,r)=>(((e,t,r)=>{t in e?x(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r})(e,"symbol"!=typeof t?t+"":t,r),r),$=(e=>(e[e.ALLOW=1]="ALLOW",e[e.DENY=2]="DENY",e))($||{});exports.DataKeeper=class{constructor(e){w(this,"initValue"),w(this,"currentValue"),this.initValue=o(e),this.currentValue=e}setter(e){this.currentValue=e(this.currentValue)}reset(e){this.initValue=o(e),this.currentValue=e}isModified(){return!n(this.initValue,this.currentValue)}get updateValues(){return p(this.initValue,this.currentValue)}},exports.DebouncedFunction=class{constructor(e,t){k(this,"cb"),k(this,"o"),k(this,"tId",null),k(this,"s"),this.cb=e,this.o=t,this.s=[]}execute(...e){if(this.cancel(),"[object Function]"===Object.prototype.toString.call(e[0]))this.s=e[0](...this.s);else for(let t=0;t<this.cb.length;t++)this.s[t]=e[t];this.tId=setTimeout(this.executeImmediately.bind(this),this.o.delay)}executeImmediately(){this.cancel(),this.cb(...this.s),this.s=[]}cancel(){this.tId&&(clearTimeout(this.tId),this.tId=null)}},exports.EventEmitter=class{constructor(){b(this,"e",{})}on(e,t){return this.e[e]||(this.e[e]=[]),this.e[e].push(t),()=>this.off(e,t)}off(e,t){if(!this.e[e])return;const r=this.e[e].findIndex((e=>e===t));-1!==r&&(this.e[e].splice(r,1),0===this.e[e].length&&delete this.e[e])}emit(e,...t){if(!this.e[e])return;const r=this.e[e].slice();for(const n of r)try{n(...t)}catch(t){console.error(`Ошибка в обработчике события ${e}:`,t)}}once(e,t){const r=(...n)=>{this.off(e,r),t(...n)};return this.on(e,r)}clear(e){e?delete this.e[e]:this.e={}}},exports.HEXtoRGB=e=>{if(3===(e=e.replace("#","")).length&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),6!==e.length)return[0,0,0];const t=parseInt(e.substring(0,2),16),r=parseInt(e.substring(2,4),16),n=parseInt(e.substring(4,6),16);return isNaN(t)||isNaN(r)||isNaN(n)||t<0||t>255||r<0||r>255||n<0||n>255?[0,0,0]:[t,r,n]},exports.HSVtoRGB=(e,t,r)=>{var n,s,o,i,a,c,u,h;switch(c=r*(1-t),u=r*(1-(a=6*e-(i=Math.floor(6*e)))*t),h=r*(1-(1-a)*t),i%6){case 0:n=r,s=h,o=c;break;case 1:n=u,s=r,o=c;break;case 2:n=c,s=r,o=h;break;case 3:n=c,s=u,o=r;break;case 4:n=h,s=c,o=r;break;case 5:n=r,s=c,o=u}return[Math.round(255*n),Math.round(255*s),Math.round(255*o)]},exports.RGBtoHEX=(e,t,r)=>"#"+d(e)+d(t)+d(r),exports.RGBtoHSV=(e,t,r)=>{var n=Math.max(e,t,r),s=Math.min(e,t,r),o=n-s,i=0,a=0===n?0:o/n,c=n/255;switch(n){case s:i=0;break;case e:i=t-r+o*(t<r?6:0),i/=6*o;break;case t:i=r-e+2*o,i/=6*o;break;case r:i=e-t+4*o,i/=6*o}return[i,a,c]},exports.UrlAction=$,exports.UrlSecurityManager=class{constructor(e=[],t=!0){j(this,"rules"),j(this,"cache"),j(this,"cacheEnabled"),this.rules=[...e].sort(((e,t)=>(e.priority||50)-(t.priority||50))),this.cache=new Map,this.cacheEnabled=t,this.validateConfig()}isAllowed(e){try{const t="string"==typeof e?new URL(e):e;if(this.isObfuscatedUrl(t))return!1;const r=this.getCacheKey(t);if(this.cacheEnabled&&this.cache.has(r))return this.cache.get(r);const n=this.evaluateRules(t);return this.cacheEnabled&&this.cache.set(r,n),this.logAccess(t,n),n}catch(t){return console.error("Invalid URL:",e,t),!1}}evaluateRules(e){let t=null,r=null;for(const n of this.rules)this.ruleMatches(e,n)&&(null===t&&(t=1===n.action,r=n.id||null),console.debug(`Rule "${n.id}" matched for ${e.href}`));return null===t?(console.warn(`No rules matched for ${e.href}, defaulting to deny`),!1):(console.debug(`Final decision for ${e.href}: ${t} (rule: ${r})`),t)}ruleMatches(e,t){return this.checkHost(t,e)&&this.checkPaths(t,e)&&this.checkHash(t,e)&&this.checkParams(t,e)}checkHost(e,t){return!!e.hosts.includes("*")||e.hosts.some((e=>t.host===e||t.host.endsWith("."+e)))}checkPaths(e,t){return!e.paths||0===e.paths.length||e.paths.some((e=>"string"==typeof e?t.pathname===e||t.pathname.startsWith(e+"/"):e.test(t.pathname)))}checkHash(e,t){if(!e.hash||0===e.hash.length)return!0;const r=t.hash;return e.hash.some((e=>"string"==typeof e?r===e:e.test(r)))}checkParams(e,t){if(!e.allowedParams&&!e.ignoreParams)return!0;const r=new URL(t.toString());if(e.ignoreParams&&e.ignoreParams.forEach((e=>{r.searchParams.delete(e)})),e.allowedParams&&r.searchParams.size>0)for(const[t]of r.searchParams)if(!e.allowedParams.includes(t))return!1;return!0}isObfuscatedUrl(e){return[/@/,/\\/,/^\d+\.\d+\.\d+\.\d+$/,/\[.*\]/,/localhost/].some((t=>t.test(e.hostname)||t.test(e.href)))}getCacheKey(e){const t=new URL(e.toString());return t.searchParams.sort(),`${t.host}${t.pathname}${t.search}${t.hash}`}logAccess(e,t){console[t?"info":"warn"](`URL ${t?"allowed":"blocked"}: ${e.href}`)}validateConfig(){const e=[];this.rules.forEach(((t,r)=>{t.hosts&&Array.isArray(t.hosts)&&0!==t.hosts.length||e.push(`Rule ${r}: missing or invalid 'hosts' array`),void 0!==t.priority&&(t.priority<1||t.priority>100)&&e.push(`Rule ${r}: priority must be between 1 and 100`),t.action&&![1,2].includes(t.action)&&e.push(`Rule ${r}: action must be 'allow' or 'deny'`)})),e.length>0&&console.warn("URL security config validation errors:",e)}findMatchingRule(e){try{const t="string"==typeof e?new URL(e):e;for(const e of this.rules)if(this.ruleMatches(t,e))return e;return null}catch(e){return null}}clearCache(){this.cache.clear()}setCacheEnabled(e){this.cacheEnabled=e,e||this.clearCache()}getCacheSize(){return this.cache.size}},exports.alignTo=function(e,t){return e<=0?t:e+(t-e%t)%t},exports.chunks=(e,t)=>{const r=[];for(let n=0;n<t.length;n+=e)r.push(t.slice(n,n+e));return r},exports.clamp=(e,t,r)=>e>t?e<r?e:r:t,exports.comparison=n,exports.copyText=e=>{if(e){try{navigator.clipboard?.writeText(e)}catch{}try{var t=document.createElement("input");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}catch{}}},exports.createLinksFromText=(e,t)=>{const r=[],n=/{{([^}]+):([^}]+)}}/g;let s,o=0;for(;null!==(s=n.exec(e));)r.push(e.substring(o,s.index)),o=s.index+s[0].length,r.push({key:s[1],text:s[2]});return r.push(e.substring(o)),r.map((e=>"string"==typeof e?e:t(e.key,e.text)))},exports.decWord=e,exports.elasticClamp=(e,t,r,n={})=>{const{threshold:s=50,resistance:o=.2}=n;if(e<t){const r=t-e;return t-s*(1-Math.exp(-r*o/s))}if(e>r){const t=e-r;return r+s*(1-Math.exp(-t*o/s))}return e},exports.formatNumber=e=>(e||0).toString().replace(/\B(?=(\d{3})+(?!\d))/g,"."),exports.generateUniqueKey=e=>{const t=e=>{if("string"==typeof e||"number"==typeof e||"boolean"==typeof e||null===e)return JSON.stringify(e);if(Array.isArray(e))return"["+e.map(t).join(",")+"]";if("object"==typeof e){const r=Object.keys(e).sort();let n="{";for(let s=0;s<r.length;s++){const o=r[s];n+=JSON.stringify(o)+":"+t(e[o]),s<r.length-1&&(n+=",")}return n+="}",n}return String(e)},r=e=>{let t=0;if(0===e.length)return t;for(let r=0;r<e.length;r++){t=(t<<5)-t+e.charCodeAt(r),t|=0}return t};try{const n=t(e);return r(n).toString(16)}catch(t){return console.warn(`Object could not be fully stringified. Using a simple string conversion. Error: ${t}`),r(String(e)).toString(16)}},exports.getChangedData=p,exports.groupBy=function(e,t){return e.reduce(((e,r)=>{const n=t(r);return e[n]||(e[n]=[]),e[n].push(r),e}),{})},exports.isType=r,exports.memoize=function(e){const t=new Map;return function(...r){const n=JSON.stringify(r);if(t.has(n))return t.get(n);const s=e(...r);return t.set(n,s),s}},exports.omit=function(e,t){return Object.keys(e).reduce(((r,n)=>(t.includes(n)||(r[n]=e[n]),r)),{})},exports.orderBy=function(e,t){const r=Object.keys(t);return e.slice().sort(((e,n)=>{for(const s of r){const r="desc"===t[s]?-1:1,o=g(e,s),i=g(n,s);if(o<i)return-r;if(o>i)return r}return 0}))},exports.parseQueryString=function(e){const t={},r=(e.startsWith("?")?e.slice(1):e).split("&");for(const e of r){const[r,n]=e.split("=");if(r){const e=decodeURIComponent(r),s=n?decodeURIComponent(n):"";t[e]=s}}return t},exports.parseVersionString=function(e){const t=e.match(/^(\d+|\*)\.(\d+|\*)\.(\d+|\*)(?:-([a-zA-Z0-9-.]+))?$/);if(!t)throw new Error("Invalid version string");const[,r,n,s,o]=t,i=e=>"*"===e?"*":parseInt(e,10);return{major:i(r),minor:i(n),patch:i(s),prerelease:o||null}},exports.pick=function(e,t){return Object.keys(e).reduce(((r,n)=>(t.includes(n)&&(r[n]=e[n]),r)),{})},exports.random=t,exports.randomByWeight=function(e,r){let n=0;for(const t in e)n+=e[t];const s=t(0,n,r);let o=0;for(const t in e)if(o+=e[t],s<o)return t;const i=Object.keys(e);return i[t(0,i.length-1,r)]},exports.retry=function(e,t,r){return new Promise(((n,s)=>{const o=t=>{e().then(n).catch((e=>{0===t?s(e):(console.log(`Retrying... attempts left: ${t}`),setTimeout((()=>o(t-1)),r))}))};o(t)}))},exports.shuffle=(e,r)=>{for(let n=e.length-1;n>0;n--){const s=t(0,n,r);[e[n],e[s]]=[e[s],e[n]]}return e},exports.sleep=async e=>await new Promise((t=>setTimeout(t,e))),exports.textParserUrl=(e,t)=>{const r=t?.onToken??h,n=t?.requireProtocol??!1,s=t?.regex??n?u:c,o=[];let i=e+" ",a=s.exec(i);for(;a;){const e=a[0].trim(),t=a.index;t>0&&(o.push(r({type:"raw",value:i.substring(0,t)})),i=i.substring(t)),o.push(r({type:"url",value:e})),i=i.substring(e.length),a=s.exec(i)}return i.length>0&&o.push(r({type:"raw",value:i})),o},exports.timeAgo=t=>{if(!t)return"только что";const r=new Date(t),n=Math.floor((Date.now()-r.getTime())/1e3),s=()=>new Intl.DateTimeFormat("RU-ru",{day:"numeric",month:"short"}).format(r).replace(".",""),o=()=>r.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),i=(t,r,n)=>Array.isArray(t)?`${n} ${e(n,t)} ${r}`:`${t} ${r}`;switch(!0){case n<0:return"скоро";case n<60:return i(["секунду","секунды","секунд"],"назад",n);case n<3600:return i(["минуту","минуты","минут"],"назад",Math.floor(n/60));case n<7200:return i("час","назад",Math.floor(n/3600));case n<10800:return i("два часа","назад",Math.floor(n/3600));case n<14400:return i("три часа","назад",Math.floor(n/3600));case n<86400:return i(`сегодня в ${o()}`,"",Math.floor(n/3600));case n<172800:return i(`вчера в ${o()}`,"",Math.floor(n/86400));case n<259200:return i("два дня","назад",Math.floor(n/86400));case n<345600:return i("три дня","назад",Math.floor(n/86400));case n<31536e3:return i(`${s()} в ${o()}`,"",Math.floor(n/86400));case n>=31536e3:return i(`${s()} ${r.getFullYear()} г.`,"",Math.floor(n/31536e3))}return"только что"},exports.toShort=(e,t,r=1)=>{const n=t||["","k","M","G","T","P"],s=e<0,o=Math.abs(e),i=Math.log10(o)/3|0,a=o/10**(3*i);return parseFloat(`${s?"-":""}${a%1?(Math.floor(10*a)/10).toFixed(r):a}`)+n[i]},exports.unique=l,exports.unlink=o,exports.updateCurrent=f;
|
package/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const t=(t,e,r)=>t>e?t<r?t:r:e,e=(t,e)=>e[t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2];function r(t,e){return t<=0?e:t+(e-t%e)%e}const n=(t,e,r=1)=>{const n=e||["","k","M","G","T","P"],s=t<0,o=Math.abs(t),i=Math.log10(o)/3|0,c=o/10**(3*i);return parseFloat(`${s?"-":""}${c%1?(Math.floor(10*c)/10).toFixed(r):c}`)+n[i]},s=t=>{if(!t)return"только что";const r=new Date(t),n=Math.floor((Date.now()-r.getTime())/1e3),s=()=>new Intl.DateTimeFormat("RU-ru",{day:"numeric",month:"short"}).format(r).replace(".",""),o=()=>r.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),i=(t,r,n)=>Array.isArray(t)?`${n} ${e(n,t)} ${r}`:`${t} ${r}`;switch(!0){case n<0:return"скоро";case n<60:return i(["секунду","секунды","секунд"],"назад",n);case n<3600:return i(["минуту","минуты","минут"],"назад",Math.floor(n/60));case n<7200:return i("час","назад",Math.floor(n/3600));case n<10800:return i("два часа","назад",Math.floor(n/3600));case n<14400:return i("три часа","назад",Math.floor(n/3600));case n<86400:return i(`сегодня в ${o()}`,"",Math.floor(n/3600));case n<172800:return i(`вчера в ${o()}`,"",Math.floor(n/86400));case n<259200:return i("два дня","назад",Math.floor(n/86400));case n<345600:return i("три дня","назад",Math.floor(n/86400));case n<31536e3:return i(`${s()} в ${o()}`,"",Math.floor(n/86400));case n>=31536e3:return i(`${s()} ${r.getFullYear()} г.`,"",Math.floor(n/31536e3))}return"только что"},o=t=>(t||0).toString().replace(/\B(?=(\d{3})+(?!\d))/g,".");function i(t,e,r){if(!r){const t=new Date;r=t.getDate()*t.getFullYear()*(t.getHours()??1)*t.getMilliseconds()}const n=function(t){const e=2**32;let r=t;return function(){var t;return r=(1664525*r+1013904223)%e,t=r,t^=t>>>21,r=(t^=t<<35)^t>>>4,(r>>>0)/e}}(r);return function(t,e,r){if(e>r)throw new Error("Минимальная граница не может быть больше максимальной.");return Math.floor(t()*(r-e+1))+e}(n,t,e)}function c(t,e){let r=0;for(const e in t)r+=t[e];const n=i(0,r,e);let s=0;for(const e in t)if(s+=t[e],n<s)return e;const o=Object.keys(t);return o[i(0,o.length-1,e)]}function a(t,e){var r=Object.prototype.toString.call(t).replace("[object ","").replace("]","").toLowerCase();try{t instanceof Buffer?r="buffer":"number"===r&&isNaN(t)&&(r="nan")}catch{}return void 0!==e?r===e:r}function u(t,e){return Object.keys(t).reduce(((r,n)=>(e.includes(n)||(r[n]=t[n]),r)),{})}function l(t,e){return Object.keys(t).reduce(((r,n)=>(e.includes(n)&&(r[n]=t[n]),r)),{})}const f=async t=>await new Promise((e=>setTimeout(e,t))),h=t=>{if(t){try{navigator.clipboard?.writeText(t)}catch{}try{var e=document.createElement("input");e.value=t,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e)}catch{}}},g=(t,e)=>{const r=[],n=/{{([^}]+):([^}]+)}}/g;let s,o=0;for(;null!==(s=n.exec(t));)r.push(t.substring(o,s.index)),o=s.index+s[0].length,r.push({key:s[1],text:s[2]});return r.push(t.substring(o)),r.map((t=>"string"==typeof t?t:e(t.key,t.text)))},p=(t,e)=>{switch(a(t)){case"array":if(!function(t,e,r){if(!b(t,e,"array",r))return!1;if(t.length!==e.length)return!1;for(var n=0;n<t.length;n++)if(!p(t[n],e[n]))return!1;return!0}(t,e,{skipCheckPrev:!0}))return!1;break;case"object":if(!function(t,e,r){if(!b(t,e,"object",r))return!1;const n=Object.keys(t),s=Object.keys(e);if(n.length!==s.length)return!1;for(var o of n){if(!e.hasOwnProperty(o))return!1;if(!p(t[o],e[o]))return!1}return!0}(t,e,{skipCheckPrev:!0}))return!1;break;case"function":if(!function(t,e,r){return!!b(t,e,"function",r)&&t===e}(t,e,{skipCheckPrev:!0}))return!1;break;case"date":if(!function(t,e,r){return!!b(t,e,"date",r)&&t.getTime()===e.getTime()}(t,e,{skipCheckPrev:!0}))return!1;break;case"map":if(!function(t,e,r){if(!b(t,e,"map",r))return!1;if(t.size!==e.size)return!1;for(const[r,n]of t)if(!p(n,e.get(r)))return!1;return!0}(t,e,{skipCheckPrev:!0}))return!1;break;case"set":if(!function(t,e,r){if(!b(t,e,"set",r))return!1;if(t.size!==e.size)return!1;const n=Array.from(t.keys()),s=Array.from(e.keys());for(var o=0;o<n.length;o++)if(!p(n[o],s[o]))return!1;return!0}(t,e,{skipCheckPrev:!0}))return!1;break;default:if(t!==e)return!1}return!0};function b(t,e,r,n){return!(!n?.skipCheckPrev&&!a(t,r)||!a(e,r))}const m=t=>{const e=t=>{if("string"==typeof t||"number"==typeof t||"boolean"==typeof t||null===t)return JSON.stringify(t);if(Array.isArray(t))return"["+t.map(e).join(",")+"]";if("object"==typeof t){const r=Object.keys(t).sort();let n="{";for(let s=0;s<r.length;s++){const o=r[s];n+=JSON.stringify(o)+":"+e(t[o]),s<r.length-1&&(n+=",")}return n+="}",n}return String(t)},r=t=>{let e=0;if(0===t.length)return e;for(let r=0;r<t.length;r++){e=(e<<5)-e+t.charCodeAt(r),e|=0}return e};try{const n=e(t);return r(n).toString(16)}catch(e){return console.warn(`Object could not be fully stringified. Using a simple string conversion. Error: ${e}`),r(String(t)).toString(16)}},d=t=>{switch(a(t)){case"array":return y(t);case"object":return k(t);case"number":return Number(String(t));case"string":return String(t);case"bigint":return BigInt(String(t));case"map":return new Map(t);case"set":return new Set(t);default:return t}},y=t=>{const e=[];for(const r of t)e.push(d(r));return e},k=t=>{const e={};for(const r in t)e[r]=d(t[r]);return e},v=new RegExp(/(?:https?:\/\/)?(?:www\.)?([А-Яа-яa-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*\.(?:ru|com|org|net|me|su|рф|biz|info|co|uk|de|fr|jp|cn|es|it|ca|au|nl|se|no|dk|fi|pl|at|ch|be|cz|ie|pt|ro|hu|gr|sk|bg|hr|si|lt|lv|ee|is|mt|lu|li|mc|sm|va|ad|al|ba|mk|me|rs|tr|ua|by|kz|uz|am|ge|az|tm|kg|tj|md|kg|tj|af|dz|bh|eg|iq|ir|jo|kw|lb|ly|ma|om|ps|qa|sa|sd|sy|tn|ae|ye|ar|bo|br|cl|co|ec|gf|gy|pe|py|sr|uy|ve|ag|ai|aw|bb|bm|bs|bz|ca|cr|cu|dm|do|gd|gp|gt|hn|ht|jm|kn|ky|lc|ms|mx|ni|pa|pr|sv|tc|tt|vc|vg|vi|an|aq|as|fj|fm|gu|hm|id|ki|mh|mp|nc|nf|nr|nu|pf|pg|pw|sb|tk|to|tv|vu|wf|ws)(?:\/[a-zA-Z0-9._~:\/?#[\]@!$&'()*+,;=-]*)?)(?:\s)/),w=new RegExp(/(?:https?:\/\/)(?:www\.)?([А-Яа-яa-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*\.(?:ru|com|org|net|me|su|рф|biz|info|co|uk|de|fr|jp|cn|es|it|ca|au|nl|se|no|dk|fi|pl|at|ch|be|cz|ie|pt|ro|hu|gr|sk|bg|hr|si|lt|lv|ee|is|mt|lu|li|mc|sm|va|ad|al|ba|mk|me|rs|tr|ua|by|kz|uz|am|ge|az|tm|kg|tj|md|kg|tj|af|dz|bh|eg|iq|ir|jo|kw|lb|ly|ma|om|ps|qa|sa|sd|sy|tn|ae|ye|ar|bo|br|cl|co|ec|gf|gy|pe|py|sr|uy|ve|ag|ai|aw|bb|bm|bs|bz|ca|cr|cu|dm|do|gd|gp|gt|hn|ht|jm|kn|ky|lc|ms|mx|ni|pa|pr|sv|tc|tt|vc|vg|vi|an|aq|as|fj|fm|gu|hm|id|ki|mh|mp|nc|nf|nr|nu|pf|pg|pw|sb|tk|to|tv|vu|wf|ws)(?:\/[a-zA-Z0-9._~:\/?#[\]@!$&'()*+,;=-]*)?)(?:\s)/),j=t=>t,M=(t,e)=>{const r=e?.onToken??j,n=e?.requireProtocol??!1,s=e?.regex??n?w:v,o=[];let i=t+" ",c=s.exec(i);for(;c;){const t=c[0].trim(),e=c.index;e>0&&(o.push(r({type:"raw",value:i.substring(0,e)})),i=i.substring(e)),o.push(r({type:"url",value:t})),i=i.substring(t.length),c=s.exec(i)}return i.length>0&&o.push(r({type:"raw",value:i})),o};function z(t){const e=new Map;return function(...r){const n=JSON.stringify(r);if(e.has(n))return e.get(n);const s=t(...r);return e.set(n,s),s}}function x(t,e,r){return new Promise(((n,s)=>{const o=e=>{t().then(n).catch((t=>{0===e?s(t):(console.log(`Retrying... attempts left: ${e}`),setTimeout((()=>o(e-1)),r))}))};o(e)}))}function O(t){const e={},r=(t.startsWith("?")?t.slice(1):t).split("&");for(const t of r){const[r,n]=t.split("=");if(r){const t=decodeURIComponent(r),s=n?decodeURIComponent(n):"";e[t]=s}}return e}function $(t){const e=t.match(/^(\d+|\*)\.(\d+|\*)\.(\d+|\*)(?:-([a-zA-Z0-9-.]+))?$/);if(!e)throw new Error("Invalid version string");const[,r,n,s,o]=e,i=t=>"*"===t?"*":parseInt(t,10);return{major:i(r),minor:i(n),patch:i(s),prerelease:o||null}}const I=(t,e,r,n={})=>{const{threshold:s=50,resistance:o=.2}=n;if(t<e){const r=e-t;return e-s*(1-Math.exp(-r*o/s))}if(t>r){const e=t-r;return r+s*(1-Math.exp(-e*o/s))}return t};function S(t){return Array.from(new Set(t))}function P(t,e){switch(a(t)){case"object":return function(t,e){const r={},n=Object.keys(t),s=Object.keys(e),o=S([...n,...s]);for(const n of o)r[n]=P(t[n],e[n]);return r}(t,e);case"array":return function(t,e){const r=[];for(var n=0;n<t.length;n++)r.push(P(t?.[n],e?.[n]));for(n=t.length;n<e.length;n++)r.push(P(t?.[n],e?.[n]));return r}(t,e);default:return t??e}}function A(t,e){switch(a(t)){case"object":return function(t,e){const r={};var n=!1;for(const s in e)if(t.hasOwnProperty(s)){const o=A(t?.[s],e?.[s]);void 0!==o&&(r[s]=o,n=!0)}else r[s]=e[s],n=!0;for(const s in t)s in e||(r[s]=void 0,n=!0);return n?r:void 0}(t,e);case"array":return function(t,e){const r=[];for(var n=!1,s=0;s<t.length;s++){const o=A(t?.[s],e?.[s]);void 0===o&&void 0!==e?.[s]||(r[s]=o,n=!0)}for(s=0;s<e.length;s++){const o=A(t?.[s],e?.[s]);void 0!==o&&(r[s]=o,n=!0)}return n?r:void 0}(t,e);default:if(t!==e)return e}}const C=(t,e)=>{const r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r},V=(t,e)=>{for(let r=t.length-1;r>0;r--){const n=i(0,r,e);[t[r],t[n]]=[t[n],t[r]]}return t};function N(t,e){return t.reduce(((t,r)=>{const n=e(r);return t[n]||(t[n]=[]),t[n].push(r),t}),{})}function T(t,e){return e.split(".").reduce(((t,e)=>t?t[e]:void 0),t)}function q(t,e){const r=Object.keys(e);return t.slice().sort(((t,n)=>{for(const s of r){const r="desc"===e[s]?-1:1,o=T(t,s),i=T(n,s);if(o<i)return-r;if(o>i)return r}return 0}))}const Z=(t,e,r)=>{var n,s,o,i,c,a,u,l;switch(a=r*(1-e),u=r*(1-(c=6*t-(i=Math.floor(6*t)))*e),l=r*(1-(1-c)*e),i%6){case 0:n=r,s=l,o=a;break;case 1:n=u,s=r,o=a;break;case 2:n=a,s=r,o=l;break;case 3:n=a,s=u,o=r;break;case 4:n=l,s=a,o=r;break;case 5:n=r,s=a,o=u}return[Math.round(255*n),Math.round(255*s),Math.round(255*o)]},E=t=>{const e=t.toString(16);return 1==e.length?"0"+e:e},F=(t,e,r)=>"#"+E(t)+E(e)+E(r),R=(t,e,r)=>{var n=Math.max(t,e,r),s=Math.min(t,e,r),o=n-s,i=0,c=0===n?0:o/n,a=n/255;switch(n){case s:i=0;break;case t:i=e-r+o*(e<r?6:0),i/=6*o;break;case e:i=r-t+2*o,i/=6*o;break;case r:i=t-e+4*o,i/=6*o}return[i,c,a]},D=t=>{if(3===(t=t.replace("#","")).length&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),6!==t.length)return[0,0,0];const e=parseInt(t.substring(0,2),16),r=parseInt(t.substring(2,4),16),n=parseInt(t.substring(4,6),16);return isNaN(e)||isNaN(r)||isNaN(n)||e<0||e>255||r<0||r>255||n<0||n>255?[0,0,0]:[e,r,n]};var U=Object.defineProperty,B=(t,e,r)=>(((t,e,r)=>{e in t?U(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r})(t,"symbol"!=typeof e?e+"":e,r),r);class J{constructor(){B(this,"e",{})}on(t,e){return this.e[t]||(this.e[t]=[]),this.e[t].push(e),()=>this.off(t,e)}off(t,e){if(!this.e[t])return;const r=this.e[t].findIndex((t=>t===e));-1!==r&&(this.e[t].splice(r,1),0===this.e[t].length&&delete this.e[t])}emit(t,...e){if(!this.e[t])return;const r=this.e[t].slice();for(const n of r)try{n(...e)}catch(e){console.error(`Ошибка в обработчике события ${t}:`,e)}}once(t,e){const r=(...n)=>{this.off(t,r),e(...n)};return this.on(t,r)}clear(t){t?delete this.e[t]:this.e={}}}var L=Object.defineProperty,Y=(t,e,r)=>(((t,e,r)=>{e in t?L(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r})(t,"symbol"!=typeof e?e+"":e,r),r);class _{constructor(t,e){Y(this,"cb"),Y(this,"o"),Y(this,"tId",null),Y(this,"s"),this.cb=t,this.o=e,this.s=[]}execute(...t){if(this.cancel(),"[object Function]"===Object.prototype.toString.call(t[0]))this.s=t[0](...this.s);else for(let e=0;e<this.cb.length;e++)this.s[e]=t[e];this.tId=setTimeout(this.executeImmediately.bind(this),this.o.delay)}executeImmediately(){this.cancel(),this.cb(...this.s),this.s=[]}cancel(){this.tId&&(clearTimeout(this.tId),this.tId=null)}}var G=Object.defineProperty,H=(t,e,r)=>(((t,e,r)=>{e in t?G(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r})(t,"symbol"!=typeof e?e+"":e,r),r);class W{constructor(t){H(this,"initValue"),H(this,"currentValue"),this.initValue=d(t),this.currentValue=t}setter(t){this.currentValue=t(this.currentValue)}reset(t){this.initValue=d(t),this.currentValue=t}isModified(){return!p(this.initValue,this.currentValue)}get updateValues(){return A(this.initValue,this.currentValue)}}export{W as DataKeeper,_ as DebouncedFunction,J as EventEmitter,D as HEXtoRGB,Z as HSVtoRGB,F as RGBtoHEX,R as RGBtoHSV,r as alignTo,C as chunks,t as clamp,p as comparison,h as copyText,g as createLinksFromText,e as decWord,I as elasticClamp,o as formatNumber,m as generateUniqueKey,A as getChangedData,N as groupBy,a as isType,z as memoize,u as omit,q as orderBy,O as parseQueryString,$ as parseVersionString,l as pick,i as random,c as randomByWeight,x as retry,V as shuffle,f as sleep,M as textParserUrl,s as timeAgo,n as toShort,S as unique,d as unlink,P as updateCurrent};
|
|
1
|
+
const e=(e,t,r)=>e>t?e<r?e:r:t,t=(e,t)=>t[e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2];function r(e,t){return e<=0?t:e+(t-e%t)%t}const n=(e,t,r=1)=>{const n=t||["","k","M","G","T","P"],s=e<0,o=Math.abs(e),i=Math.log10(o)/3|0,a=o/10**(3*i);return parseFloat(`${s?"-":""}${a%1?(Math.floor(10*a)/10).toFixed(r):a}`)+n[i]},s=e=>{if(!e)return"только что";const r=new Date(e),n=Math.floor((Date.now()-r.getTime())/1e3),s=()=>new Intl.DateTimeFormat("RU-ru",{day:"numeric",month:"short"}).format(r).replace(".",""),o=()=>r.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),i=(e,r,n)=>Array.isArray(e)?`${n} ${t(n,e)} ${r}`:`${e} ${r}`;switch(!0){case n<0:return"скоро";case n<60:return i(["секунду","секунды","секунд"],"назад",n);case n<3600:return i(["минуту","минуты","минут"],"назад",Math.floor(n/60));case n<7200:return i("час","назад",Math.floor(n/3600));case n<10800:return i("два часа","назад",Math.floor(n/3600));case n<14400:return i("три часа","назад",Math.floor(n/3600));case n<86400:return i(`сегодня в ${o()}`,"",Math.floor(n/3600));case n<172800:return i(`вчера в ${o()}`,"",Math.floor(n/86400));case n<259200:return i("два дня","назад",Math.floor(n/86400));case n<345600:return i("три дня","назад",Math.floor(n/86400));case n<31536e3:return i(`${s()} в ${o()}`,"",Math.floor(n/86400));case n>=31536e3:return i(`${s()} ${r.getFullYear()} г.`,"",Math.floor(n/31536e3))}return"только что"},o=e=>(e||0).toString().replace(/\B(?=(\d{3})+(?!\d))/g,".");function i(e,t,r){if(!r){const e=new Date;r=e.getDate()*e.getFullYear()*(e.getHours()??1)*e.getMilliseconds()}const n=function(e){const t=2**32;let r=e;return function(){var e;return r=(1664525*r+1013904223)%t,e=r,e^=e>>>21,r=(e^=e<<35)^e>>>4,(r>>>0)/t}}(r);return function(e,t,r){if(t>r)throw new Error("Минимальная граница не может быть больше максимальной.");return Math.floor(e()*(r-t+1))+t}(n,e,t)}function a(e,t){let r=0;for(const t in e)r+=e[t];const n=i(0,r,t);let s=0;for(const t in e)if(s+=e[t],n<s)return t;const o=Object.keys(e);return o[i(0,o.length-1,t)]}function c(e,t){var r=Object.prototype.toString.call(e).replace("[object ","").replace("]","").toLowerCase();try{"number"===r?isNaN(e)&&(r="nan"):e instanceof Buffer&&(r="buffer")}catch{}return void 0!==t?r===t:r}function u(e,t){return Object.keys(e).reduce(((r,n)=>(t.includes(n)||(r[n]=e[n]),r)),{})}function h(e,t){return Object.keys(e).reduce(((r,n)=>(t.includes(n)&&(r[n]=e[n]),r)),{})}const l=async e=>await new Promise((t=>setTimeout(t,e))),f=e=>{if(e){try{navigator.clipboard?.writeText(e)}catch{}try{var t=document.createElement("input");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}catch{}}},g=(e,t)=>{const r=[],n=/{{([^}]+):([^}]+)}}/g;let s,o=0;for(;null!==(s=n.exec(e));)r.push(e.substring(o,s.index)),o=s.index+s[0].length,r.push({key:s[1],text:s[2]});return r.push(e.substring(o)),r.map((e=>"string"==typeof e?e:t(e.key,e.text)))},d=(e,t)=>{switch(c(e)){case"array":if(!function(e,t,r){if(!m(e,t,"array",r))return!1;if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++)if(!d(e[n],t[n]))return!1;return!0}(e,t,{skipCheckPrev:!0}))return!1;break;case"object":if(!function(e,t,r){if(!m(e,t,"object",r))return!1;const n=Object.keys(e),s=Object.keys(t);if(n.length!==s.length)return!1;for(var o of n){if(!t.hasOwnProperty(o))return!1;if(!d(e[o],t[o]))return!1}return!0}(e,t,{skipCheckPrev:!0}))return!1;break;case"function":if(!function(e,t,r){return!!m(e,t,"function",r)&&e===t}(e,t,{skipCheckPrev:!0}))return!1;break;case"date":if(!function(e,t,r){return!!m(e,t,"date",r)&&e.getTime()===t.getTime()}(e,t,{skipCheckPrev:!0}))return!1;break;case"map":if(!function(e,t,r){if(!m(e,t,"map",r))return!1;if(e.size!==t.size)return!1;for(const[r,n]of e)if(!d(n,t.get(r)))return!1;return!0}(e,t,{skipCheckPrev:!0}))return!1;break;case"set":if(!function(e,t,r){if(!m(e,t,"set",r))return!1;if(e.size!==t.size)return!1;const n=Array.from(e.keys()),s=Array.from(t.keys());for(var o=0;o<n.length;o++)if(!d(n[o],s[o]))return!1;return!0}(e,t,{skipCheckPrev:!0}))return!1;break;default:if(e!==t)return!1}return!0};function m(e,t,r,n){return!(!n?.skipCheckPrev&&!c(e,r)||!c(t,r))}const p=e=>{const t=e=>{if("string"==typeof e||"number"==typeof e||"boolean"==typeof e||null===e)return JSON.stringify(e);if(Array.isArray(e))return"["+e.map(t).join(",")+"]";if("object"==typeof e){const r=Object.keys(e).sort();let n="{";for(let s=0;s<r.length;s++){const o=r[s];n+=JSON.stringify(o)+":"+t(e[o]),s<r.length-1&&(n+=",")}return n+="}",n}return String(e)},r=e=>{let t=0;if(0===e.length)return t;for(let r=0;r<e.length;r++){t=(t<<5)-t+e.charCodeAt(r),t|=0}return t};try{const n=t(e);return r(n).toString(16)}catch(t){return console.warn(`Object could not be fully stringified. Using a simple string conversion. Error: ${t}`),r(String(e)).toString(16)}},b=e=>{switch(c(e)){case"array":return y(e);case"object":return k(e);case"number":return Number(String(e));case"string":return String(e);case"bigint":return BigInt(String(e));case"map":return new Map(e);case"set":return new Set(e);default:return e}},y=e=>{const t=[];for(const r of e)t.push(b(r));return t},k=e=>{const t={};for(const r in e)t[r]=b(e[r]);return t},v=new RegExp(/(?:https?:\/\/)?(?:www\.)?([А-Яа-яa-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*\.(?:ru|com|org|net|me|su|рф|biz|info|co|uk|de|fr|jp|cn|es|it|ca|au|nl|se|no|dk|fi|pl|at|ch|be|cz|ie|pt|ro|hu|gr|sk|bg|hr|si|lt|lv|ee|is|mt|lu|li|mc|sm|va|ad|al|ba|mk|me|rs|tr|ua|by|kz|uz|am|ge|az|tm|kg|tj|md|kg|tj|af|dz|bh|eg|iq|ir|jo|kw|lb|ly|ma|om|ps|qa|sa|sd|sy|tn|ae|ye|ar|bo|br|cl|co|ec|gf|gy|pe|py|sr|uy|ve|ag|ai|aw|bb|bm|bs|bz|ca|cr|cu|dm|do|gd|gp|gt|hn|ht|jm|kn|ky|lc|ms|mx|ni|pa|pr|sv|tc|tt|vc|vg|vi|an|aq|as|fj|fm|gu|hm|id|ki|mh|mp|nc|nf|nr|nu|pf|pg|pw|sb|tk|to|tv|vu|wf|ws)(?:\/[a-zA-Z0-9._~:\/?#[\]@!$&'()*+,;=-]*)?)(?:\s)/),w=new RegExp(/(?:https?:\/\/)(?:www\.)?([А-Яа-яa-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*\.(?:ru|com|org|net|me|su|рф|biz|info|co|uk|de|fr|jp|cn|es|it|ca|au|nl|se|no|dk|fi|pl|at|ch|be|cz|ie|pt|ro|hu|gr|sk|bg|hr|si|lt|lv|ee|is|mt|lu|li|mc|sm|va|ad|al|ba|mk|me|rs|tr|ua|by|kz|uz|am|ge|az|tm|kg|tj|md|kg|tj|af|dz|bh|eg|iq|ir|jo|kw|lb|ly|ma|om|ps|qa|sa|sd|sy|tn|ae|ye|ar|bo|br|cl|co|ec|gf|gy|pe|py|sr|uy|ve|ag|ai|aw|bb|bm|bs|bz|ca|cr|cu|dm|do|gd|gp|gt|hn|ht|jm|kn|ky|lc|ms|mx|ni|pa|pr|sv|tc|tt|vc|vg|vi|an|aq|as|fj|fm|gu|hm|id|ki|mh|mp|nc|nf|nr|nu|pf|pg|pw|sb|tk|to|tv|vu|wf|ws)(?:\/[a-zA-Z0-9._~:\/?#[\]@!$&'()*+,;=-]*)?)(?:\s)/),j=e=>e,$=(e,t)=>{const r=t?.onToken??j,n=t?.requireProtocol??!1,s=t?.regex??n?w:v,o=[];let i=e+" ",a=s.exec(i);for(;a;){const e=a[0].trim(),t=a.index;t>0&&(o.push(r({type:"raw",value:i.substring(0,t)})),i=i.substring(t)),o.push(r({type:"url",value:e})),i=i.substring(e.length),a=s.exec(i)}return i.length>0&&o.push(r({type:"raw",value:i})),o};function M(e){const t=new Map;return function(...r){const n=JSON.stringify(r);if(t.has(n))return t.get(n);const s=e(...r);return t.set(n,s),s}}function P(e,t,r){return new Promise(((n,s)=>{const o=t=>{e().then(n).catch((e=>{0===t?s(e):(console.log(`Retrying... attempts left: ${t}`),setTimeout((()=>o(t-1)),r))}))};o(t)}))}function z(e){const t={},r=(e.startsWith("?")?e.slice(1):e).split("&");for(const e of r){const[r,n]=e.split("=");if(r){const e=decodeURIComponent(r),s=n?decodeURIComponent(n):"";t[e]=s}}return t}function O(e){const t=e.match(/^(\d+|\*)\.(\d+|\*)\.(\d+|\*)(?:-([a-zA-Z0-9-.]+))?$/);if(!t)throw new Error("Invalid version string");const[,r,n,s,o]=t,i=e=>"*"===e?"*":parseInt(e,10);return{major:i(r),minor:i(n),patch:i(s),prerelease:o||null}}const x=(e,t,r,n={})=>{const{threshold:s=50,resistance:o=.2}=n;if(e<t){const r=t-e;return t-s*(1-Math.exp(-r*o/s))}if(e>r){const t=e-r;return r+s*(1-Math.exp(-t*o/s))}return e};function A(e){return Array.from(new Set(e))}function C(e,t){switch(c(e)){case"object":return function(e,t){const r={},n=Object.keys(e),s=Object.keys(t),o=A([...n,...s]);for(const n of o)r[n]=C(e[n],t[n]);return r}(e,t);case"array":return function(e,t){const r=[];for(var n=0;n<e.length;n++)r.push(C(e?.[n],t?.[n]));for(n=e.length;n<t.length;n++)r.push(C(e?.[n],t?.[n]));return r}(e,t);default:return e??t}}function R(e,t){switch(c(e)){case"object":return function(e,t){const r={};var n=!1;for(const s in t)if(e.hasOwnProperty(s)){const o=R(e?.[s],t?.[s]);void 0!==o&&(r[s]=o,n=!0)}else r[s]=t[s],n=!0;for(const s in e)s in t||(r[s]=void 0,n=!0);return n?r:void 0}(e,t);case"array":return function(e,t){const r=[];for(var n=!1,s=0;s<e.length;s++){const o=R(e?.[s],t?.[s]);void 0===o&&void 0!==t?.[s]||(r[s]=o,n=!0)}for(s=0;s<t.length;s++){const o=R(e?.[s],t?.[s]);void 0!==o&&(r[s]=o,n=!0)}return n?r:void 0}(e,t);default:if(e!==t)return t}}const S=(e,t)=>{const r=[];for(let n=0;n<t.length;n+=e)r.push(t.slice(n,n+e));return r},I=(e,t)=>{for(let r=e.length-1;r>0;r--){const n=i(0,r,t);[e[r],e[n]]=[e[n],e[r]]}return e};function E(e,t){return e.reduce(((e,r)=>{const n=t(r);return e[n]||(e[n]=[]),e[n].push(r),e}),{})}function N(e,t){return t.split(".").reduce(((e,t)=>e?e[t]:void 0),e)}function L(e,t){const r=Object.keys(t);return e.slice().sort(((e,n)=>{for(const s of r){const r="desc"===t[s]?-1:1,o=N(e,s),i=N(n,s);if(o<i)return-r;if(o>i)return r}return 0}))}const U=(e,t,r)=>{var n,s,o,i,a,c,u,h;switch(c=r*(1-t),u=r*(1-(a=6*e-(i=Math.floor(6*e)))*t),h=r*(1-(1-a)*t),i%6){case 0:n=r,s=h,o=c;break;case 1:n=u,s=r,o=c;break;case 2:n=c,s=r,o=h;break;case 3:n=c,s=u,o=r;break;case 4:n=h,s=c,o=r;break;case 5:n=r,s=c,o=u}return[Math.round(255*n),Math.round(255*s),Math.round(255*o)]},V=e=>{const t=e.toString(16);return 1==t.length?"0"+t:t},T=(e,t,r)=>"#"+V(e)+V(t)+V(r),q=(e,t,r)=>{var n=Math.max(e,t,r),s=Math.min(e,t,r),o=n-s,i=0,a=0===n?0:o/n,c=n/255;switch(n){case s:i=0;break;case e:i=t-r+o*(t<r?6:0),i/=6*o;break;case t:i=r-e+2*o,i/=6*o;break;case r:i=e-t+4*o,i/=6*o}return[i,a,c]},D=e=>{if(3===(e=e.replace("#","")).length&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),6!==e.length)return[0,0,0];const t=parseInt(e.substring(0,2),16),r=parseInt(e.substring(2,4),16),n=parseInt(e.substring(4,6),16);return isNaN(t)||isNaN(r)||isNaN(n)||t<0||t>255||r<0||r>255||n<0||n>255?[0,0,0]:[t,r,n]};var F=Object.defineProperty,Z=(e,t,r)=>(((e,t,r)=>{t in e?F(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r})(e,"symbol"!=typeof t?t+"":t,r),r);class H{constructor(){Z(this,"e",{})}on(e,t){return this.e[e]||(this.e[e]=[]),this.e[e].push(t),()=>this.off(e,t)}off(e,t){if(!this.e[e])return;const r=this.e[e].findIndex((e=>e===t));-1!==r&&(this.e[e].splice(r,1),0===this.e[e].length&&delete this.e[e])}emit(e,...t){if(!this.e[e])return;const r=this.e[e].slice();for(const n of r)try{n(...t)}catch(t){console.error(`Ошибка в обработчике события ${e}:`,t)}}once(e,t){const r=(...n)=>{this.off(e,r),t(...n)};return this.on(e,r)}clear(e){e?delete this.e[e]:this.e={}}}var W=Object.defineProperty,Y=(e,t,r)=>(((e,t,r)=>{t in e?W(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r})(e,"symbol"!=typeof t?t+"":t,r),r);class B{constructor(e,t){Y(this,"cb"),Y(this,"o"),Y(this,"tId",null),Y(this,"s"),this.cb=e,this.o=t,this.s=[]}execute(...e){if(this.cancel(),"[object Function]"===Object.prototype.toString.call(e[0]))this.s=e[0](...this.s);else for(let t=0;t<this.cb.length;t++)this.s[t]=e[t];this.tId=setTimeout(this.executeImmediately.bind(this),this.o.delay)}executeImmediately(){this.cancel(),this.cb(...this.s),this.s=[]}cancel(){this.tId&&(clearTimeout(this.tId),this.tId=null)}}var J=Object.defineProperty,K=(e,t,r)=>(((e,t,r)=>{t in e?J(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r})(e,"symbol"!=typeof t?t+"":t,r),r);class _{constructor(e){K(this,"initValue"),K(this,"currentValue"),this.initValue=b(e),this.currentValue=e}setter(e){this.currentValue=e(this.currentValue)}reset(e){this.initValue=b(e),this.currentValue=e}isModified(){return!d(this.initValue,this.currentValue)}get updateValues(){return R(this.initValue,this.currentValue)}}var G=Object.defineProperty,Q=(e,t,r)=>(((e,t,r)=>{t in e?G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r})(e,"symbol"!=typeof t?t+"":t,r),r),X=(e=>(e[e.ALLOW=1]="ALLOW",e[e.DENY=2]="DENY",e))(X||{});class ee{constructor(e=[],t=!0){Q(this,"rules"),Q(this,"cache"),Q(this,"cacheEnabled"),this.rules=[...e].sort(((e,t)=>(e.priority||50)-(t.priority||50))),this.cache=new Map,this.cacheEnabled=t,this.validateConfig()}isAllowed(e){try{const t="string"==typeof e?new URL(e):e;if(this.isObfuscatedUrl(t))return!1;const r=this.getCacheKey(t);if(this.cacheEnabled&&this.cache.has(r))return this.cache.get(r);const n=this.evaluateRules(t);return this.cacheEnabled&&this.cache.set(r,n),this.logAccess(t,n),n}catch(t){return console.error("Invalid URL:",e,t),!1}}evaluateRules(e){let t=null,r=null;for(const n of this.rules)this.ruleMatches(e,n)&&(null===t&&(t=1===n.action,r=n.id||null),console.debug(`Rule "${n.id}" matched for ${e.href}`));return null===t?(console.warn(`No rules matched for ${e.href}, defaulting to deny`),!1):(console.debug(`Final decision for ${e.href}: ${t} (rule: ${r})`),t)}ruleMatches(e,t){return this.checkHost(t,e)&&this.checkPaths(t,e)&&this.checkHash(t,e)&&this.checkParams(t,e)}checkHost(e,t){return!!e.hosts.includes("*")||e.hosts.some((e=>t.host===e||t.host.endsWith("."+e)))}checkPaths(e,t){return!e.paths||0===e.paths.length||e.paths.some((e=>"string"==typeof e?t.pathname===e||t.pathname.startsWith(e+"/"):e.test(t.pathname)))}checkHash(e,t){if(!e.hash||0===e.hash.length)return!0;const r=t.hash;return e.hash.some((e=>"string"==typeof e?r===e:e.test(r)))}checkParams(e,t){if(!e.allowedParams&&!e.ignoreParams)return!0;const r=new URL(t.toString());if(e.ignoreParams&&e.ignoreParams.forEach((e=>{r.searchParams.delete(e)})),e.allowedParams&&r.searchParams.size>0)for(const[t]of r.searchParams)if(!e.allowedParams.includes(t))return!1;return!0}isObfuscatedUrl(e){return[/@/,/\\/,/^\d+\.\d+\.\d+\.\d+$/,/\[.*\]/,/localhost/].some((t=>t.test(e.hostname)||t.test(e.href)))}getCacheKey(e){const t=new URL(e.toString());return t.searchParams.sort(),`${t.host}${t.pathname}${t.search}${t.hash}`}logAccess(e,t){console[t?"info":"warn"](`URL ${t?"allowed":"blocked"}: ${e.href}`)}validateConfig(){const e=[];this.rules.forEach(((t,r)=>{t.hosts&&Array.isArray(t.hosts)&&0!==t.hosts.length||e.push(`Rule ${r}: missing or invalid 'hosts' array`),void 0!==t.priority&&(t.priority<1||t.priority>100)&&e.push(`Rule ${r}: priority must be between 1 and 100`),t.action&&![1,2].includes(t.action)&&e.push(`Rule ${r}: action must be 'allow' or 'deny'`)})),e.length>0&&console.warn("URL security config validation errors:",e)}findMatchingRule(e){try{const t="string"==typeof e?new URL(e):e;for(const e of this.rules)if(this.ruleMatches(t,e))return e;return null}catch(e){return null}}clearCache(){this.cache.clear()}setCacheEnabled(e){this.cacheEnabled=e,e||this.clearCache()}getCacheSize(){return this.cache.size}}export{_ as DataKeeper,B as DebouncedFunction,H as EventEmitter,D as HEXtoRGB,U as HSVtoRGB,T as RGBtoHEX,q as RGBtoHSV,X as UrlAction,ee as UrlSecurityManager,r as alignTo,S as chunks,e as clamp,d as comparison,f as copyText,g as createLinksFromText,t as decWord,x as elasticClamp,o as formatNumber,p as generateUniqueKey,R as getChangedData,E as groupBy,c as isType,M as memoize,u as omit,L as orderBy,z as parseQueryString,O as parseVersionString,h as pick,i as random,a as randomByWeight,P as retry,I as shuffle,l as sleep,$ as textParserUrl,s as timeAgo,n as toShort,A as unique,b as unlink,C as updateCurrent};
|