npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

type-filter

v4.0.0

Published

filtering values by type

Downloads

14

Readme

type-filter (4.0.0)

typeFilter([ value ] [, handler | handlerList | typeHandler ] [, options ] [, ...otherArguments ])

  • value is any type
  • handler is a function
  • handlerList is an array
  • typeHandler is an object
  • options is boolean or function or object
  • otherArguments are any types

first argument: get type
second argument: handler | handlerList | typeHandler
third argument: once | options
other arguments: other arguments

links: npm | github
start: install | import

default handlers: no | yes | on, off | type | typeClass | call | recheck | callRecheck | error | map | handler

install

npm i type-filter

import

import typeFilter, { handler } from 'type-filter'

or

import { typeFilter, handler } from 'type-filter'

to minimize code size use this importing

import typeFilter from 'type-filter/typeFilter'
import handler from 'type-filter/handlers/handler'

get type

Use only one argument to get a type.

typeFilter(undefined) // returns 'undefined'
typeFilter(null) // returns 'null'
typeFilter(NaN) // returns 'nan'
typeFilter(1) // returns 'number'
typeFilter('1') // returns 'string'
typeFilter(false) // returns 'boolean'
typeFilter(Symbol()) // returns 'symbol'
typeFilter(() => {}) // returns 'function'
typeFilter([]) // returns 'array'
typeFilter({}) // returns 'object'
typeFilter(Object.create(null)) // returns 'object'
typeFilter(new class {}) // returns 'class'
typeFilter(new Map()) // returns 'class'
typeFilter() // returns 'undefined'

handler

If the second argument of typeFilter is a function then it will be used as a handler.

Any handler gets 2 arguments: value and options.

value equals the first argument of typeFilter.

const handler = value => value + 1
typeFilter(1, handler) // returns 2

options.type equals what typeFilter returns for current value (see get type)

const type = (value, {type}) => value + ': ' + type
typeFilter(1, type) // returns '1: number'
typeFilter('1', type) // returns '1: string'

options.className equals empty string for all types except for class.
If the type equals class then options.className contains name of class.

const classType = (value, {type, className}) => {
  return value + ': ' + type + (className && '(' + className + ')')
}
typeFilter(1, classType) // returns '1: number'
typeFilter({}, classType) // returns '[object Object]: object'
typeFilter(new Map(), classType) // returns '[object Object]: class(Map)'
typeFilter(new class MyClass {}, classType) // returns '[object Object]: class(MyClass)'

handlerList

If the second argument of typeFilter is an array then this argument is handlerList.

handlerList can contain handler, handlerList or typeHandler.

const square = value => value * value
const addOne = value => value + 1
typeFilter(1, [addOne, square]) // returns 4
typeFilter(2, [square, addOne]) // returns 5
typeFilter(1, [addOne, [square, square]]) // returns 16

typeHandler

If the second argument of typeFilter is an object then this argument is typeHandler.

keys of typeHandler equals type or class name of value.
values of typeHandler can contain handler, handlerList or typeHandler.
if a typeHandler does not contain key which equals current value type or class name then typeFilter returns this value.

const noNumber = {
  number: () => {}
}
typeFilter(1, noNumber) // returns undefined
typeFilter('2', noNumber) // returns '2'
const noMap = {
  Map: () => {}
}
typeFilter(new Map(), noMap) // returns undefined
typeFilter(new Set(), noMap) // returns instance of Set

other in typeHandler

you may use other key of typeHandler to handle other types

const onlyNumber = {
  number: value => value,
  other: () => {}
}
typeFilter(1, onlyNumber) // returns 1
typeFilter('2', onlyNumber) // returns undefined

once

handler and typeHandler run only one handle but handlerList runs each handler inside it and each handler gets value which equals result of previous handler. to have result of the first handler in handlerList which returns needed result you may use once.

if the third argument (or once key of the third argument) equals true or function then each handler gets original value.

if the third argument (or once key of the third argument) equals true the typeFilter returns a result of the first handler which returns some equals true (1, true, {}, [], ...).

import {yes, no, off, type} from 'type-filter' // default handlers

typeFilter(1, [no, off, type, yes])
// 1 > [no] > undefined > [off] > false > [type] > 'boolean' > [yes] > 'boolean'
typeFilter(1, [no, off, type, yes], true)
// 1 > [no] > undefined
// 1 > [off] > false
// 1 > [type] > 'number'
typeFilter(1, [no, off, yes, type], true)
// 1 > [no] > undefined
// 1 > [off] > false
// 1 > [yes] > 1

if the third argument (or once key of the third argument) equals function the function gets result of handlerList's handler call and the typeFilter returns a result which pass the function test. to pass the test the function should returns some equals true (1, true, {}, [], ...).

const addOne = value => value + 1
const addTwo = value => value + 2
const addThree = value => value + 3

typeFilter(1, [addOne, addTwo, addThree], value => value > 2)
// returns 3 (the result of addTwo)
// addOne and addTwo are called

if all handlers fail the test then typeFilter returns undefined

typeFilter(1, [yes, on, off], () => false) // returns undefined

once works only for handlerList

typeFilter(0, yes, true) // returns 0
typeFilter(0, [yes], true) // returns undefined

options

you may use the third argument as options which can contain type, classType, once, rootHandler like the second argument of handler.
each handler get the same options object and you can share variables between handlers

const deep = (value, options) => {
  const deep = options.deep || 0
  options.deep = deep + 1
  return value
}
const deepHandler = {
  function: [deep, callRecheck],
  other: (value, {deep}) => deep || 0
}
typeFilter(1, deepHandler) // returns 0
typeFilter(() => 1, deepHandler) // returns 1
typeFilter(() => () => 1, deepHandler) // returns 2
typeFilter(() => () => 1, deepHandler, {deep: 1}) // returns 3

other arguments

you may provide any variables to all handlers

typeFilter(0, (value, options, ...args) => ([value, ...args]), undefined, 1, 2, 3, 4, 5)
// returns [0, 1, 2, 3, 4, 5]

default handlers

you may use default handlers from this library

no

always returns undefined

const noNumber = {
  number: no
}
typeFilter(1, noNumber) // returns undefined
typeFilter('2', noNumber) // returns '2'

yes

always returns value

const onlyNumber = {
  number: yes,
  other: no
}
typeFilter(1, onlyNumber) // returns 1
typeFilter('2', onlyNumber) // returns undefined

on, off

on always returns true
off always returns false

const isNumber = {
  number: on,
  other: off
}
typeFilter(1, isNumber) // returns true
typeFilter('2', isNumber) // returns false

type

type always returns type of value

typeFilter('2', type) // returns 'string'

typeClass

typeClass returns type of value or className for type equals class

typeFilter(new Map(), typeClass) // returns 'Map'
typeFilter({}, typeClass) // returns 'object'

call

call always returns result of value call

typeFilter(() => 1, call) // returns 1

call.args

args can provide arguments to function

typeFilter(x => x, call.args(1)) // returns 1

recheck

recheck is rechecking value like this type filter gets value of handler

const isNumberHandler = {
  function: [call, recheck],
  number: () => 'this is number',
  other: () => 'this is not number'
}
typeFilter(1, isNumberHandler) // returns 'this is number'
typeFilter('1', isNumberHandler) // returns 'this is not number'
typeFilter(() => 1, isNumberHandler) // returns 'this is number'
typeFilter(() => '1', isNumberHandler) // returns 'this is not number'
typeFilter(() => () => 1, isNumberHandler) // returns 'this is number'

be careful, recheck can create an infinite loop

typeFilter(1, recheck)

callRecheck

callRecheck is combine of call and recheck callRecheck contains args property like call handler

const isNumberHandler = {
  function: callRecheck,
  number: () => 'this is number',
  other: () => 'this is not number'
}
typeFilter(() => 1, isNumberHandler) // returns 'this is number'

error

error runs exception

typeFilter(1, error('Text')) // runs throw Error('Text')

you may use one of default variable (value, type, className) inside text of error's argument

// runs throw Error('value: 1, type: number, className: ')
typeFilter(1, error('value: {value}, type: {type}, className: {className}'))

also you may use own properties

typeFilter(1, error('error: {custom}', {
  custom: 'custom value'
})) // 'error: custom value'

if the custom value is a function it will be runs

typeFilter(1, error('error: {custom}', {
  custom: () => 'custom value'
})) // 'error: custom value'

this custom property gets value, type, className as a handler

typeFilter(1, error('error: {custom}', {
  custom: (value, {type, className}) => `value: ${value}, type: ${type}, className: ${className}`
})) // runs throw Error('error: value: 1, type: number, className: ')

map

map uses a handler for each item of it like map of an array

typeFilter([
  () => 0,
  () => 1,
  () => 2
], map(call)) // returns [0, 1, 2]

handlerList also works

typeFilter([
  () => 0,
  () => 1,
  () => 2
], map([call, v => ++v])) // returns [1, 2, 3]

and of course typeHandler

typeFilter([
  () => 0,
  1,
  '2',
  () => '2'
], map({
  function: callRecheck,
  number: yes,
  other: off
})) // returns [0, 1, false, false]

handler

handler like bind method for a function but you may set up handler as default and use value later

const isNumber = typeFilter({
  number: on,
  other: off
}, handler)
isNumber(1) // returns true
isNumber('1') // returns false

you may use the handler anywhere like other handlers

const getFilter = value => typeFilter(value, {
  array: handler,
  function: handler,
  object: handler,
  other: error('handler has wrong type which equals {type}')
})
const isNumber = getFilter({
  number: on,
  other: off
})
isNumber(1) // true
isNumber('1') // false
getFilter(1) // error: handler has wrong type which equals number

change list

4.0.0

  • removed array handler
  • added other arguments functionality
  • added callRecheck to handlers

3.5.1

  • updated version of jest

3.5.0

  • deprecated array handler
  • added map handler

3.4.0

  • typeFilter({...}, handler /* , options */) handler does not support options
  • custom handlers support options
const myHandler = typeFilter({...}, handler)
const value = myHandler('test', {...})

3.3.0

  • fixed import bug for babel
  • added array handler

3.2.2

call handler has args property

3.2.0

added callRecheck handler

3.1.0

now all options in handlers are the same object which you pass to the third argument of typeFilter

3.0.0

now the second argument of any handler is object which contains type, className, handler, once, rootHandler