nanoutils
Tiniest JavaScript utils library
Usage
First, install nanoutils
:
$ npm install --save nanoutils
or install it with yarn
:
$ yarn add nanoutils
To use ES modules we wrote a plugin babel-plugin-nanoutils
To install:
$ npm install --save-dev babel-plugin-nanoutils
or
$ yarn add --dev babel-plugin-nanoutils
Using .babelrc
:
{ "preset": ["env"]+ "plugins": ["nanoutils"]}
via CLI:
{ "scripts": {+ "babel": "babel --plugins nanoutils app.js", "test": "jest && eslint ." }}
or with Node API:
const babel = require('babel-core') babel.transform('code', {+ plugins: ['nanoutils']})
Examples
Sort array of values by name alphabetically or by age
const sortByName = const sortByAge = const consultants = name: 'Mike' age: 30 name: 'David' age: 35 name: 'Alex' age: 25 // [{ name: 'Alex', age: 25 }, { name: 'David', age: 35 }, { name: 'Mike', age: 30 }] // [{ name: 'Alex', age: 25 }, { name: 'Mike', age: 30 }, { name: 'David', age: 35 }]
Find sum of all ages which will be even next year
const isEven = value % 2 === 0 const sumOfAllEvenAgesNextYear = const consultants = name: 'Mike' age: 30 name: 'David' age: 35 name: 'Alex' age: 25 // 62
Return memoized mean
const getHash = const memoizedMean = // 2 // 2 (extracts from memoizeWith function with hash='1-2-3') // 2 (extracts from memoizeWith function with hash='1-2-3')
Inspiration
We support nano-hype in JavaScript and want to create as much nano-things as possible.
So we're starting a challenge - write Ramda clone where no one method will be over 1KB size.
More nano's for the God of nano's!
Basic ideas
- Functional style. FP is cool, isn't it? 😎 So we'll add some Ramda methods too.
- No ES6 features. We don't use Babel to save support in older browsers and save a status of nano-library.
- Use methods composition only if it won't greatly increase the size of method
Can I use it in my project?
It's production-ready but still has following drawbacks:
- No TS/Flow types
It's also a Ramda-supportive, you can see both docs and types here: Ramda docs
Roadmap
- Create methods list
- Complete all needed methods (we get list of methods from Ramda) with 100% tests and types coverage
- Add documentation for all methods
- Create a tool to split nanoutils to separated packages
- Cover all methods with performance tests
- Reduce methods sizes even more
- Compare to
lodash
,underscore
(?)
NPM scripts
If you want to help, here are some tools for you.
Shortcut for new methods
npm run method:add <...methods> -- [flags]
yarn method:add <...methods> -- [flags]
Params:
methods List with method names (separated by space)
Flags:
-f Overwrite methods (if exists)
--curried Add curried method
you can use --curried=<N> to add curryN
--types Add index.d.ts and index.js.flow for method typings
--perf Add <method>.performance.js for performance test of method
It will create lib/method
dir with following files:
index.js File with method
index.d.ts TypeScript typings (if --types passed)
index.js.flow Flow type declaration (if --types passed)
method.test.js Test for method (I use Jest)
method.performance.js Performance test for method (if --perf passed)
Check sizes of methods
npm run size <...methods>
yarn size <...methods>
Params
methods List of method names (separated by space) you want to check.
If no methods it will check size of all methods
Check time of methods
npm run time <...methods>
yarn time <...methods>
Params
methods List of method names (separated by space) you want to check.
If no methods it will check time of all possible methods (which have *.performance.js file)
If type is set as no_perf (by default), it will throw an error: max.performance.js must have data to return
Check ramda/nanoutils diff
npm run method:check <type>
yarn method:check <type>
Params
type What to display?
- both: display methods that are both in ramda and nanoutils
- nano: display nanoutils methods that ramda doesn't have
- ramda: display ramda methods that nanoutils doesn't have
We use size-limit to check the size of methods.