A collection of typescript utilities shared between our projects.
npm i @blb-ventures/resource
# or
yarn add @blb-ventures/resource
# or
pnpm i @blb-ventures/resource
All examples are also in the src/playground.ts
file and I recommend using Deno to easily run them.
A class to estimate the time to finish a task given a series of progress updates. It keeps by default the last 5 progress changes and uses that to estimate the time left for completion.
const eta = new ETA(10_000);
// Start updating the progress
eta.updateProgress(100);
eta.updateProgress(200);
eta.updateProgress(300);
// To keep up with the progress
eta.addEventListener('progress', event => {
console.log(event.detail.progress);
});
// Or if you are in React land, use our @blb-ventures/react-hooks useEvent
import { useEvent } from '@blb-ventures/react-hooks';
const ProgressComponent = () => {
const progressEvent = useEvent(eta, 'progress');
return <div>{progressEvent.progress}</div>
}
It uses Browser's CompressionStream
to compress a file, also uses stream/progress-stream
to report the progress of compression.
It returns a promise that can resolve into the compressed file.
const abortController = new AbortController();
compressFile({
file,
callback: progress => console.log('Compression progress', progress),
signal: abortController.signal, // optional
encoding: 'gzip' // default = gzip
});
filterObjKeys filters the object keys by the value
const obj = {
a: 'foo',
b: 'bar',
};
const filtered = filterObjKeys(obj, 'foo');
// filtered = { b: 'bar' }
filterObjNullValues filters the object keys by null values
const obj = {
a: null,
b: 'bar'
};
const filtered = filterObjNullValues(obj);
// filtered = { b: 'bar' }
Find key returns the value of a key that can be in up to the fifth level of a object of objects
const obj = {
a: {
b: {
c: 'foo',
},
d: 'bar',
},
e: 'baz',
}
const findCValue = findKey('c', obj);
// findCValue = 'foo'
Formats a number of bytes into a shorter value
console.log(formatBytes(1024)) // output: 1KB
console.log(formatBytes(4096)) // output: 4KB
console.log(formatBytes(5000)) // output: 4.88KB
console.log(formatBytes(5000, 1)) // output: 4.9KB
Given a string returns the uppercase letter of each word
console.log(getInitials('Eduardo Sigrist Ciciliato')) // outputs: ESC
Groups a list of objects by a key or key path (using dot notation) and optionally maps the items
const items = [
{ name: 'apple', type: 'fruit' },
{ name: 'banana', type: 'fruit' },
{ name: 'car', type: 'object' },
];
const grouped = groupBy(items, 'type', (it) => it.name);
// grouped = { fruit: ['apple', 'banana'], object: ['car'] }
Generates a random string of alpha numerical characters length N
console.log(randString(10)) // outputs: bDf8lOjkNf
Util functions to encode or decode Relay formatted (":", i.e "User:1") base64 ids. The null versions return a null value instead of throwing errors when there is invalid input.
console.log(encodeId('User', '1')) // outputs: 'VXNlcjox'
console.log(decodeId('VXNlcjox')) // outputs: { type: 'User', id: '1' }
Walks an object using the dot notation path, returning a default value if it can't resolve
const user = {
name: 'John',
permissions: {
product: {
edit: true
}
}
};
console.log(user, 'permissions.product.edit', null) // outputs: true
Tries to parse a JSON and returns null instead of throwing
console.log(safeParseJson("{invalid_json: ---}")) // outputs: null
console.log(safeParseJson("[]")) // outputs: []
Generates share urls for some major social networks
console.log(facebookShare('https://eduardociciliato.com.br')) // outputs: https://www.facebook.com/sharer.php?u=https%3A%2F%2Feduardociciliato.com.br
It generates a hexadecimal color from a given string. We usually use this together with the getInitials
to generate a user's avatar from their name.
console.log(stringToColor('Eduardo Ciciliato')) // outputs: #53c094
Throttles a function execution by a set amount of time
const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
console.time('throttle');
const throttled = throttle(() => {console.timeLog('throttle')}, 300);
for(let i = 0; i < 100; i++) {
throttled();
await sleep(i);
}
console.timeEnd('throttle')
// outputs:
// throttle: 0ms
// throttle: 315ms
// throttle: 649ms
// throttle: 971ms
// throttle: 1303ms
// throttle: 1628ms
// throttle: 1989ms
// throttle: 2315ms
// throttle: 2666ms
// throttle: 2968ms
// throttle: 3283ms
// throttle: 3617ms
// throttle: 3966ms
// throttle: 4331ms
// throttle: 4713ms
// throttle: 5112ms
Formats the time left as "9999a 99m 99d 99:99:99" a short way of showing time specifically localized to Brazilian Portuguese
console.log(formatTimeLeft(1_000_000)); // outputs: 00:16:40
console.log(formatTimeLeft(10_000_000)); // outputs: 02:46:40
console.log(formatTimeLeft(100_000_000)); // outputs: 1d 03:46:40
console.log(formatTimeLeft(1_000_000_000)); // outputs: 11d 13:46:40
console.log(formatTimeLeft(10_000_000_000)); // outputs: 3m 25d 17:46:40
console.log(formatTimeLeft(100_000_000_000)); // outputs: 1a 2m 2d 09:46:4
Generates a link to open a chat with a Whatsapp number and optionally a preset text
console.log(whatsappLink({ phone: 5511999999999, text: 'Hi'})); // outputs: https://wa.me/5511999999999?text=Hi