common-stuff

Common stuff 🔨

codecov CodeFactor semantic-release code style: prettier

JavaScript and NodeJS are missing a lot of core functionalities. The goal of this library is to bring a variety of useful helpers on both NodeJS & Browser with strong TypeScript typing and zero dependencies.

Missing something? Create feature request!

Read Documentation 📘

Installation

npm version npm

Install with NPM/yarn:

# NPM
npm install common-stuff
# Yarn
yarn add common-stuff

Import what you need:

import { isEqual } from 'common-stuff'

if (isEqual({'a': 1}, {'a': 1})) {
console.log('Hello')
}

Always import only what is necessary to take full advantage of tree shaking.

Load directly in the browser

Include UMD bundle

Include script from CDN and use commonStuff global variable:

<script src="https://unpkg.com/common-stuff"></script>
<script>
if (commonStuff.isEqual({'a': 1}, {'a': 1})) {
console.log('Hello')
}
</script>

Dynamic import

Use import directly in the browser that returns loaded library wrapped in the promise:

<script>
import('https://unpkg.com/common-stuff?module').then(({ isEqual }) => {
if (isEqual({'a': 1}, {'a': 1})) {
console.log('Hello')
}
})
</script>

Examples

Using FP patterns

import { pipe, sortBy, deduplicateBy, chunk, ensureArray, groupBy } from 'common-stuff'

const result = pipe(
[{ value: 4 }, { value: 6 }, { value: 8 }],
(v) => sortBy(v, (o) => o.value),
(v) => deduplicateBy(v, (o) => o.value),
(v) => v.map((o) => ensureArray(o.value)),
(v) => chunk(v, 2),
(v) => groupBy(v, (o) => o.length)
)
// [ [1, [[[ 8 ]]]],[ 2, [[[ 4 ], [ 6 ]]]] ]

With arrow functions you can easily use pipe with any function

Parsing env variables

For example we have following ENV variables:

CONFIG__PRIVATE_KEY="my key"
CONFIG__PUBLIC_KEY="my key"
CONFIG__ALLOWED_IPS='["127.0.0.1", "localhost"]'
import { convertToNested, camelCase } from 'common-stuff'

const config = convertToNested(process.env, {
separator: '__',
transformKey: camelCase
}).config
// { privateKey: 'my key', publicKey: 'my key', allowedIps: ['127.0.0.1', 'localhost'] }

Using Http errors

import { HttpError, HttpStatusCodes } from 'common-stuff'

app.get('/', function (req, res) {
throw new HttpError(HttpStatusCodes.INTERNAL_SERVER_ERROR, 'Some secret error message')
})

// Handle unknown errors
app.use(function (err, req, res, next) {
if (err instanceof HttpError) {
// Log full error message
console.error(err.message)

// Return safe error message without private details
return res.status(err.status).send(err.publicMessage)
}
next()
})

This example returns 500 error message with text Internal Server Error and logs private message to console. Check express-async-errors for Express JS async support.

Common browser helpers

import { parseCookies, generateCookie, parseQueryString } from 'common-stuff'

parseCookies(document.cookie)
// {session: '26e761be168533cbf0742f8c295176c7'}

document.cookie = generateCookie('name', 'John', { expires: 7 })

parseQueryString(location.search)
// { page: ['1'], limit: ['20']}

Generated using TypeDoc