init commit

main
pawka 2 months ago
commit 1f6ceb2d51

1
.gitignore vendored

@ -0,0 +1 @@
test.js

@ -0,0 +1,3 @@
# @pawika/utils
Разные утилиты которые мне нужны в той или иной степени

@ -0,0 +1,88 @@
/**
* @description
* Создает массив элементов, разбитых на группы длиной `size`.
* Если `массив` не может быть разделен равномерно, последним фрагментом будут оставшиеся элементы.
*
* @template T
* @param {T[]} array
* @param {number} size
* @returns {T[][]}
*
* @example
*
* chunk(['a', 'b', 'c', 'd'], 2);
* // => [['a', 'b'], ['c', 'd']]
*
* chunk(['a', 'b', 'c', 'd'], 3);
* // => [['a', 'b', 'c'], ['d']]
*
*/
// https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L6839
// https://github.com/DustFoundation/utils/blob/main/src/functions/chunk.ts
export function chunk(array, size) {
if (size < 1) throw new Error("Chunk size cannot be less than 1!");
return Array.from(
{ length: Math.ceil(array.length / size) },
(value, index) => array.slice(index * size, index * size + size)
);
}
/**
* @description
* Создает версию массива без дубликатов, используя === для проверки равенства объектов.
* В частности, сохраняется только первое вхождение каждого значения.
* Если вы хотите вычислить уникальные элементы на основе преобразования, передайте итерируемую функцию.
*
* @template T
* @param {T[]} array
* @param {Function} iteratee
* @returns {T[]}
*/
// https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L8417
// https://github.com/jashkenas/underscore/blob/master/modules/uniq.js
export function uniq(array, iteratee) {
const result = [];
const tmp = [];
array.forEach((val) => {
const computed = iteratee ? iteratee(val) : val;
!tmp.includes(computed) && (tmp.push(computed), result.push(val));
});
return result;
}
/**
* @description
* Возвращает копию списка с удаленными всеми ложными значениями.
* В JavaScript значения `false`, `null`, `0`, `""`, `undefined` и `NaN` являются ложными.
*
* @template T
* @param {T[]} array
* @returns {T[]}
*
* @example
*
* compact([0, 1, false, 2, '', 3]);
* // => [1, 2, 3]
*/
// https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L6874
// https://github.com/jashkenas/underscore/blob/master/modules/compact.js
export function compact(array) {
return array.filter((val) => val);
}
/**
* @description
* Вычисляет сумму значений в массиве.
*
* @param {number[]} array
* @example
*
* sum([4, 2, 8, 6]);
* // => 20
*/
export function sum(array) {
return array.reduce((prev, val) => prev + val, 0);
}

@ -0,0 +1,21 @@
import { randomBytes } from "node:crypto";
/**
* @description
* Возвращает случайное целое число в формате `BigInt`
*
* @param {number} bits
* @example
*
* randomBigInt(64)
* // => 9409313759732697550n
*
* randomBigInt(128)
* // => 40800982229429306396968830979296370940n
*
* randomBigInt(8)
* // => 141n
*/
export function randomBigInt(bits = 64) {
return BigInt(`0x${randomBytes(bits / 8).toString("hex")}`);
}

@ -0,0 +1,5 @@
export * from "./array.js";
export * from "./timestamp.js";
export * from "./object.js";
export * from "./bigint.js";
export * from "./util.js";

@ -0,0 +1,62 @@
import { isNil, isObject } from "./util.js";
/**
* @description
* Создайте глубокую копию предоставленного простого объекта.
* Любые вложенные объекты или массивы будут дублироваться, а не скопированы по ссылке.
*
* @template T
* @param {any} obj
* @returns {T}
*/
// https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L11087
// https://github.com/jashkenas/underscore/blob/master/modules/clone.js
export function clone(obj) {
if (!isObject(obj)) return obj;
const tmp = obj.constructor();
Object.entries(obj).forEach(([key, value]) => {
tmp[key] = clone(value);
});
return tmp;
}
/**
* @description
* Создает объект без `undefined` и `null` полей
*
* @template T
* @param {T} data
* @returns {T}
* @example
*
* omitNil({name: 'pawka', age: 22, email: undefined, meta: {hair: 'red', eyes: undefined, brows: 'black'}})
* // => {name: 'pawka', age: 22, meta: {hair: 'red', brows: 'black'}}
*
* omitNil({name: 'pawka', age: 22, email: undefined, meta: [{hair: 'red', eyes: undefined, brows: 'black'}]})
* // => {name: 'pawka', age: 22, meta: [{hair: 'red', brows: 'black'}]}
*/
export function omitNil(obj) {
if (isNil(obj)) return obj;
const tmp = {};
Object.entries(obj).forEach(([key, value]) => {
if (isNil(value)) {
delete obj[key];
}
if (Array.isArray(value)) {
tmp[key] = value.map((val) => (isObject(val) ? omitNil(val) : val));
} else if (value instanceof Date) {
tmp[key] = value;
} else if (isObject(value)) {
tmp[key] = omitNil(value);
} else if (!isNil(value)) {
tmp[key] = value;
}
});
return tmp;
}

@ -0,0 +1,37 @@
export class Timestamp {
/**
* @description
*
* @example
*
* Timestamp.unixtime
* // => 1668283743
*/
static get unixtime() {
return Math.floor(Date.now() / 1000);
}
/**
* @description
*
* @example
*
* Timestamp.milliseconds
* // => 1668283704485
*/
static get milliseconds() {
return Date.now();
}
/**
* @description
*
* @example
*
* Timestamp.date
* // => 2022-11-12T20:08:47.676Z
*/
static get date() {
return new Date();
}
}

@ -0,0 +1,96 @@
/**
* @description
* Возвращает true, если `value` является типом `Object`.
*
* @param {any} value
* @example
*
* isObject({});
* // => true
*
* isObject([1, 2, 3]);
* // => true
*
*
* isObject(null);
* // => false
*/
// https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L11743
// https://github.com/jashkenas/underscore/blob/master/modules/isObject.js
export function isObject(value) {
return (
typeof value != null &&
(typeof value == "object" || typeof value == "function")
);
}
/**
* @description
* Проверка `value` на `null` и `undefined`
*
* @param {any} value
* @example
*
* isNil(null);
* // => true
*
* isNil(void 0);
* // => true
*
* isNil(NaN);
* // => false
*/
// https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L11973
export function isNil(value) {
return value == null;
}
/**
* @description
* Возвращает true, если `value` является значением `NaN`.
*
* @param {*} value
* @example
*
* isNaN(NaN);
* // => true
*
* isNaN(new Number(NaN));
* // => true
*
* isNaN(undefined);
* // => true
*
* isNaN(undefined);
* // => false
*/
// https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L11892
// https://github.com/jashkenas/underscore/blob/master/modules/isNaN.js
export function isNaN(value) {
return isNumber(value) && value != +value;
}
/**
* @description
* Возвращает true, если `value` является числом (включая NaN).
*
* @param {any} value
* @example
*
* isNumber(3);
* // => true
*
* isNumber(Number.MIN_VALUE);
* // => true
*
* isNumber(Infinity);
* // => true
*
* isNumber('3');
* // => false
*/
// https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L12003
// https://github.com/jashkenas/underscore/blob/master/modules/isNumber.js
export function isNumber(value) {
return typeof value == "number";
}

@ -0,0 +1,14 @@
{
"name": "@pawika/utils",
"version": "1.0.0",
"main": "lib/index.js",
"type": "module",
"author": {
"name": "pawka",
"email": "pawka@disroot.org"
},
"repository": {
"type": "git",
"url": "https://git.disroot.org/pawka/utils"
}
}
Loading…
Cancel
Save