@minsize/utils 0.0.1
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 +56 -0
- package/index.d.ts +76 -0
- package/index.js +1 -0
- package/index.mjs +1 -0
- package/package.json +22 -0
package/README.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
## Mutex
|
|
2
|
+
[](https://www.npmjs.com/package/@minsize/mutex)
|
|
3
|
+
|
|
4
|
+
```
|
|
5
|
+
npm i @minsize/mutex
|
|
6
|
+
|
|
7
|
+
yarn add @minsize/mutex
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
### Usage
|
|
11
|
+
```js
|
|
12
|
+
import { Mutex } from '@minsize/mutex'
|
|
13
|
+
|
|
14
|
+
const mutex = Mutex({
|
|
15
|
+
globalLimit: 1 // Global limit on how many functions a mutex can process at once
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
const fn = async () => {
|
|
19
|
+
const release = await mutex.wait();
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
// ...
|
|
23
|
+
} finally {
|
|
24
|
+
release();
|
|
25
|
+
// or
|
|
26
|
+
mutex.release();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
### Use with key
|
|
34
|
+
```js
|
|
35
|
+
import { Mutex } from '@minsize/mutex'
|
|
36
|
+
|
|
37
|
+
const mutex = Mutex({
|
|
38
|
+
globalLimit: 1 // Global limit on how many functions a mutex can process at once
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
const fn = async (userId) => {
|
|
42
|
+
const release = await mutex.wait({
|
|
43
|
+
key: userId, // Whom Mutex will be used
|
|
44
|
+
limit: 1 // Works the same as the global limit, but only for 1 key
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
// ...
|
|
49
|
+
} finally {
|
|
50
|
+
release();
|
|
51
|
+
// or
|
|
52
|
+
mutex.release({ key: userId });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
```
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @example
|
|
4
|
+
* chunks(2, [1,2,3,4]) // [[1,2], [3,4]]
|
|
5
|
+
*/
|
|
6
|
+
declare const chunks: <T>(count: number, array: T[]) => T[][];
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* clamp(10, 1, 10) // return: 10
|
|
12
|
+
* clamp(0, 1, 10) // return: 1
|
|
13
|
+
* clamp(11, 1, 10) // return: 10
|
|
14
|
+
*/
|
|
15
|
+
declare const clamp: (value: number, min: number, max: number) => number;
|
|
16
|
+
|
|
17
|
+
declare const decWord: (n: number, words: string[]) => string;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* alignTo(1, 4) // return: 4
|
|
23
|
+
* alignTo(3, 4) // return: 4
|
|
24
|
+
* alignTo(5, 4) // return: 8
|
|
25
|
+
* alignTo(9, 4) // return: 12
|
|
26
|
+
*/
|
|
27
|
+
declare function alignTo(num: number, by: number): number;
|
|
28
|
+
|
|
29
|
+
declare const toShort: (number: number, customParts?: string[], fixed?: number) => string;
|
|
30
|
+
|
|
31
|
+
declare const timeAgo: (timestamp: number) => string;
|
|
32
|
+
|
|
33
|
+
declare const formatNumber: (number: number) => string;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* shuffle([1,2,3]) // return: [2,1,3]
|
|
39
|
+
* shuffle([1,2,3]) // return: [3,1,2]
|
|
40
|
+
*/
|
|
41
|
+
declare const shuffle: <T>(array: T[]) => T[];
|
|
42
|
+
|
|
43
|
+
declare const random: (min: number, max: number) => number;
|
|
44
|
+
|
|
45
|
+
type Type = "string" | "number" | "bigint" | "nan" | "boolean" | "object" | "array" | "function" | "null" | "undefined" | "symbol" | "date" | "regexp" | "error" | "unknown" | "map" | "set" | "weakmap" | "weakset" | "promise" | "buffer";
|
|
46
|
+
/**
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* isType({}) // return: "object"
|
|
50
|
+
* isType({}, "object") // return: true
|
|
51
|
+
*/
|
|
52
|
+
declare function isType<Value>(value: Value, _type: Type): boolean;
|
|
53
|
+
declare function isType<Value>(value: Value): Type;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* omit({ key: "1", id: "2" }, ["key"]) // return: { key: "1" }
|
|
59
|
+
*/
|
|
60
|
+
declare function omit<T extends object, K extends keyof T>(object: T, keys: K[]): Omit<T, K>;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* pick({ key: "1", id: "2" }, ["key"]) // return: { key: "1" }
|
|
66
|
+
*/
|
|
67
|
+
declare function pick<T extends object, K extends keyof T>(object: T, keys: K[]): Pick<T, K>;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* await sleep(1000)
|
|
73
|
+
*/
|
|
74
|
+
declare const sleep: (time: number) => Promise<unknown>;
|
|
75
|
+
|
|
76
|
+
export { alignTo, chunks, clamp, decWord, formatNumber, isType, omit, pick, random, shuffle, sleep, timeAgo, toShort };
|
package/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
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];const t={date:e=>e instanceof Date,regexp:e=>e instanceof RegExp,error:e=>e instanceof Error,map:e=>e instanceof Map,set:e=>e instanceof Set,weakmap:e=>e instanceof WeakMap,weakset:e=>e instanceof WeakSet,promise:e=>e instanceof Promise,buffer:e=>e instanceof Buffer,undefined:e=>void 0===e,string:e=>"string"==typeof e,bigint:e=>"bigint"==typeof e,number:e=>"number"==typeof e&&!isNaN(e),nan:e=>"number"==typeof e&&isNaN(e),boolean:e=>"boolean"==typeof e,array:e=>Array.isArray(e),object:e=>"object"==typeof e&&!Array.isArray(e)&&null!==e,function:e=>"function"==typeof e,null:e=>null===e,symbol:e=>"symbol"==typeof e,unknown:()=>!0};exports.alignTo=function(e,t){return e<=0?t:e+(t-e%t)%t},exports.chunks=(e,t)=>{const r=[];for(let o=0;o<t.length;o+=e)r.push(t.slice(o,o+e));return r},exports.clamp=(e,t,r)=>e>t?e<r?e:r:t,exports.decWord=e,exports.formatNumber=e=>(e||0).toString().replace(/\B(?=(\d{3})+(?!\d))/g,"."),exports.isType=function(e,r){for(const[o,n]of Object.entries(t))if(n(e))return void 0!==r?o===r:o;return void 0===r&&"unknown"},exports.omit=function(e,t){return Object.keys(e).reduce(((r,o)=>(t.includes(o)||(r[o]=e[o]),r)),{})},exports.pick=function(e,t){return Object.keys(e).reduce(((r,o)=>(t.includes(o)&&(r[o]=e[o]),r)),{})},exports.random=(e,t)=>Math.floor(Math.random()*(t-e+1)+e),exports.shuffle=e=>{for(let t=e.length-1;t>0;t--){const r=Math.floor(Math.random()*(t+1));[e[t],e[r]]=[e[r],e[t]]}return e},exports.sleep=async e=>await new Promise((t=>setTimeout(t,e))),exports.timeAgo=t=>{if(!t)return"только что";const r=new Date(t),o=Math.floor((Date.now()-r.getTime())/1e3),n=()=>new Intl.DateTimeFormat("RU-ru",{day:"numeric",month:"short"}).format(r).replace(".",""),a=()=>r.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),s=(t,r,o)=>Array.isArray(t)?`${o} ${e(o,t)} ${r}`:`${t} ${r}`;switch(!0){case o<0:return"скоро";case o<60:return s(["секунду","секунды","секунд"],"назад",o);case o<3600:return s(["минуту","минуты","минут"],"назад",Math.floor(o/60));case o<7200:return s("час","назад",Math.floor(o/3600));case o<10800:return s("два часа","назад",Math.floor(o/3600));case o<14400:return s("три часа","назад",Math.floor(o/3600));case o<86400:return s(`сегодня в ${a()}`,"",Math.floor(o/3600));case o<172800:return s(`вчера в ${a()}`,"",Math.floor(o/86400));case o<259200:return s("два дня","назад",Math.floor(o/86400));case o<345600:return s("три дня","назад",Math.floor(o/86400));case o<31536e3:return s(`${n()} в ${a()}`,"",Math.floor(o/86400));case o>=31536e3:return s(`${n()} ${r.getFullYear()} г.`,"",Math.floor(o/31536e3))}return"только что"},exports.toShort=(e,t,r=1)=>{const o=t||["","k","M","G","T","P"],n=e<0,a=Math.abs(e),s=Math.log10(a)/3|0,i=a/10**(3*s);return parseFloat(`${n?"-":""}${i%1?(Math.floor(10*i)/10).toFixed(r):i}`)+o[s]};
|
package/index.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=(e,t)=>{const r=[];for(let n=0;n<t.length;n+=e)r.push(t.slice(n,n+e));return r},t=(e,t,r)=>e>t?e<r?e:r:t,r=(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 n(e,t){return e<=0?t:e+(t-e%t)%t}const o=(e,t,r=1)=>{const n=t||["","k","M","G","T","P"],o=e<0,a=Math.abs(e),s=Math.log10(a)/3|0,i=a/10**(3*s);return parseFloat(`${o?"-":""}${i%1?(Math.floor(10*i)/10).toFixed(r):i}`)+n[s]},a=e=>{if(!e)return"только что";const t=new Date(e),n=Math.floor((Date.now()-t.getTime())/1e3),o=()=>new Intl.DateTimeFormat("RU-ru",{day:"numeric",month:"short"}).format(t).replace(".",""),a=()=>t.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),s=(e,t,n)=>Array.isArray(e)?`${n} ${r(n,e)} ${t}`:`${e} ${t}`;switch(!0){case n<0:return"скоро";case n<60:return s(["секунду","секунды","секунд"],"назад",n);case n<3600:return s(["минуту","минуты","минут"],"назад",Math.floor(n/60));case n<7200:return s("час","назад",Math.floor(n/3600));case n<10800:return s("два часа","назад",Math.floor(n/3600));case n<14400:return s("три часа","назад",Math.floor(n/3600));case n<86400:return s(`сегодня в ${a()}`,"",Math.floor(n/3600));case n<172800:return s(`вчера в ${a()}`,"",Math.floor(n/86400));case n<259200:return s("два дня","назад",Math.floor(n/86400));case n<345600:return s("три дня","назад",Math.floor(n/86400));case n<31536e3:return s(`${o()} в ${a()}`,"",Math.floor(n/86400));case n>=31536e3:return s(`${o()} ${t.getFullYear()} г.`,"",Math.floor(n/31536e3))}return"только что"},s=e=>(e||0).toString().replace(/\B(?=(\d{3})+(?!\d))/g,"."),i=e=>{for(let t=e.length-1;t>0;t--){const r=Math.floor(Math.random()*(t+1));[e[t],e[r]]=[e[r],e[t]]}return e},c=(e,t)=>Math.floor(Math.random()*(t-e+1)+e),u={date:e=>e instanceof Date,regexp:e=>e instanceof RegExp,error:e=>e instanceof Error,map:e=>e instanceof Map,set:e=>e instanceof Set,weakmap:e=>e instanceof WeakMap,weakset:e=>e instanceof WeakSet,promise:e=>e instanceof Promise,buffer:e=>e instanceof Buffer,undefined:e=>void 0===e,string:e=>"string"==typeof e,bigint:e=>"bigint"==typeof e,number:e=>"number"==typeof e&&!isNaN(e),nan:e=>"number"==typeof e&&isNaN(e),boolean:e=>"boolean"==typeof e,array:e=>Array.isArray(e),object:e=>"object"==typeof e&&!Array.isArray(e)&&null!==e,function:e=>"function"==typeof e,null:e=>null===e,symbol:e=>"symbol"==typeof e,unknown:()=>!0};function f(e,t){for(const[r,n]of Object.entries(u))if(n(e))return void 0!==t?r===t:r;return void 0===t&&"unknown"}function l(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 m=async e=>await new Promise((t=>setTimeout(t,e)));export{n as alignTo,e as chunks,t as clamp,r as decWord,s as formatNumber,f as isType,l as omit,h as pick,c as random,i as shuffle,m as sleep,a as timeAgo,o as toShort};
|
package/package.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@minsize/utils",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Frequently used utilities",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"types": "index.ts",
|
|
7
|
+
"author": {
|
|
8
|
+
"name": "Egor Kytyukov",
|
|
9
|
+
"url": "https://t.me/xuserz"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/minsize/utils"
|
|
14
|
+
},
|
|
15
|
+
"contributors": [],
|
|
16
|
+
"keywords": [
|
|
17
|
+
"utils",
|
|
18
|
+
"utilities",
|
|
19
|
+
"frontend",
|
|
20
|
+
"backend"
|
|
21
|
+
]
|
|
22
|
+
}
|