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

meows

v1.91.0

Published

A kittybin of tools.

Downloads

210

Readme

Utilities

Only a very cool Shiba would even dare use a cat's tools.

Alternative Documentation WIP.

Installation & Usage

npm -i meows
yarn add meows
import * as U from meows
import { isType, isEmpty, notEmpty } from 'meows'
const U = require('meows')
const { isType, isEmpty, notEmpty } = require('meows')

Strings

const space = ' '
const spaces = /\s+/
const character = ''
const alphabet = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
   'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ]

/** Split string by spaces. */
function split_by_spaces(str: string): string[]

/** Alphabetical character → prime number. */
function alpha_to_prime(alphabet: string): number

/**
 * word anagram → prime product
 *
 * @description
 * An anagram is any rearrangement of a string. Conveniently, the product of
 * primes is the same regardless of order, and also allows us to count how many
 * of each prime was used, acting as an identity for anagrams.
 *
 * @example
 * anagram_to_id('listen') === anagram_to_id('silent')    // => true
 * anagram_to_id('admirer') === anagram_to_id('married')  // => true
 */
function anagram_to_id(word: string): number

/**
 * Strips a string of all normal whitespaces.
 * @example
 * stripSpaces('  a  b   c ' )  // => 'abc'
 */
function stripSpaces(str:string): string

Date and Time

/** Convert an integer from 1 to 12 to a month. */
function number_to_month(integer: number): string

/** A utility to store multiple timestamps for performance timing. */
class Timer {
   // The full state of the Timer object.
   _log(): { label: string, time: number }[]

   // A list of Unix timestamps.
   _times(): number[]

   // Add a midpoint to timer with optional label.
   next(label: string): void

   // Start timer with optional label.
   start(label: string): void

   // Add endpoint to timer with optional label.
   end(label: string): void

   // range :: () → integer || NaN if fewer than 2 timestamps.
   range(): number

   // delta :: () → integer[]
   delta(): number[]

   // Returns array of relative difference of time from start, unix timestamp as first entry.
   // relative :: () → integer[]
   relative(): number[]
}

Error and Logging

/** Alias for `console.log()`. */
function log(...a: any[]): void

/** `console.log()` with an introductory string message. */
function logStr(msg?: string, ...a: any[]): void

/**
 * Log something to console with optional message, then returns identical input.
 *
 * @example
 * Promise.all(pending)
 *    .then(x => logId(x, 'task: done'))
 *    .then(sendTask)
 */
function logId(x: any, msg?:string): any

Arrays

/**
 * A function for quickly generating arrays populated by a range of integers,
 * with an optional skip interval.
 * 
 * @example
 * range(3)          // => [0, 1, 2, 3]
 * range(-3)         // => [0, -1, -2, -3]
 * range(-2, 2)      // => [-2, -1, 0, 1, 2]
 * range(2, -2)      // => [2, 1, 0, -1, -2]
 * range(-10, 10, 5) // => [-10, -5, 0, 5, 10]
 * range(10, -10, 5) // => [10, 5, 0, -5, -10]
 */
function range(p0:number, pf?:number, speed?:number): number[]

/** 
 * Shallow filters out redundant members.
 * @example
 * uniques([0, 1, 2, 2, 3, 3])  // => [0, 1, 2, 3]
 */
function uniques(arr?: any[]): any[]

/** 
 * Shallow checks for repeat members.
 * @example
 * has_repeat([1, 2, 3])  // => false
 * has_repeat([1, 2, 1])  // => true
 */
function hasRepeat(arr: any[]): boolean

/** 
 * Choose random member in array. 
 * @example 
 * rand_choice([1, 'a', null])  // => 1
 * rand_choice([1, 'a', null])  // => null
 */
function randChoose(arr?: any[]): any

/**
 * Uses `λ` to populate an array of `size` length.
 * 
 * @example
 * series(x => 0.5*x**2 + 0.5*x, 5)  // => [0, 1, 3, 6, 10]
 */
function series(λ:Function, size:number): any[]

/**
 * Returns a shallow copy of the last value of your array. The default behavior
 * is to return `undefined` on an empty array while `throwOnEmpty` is set to
 * `false`.
 *
 * @example
 * last([3, 2, 1])       // => 1
 * last([3, 2, [1, 0]])  // => [1, 0]
 * last([null])          // => null
 * last([])              // => undefined if throwOnEmpty is false (!)
 */
function last(arr: any[], throwOnEmpty?: boolean): any

Objects

/** An empty object with no prototype. */
type ONULL = object

/** Flip the binary value for a property on an object. */
function flipProp(prop: string, obj: object): object

/** Merge objects with an empty object; can be used to strip prototype. */
function merge(...objs: object[])

/** Grab an object based on pathway of sequence of keys.
 * @example
 * const store = {
 *    a: 0,
 *    b: {
 *       a: [0, 0, 0],
 *       b: 1,
 *    }
 * }
 * const node = path(store, 'a', 'b', 'a')
 * const value = node[0]
 *
 * node[0] = 1
 * console.log(store.a.b.a)  // => [1, 0, 0]
 * console.log(value * 2)    // => 2
 */
function path(obj: object, ...props: string[]): any

Functions

/** composes a sequence of functions from right to left. */
function compose(...fns: Function[]): Function

/** composes a sequence of functions from left to right. */
function pipe(...fns: Function[]): Function

/** zip, but with a function */
function zipWith(λ: Function, v1: any[], v2: any[]): any[]

/**
 * @example
 * [true, true, false].filter(identity)  // => [true, true]
 */
function identity(x: any): any

/**
 * Given a lambda and a value `x`, run the lambda with optional arguments as a 
 * side effect, and then return the original given value `x`.
 * 
 * @example
 * function sayHi(msg = 'hi') { console.log(msg) }
 * effectId(sayHi, 42)        // => logs 'hi' and returns 42
 * effectId(sayHi, 42, 'yo')  // => logs 'yo' and returns 42
 */
function effectId(λ:Function, x, ...args)

/**
 * See if at least one array element
 * @example
 * const v1 = [2, 4, 6, 8]
 * const v2 = [2, 4, 6, 9]
 * const even = x => x % 2 === 0
 *
 * count(even, v1)  // => 4
 * count(even, v2)  // => 1
 * count(even, [])  // => 0
 */
function count(λ: Function, arr: any[]): number  | TypeError

/**
 * Given λ → returns `(compose not λ)`.
 * @example
 * const notArray = not(Array.isArray)
 * notArray([])  // => false
 * notArray({})  // => true
 */
function not(λ: Function): (...args: any[]) => boolean

/**
 * Checks if an array is a non-empty array of things that would always pass
 * your boolean function. Like `orMap` or `.every()` except empty arrays return
 * false.
 *
 * @example
 * always(even, [0, 2, 4])  // => true
 * always(even, [0, 1, 2])  // => false
 * always(even, [])         // => false
 */
function always(cond: Function, arr: any[]): boolean

/**
 * Coerces values to `true`. If input is a function, `truthy` will run the
 * function with optional arguments for side effects before returning `true`.
 
 * @example
 * truthy(console.log('hi')) && 42 // logs 'hi' and returns 42
 *
 * const say = (msg='hi') => console.log(msg)
 * truthy(say)        // logs 'hi' and returns true
 * truthy(say, 'yo')  // logs 'yo' and returns true
 */
function truthy(λ: Function, ...arg: any[]): boolean

/**
 * Coerces values to `false`. If input is a function, `falsy` will run the
 * function with optional arguments for side effects before returning `false`
 *
 * @example
 * falsy(console.log('hi')) || 42 // logs 'hi' and returns 42
 *
 * const say = (msg='hi') => console.log(msg)
 * falsy(say)        // logs 'hi' and returns false
 * falsy(say, 'yo')  // logs 'yo' and returns false
 */
function falsy(λ: Function, ...arg: any[]): boolean

Numbers and Random

/**
 * A suite of random tools.
 *
 * @example
 * Rand.int()   // => -42
 * Rand.real()  // => -42.42
 * Rand.bool() ? 'heads' : 'tails'
 * Rand.sBool() ? 'heads' : 'tails'
 */
class Rand {
   static int(min?:number, max?:number): number
   static real(min?:number, max?:number): number
   /**
    * Returns a weak random boolean.
    */
   static wBool(): boolean
   /**
    * Given natural `n` ⟶ returns `n` 'strong' random booleans.
    * @example
    * Rand.sBool() ? 'heads' : 'tails'
    * Rand.sBool(10).filter(x => x)
    */
   static bool(natural: number): boolean
}

/** Generate an array of `n` strong random integers. */
function randomInts(n: number): number[]

/** Sums numeric arguments. */
function sum(nums: number[]): number

/** Multiplies numeric arguments. */
function product(nums: number[]): number

/** Finds the difference in magnitude between two numbers. */
function diff_abs(a: number, b: number): number

/** Finds the delta of unidimensional array of reals. */
function diff_nums(nums: number[]): number[]

/** Converts an integer to an array of its digits.
 * @example
 * int_to_digits(123450)  // => [1, 2, 3, 4, 5, 0]
 */
function int_to_digits(int:number, base?:number): number[]

/**
 * Randomly signs a signable number. If the value isn't signable, return `NaN`.
 * @example
 * const backoff = (tries) => 2**tries + plus_or_minus(Math.random())
 */
function plus_or_minus(num: number): number

function negative(num: number): number
function positive(num: number): number
function flipSign(num: number): number

Logic and Types

class notEmpty {
   /**
    * @example
    * notEmpty.arr([])      // => false
    * notEmpty.arr({a: 1})  // => false
    */
   static arr(x): boolean
   /**
    * @example
    * notEmpty.obj([1, 2])  // => false
    * notEmpty.obj({})      // => false
    */
   static obj(x): boolean
   /**
    * @example
    * notEmpty.str(null)  // => false
    * notEmpty.str('')    // => false
    * notEmpty.obj(' ')   // => true
    */
   static str(x): boolean
   /**
    * @example
    * const empty = new Map()
    * const full = new Map().set('animal', 'cat')
    * 
    * notEmpty.map(full)   // => true
    * notEmpty.map(empty)  // => false
    * notEmpty.map({})     // => false
    * notEmpty.map([])     // => false
    */
   static map(x): boolean
}

/**
 * Class of static boolean functions for finding whether a value <is> an empty
 * instance of a type.
 */
class isEmpty {
   /**
    * @example
    * isEmpty.arr({})  // => false
    * isEmpty.arr([0]) // => false
    * isEmpty.arr([])  // => true
    */
   static arr(x): boolean
   /**
    * @example
    * isEmpty.obj([])     // => false
    * isEmpty.obj({a: 1}) // => false
    * isEmpty.obj({})     // => true
    */
   static obj(x): boolean
   /**
    * @example
    * isEmpty.str([])    // => false
    * isEmpty.str('  ')  // => false
    * isEmpty.str('')    // => true
    */
   static str(x): boolean
   /**
    * @example
    * const empty = new Map()
    * const full = new Map().set('animal', 'cat')
    * 
    * isEmpty.map(empty)  // => true
    * isEmpty.map(full)   // => false
    * isEmpty.map({})     // => false
    * isEmpty.map([])     // => false
    */
   static map(x): boolean
}

/**
 * Class of static boolean functions for determining non-canonical subtypes in
 * JavaScript, such as reals or signable 'numbers'.
 * 
 * @example
 * isType.num(1/0)   // => false
 * isType.int(3.0)   // => true
 * isType.real(3)    // => true
 * isType.err(NaN)   // => false
 */
class isType {
   /** Excludes NaN and Infinity! */
   static num(x?): boolean
   /** Checks if number is positive integer, including 0. */
   static nat(x?): boolean
   /** Only safe integers. */
   static int(x?): boolean
   /** Check if value is a string. */
   static str(x?): boolean
   /** Check if value is a function. */
   static fn(x?): boolean
   /** 
    * Any signable number including neutral 0, but excluding NaN and null. 
    * @example
    * isType.signable(0)     // => true
    * isType.signable(1/0)   // => true
    * isType.signable(-5)    // => true
    * isType.signable({})    // => false
    * isType.signable(NaN)   // => false
    * isType.signable(null)  // => false
    */
    static signable(x?): boolean
    /**
     * Checks if value is an error object.
     * @example
     * isType.err(new TypeError())  // => true
     * isType.err({})               // => false
     * isType.err(null)             // => false
     */
    static err(x?): boolean
    /**
     * Checks if value is a negative number, excluding `0`, and `Infinity`.
     * @example
     * isType.neg(-2)    // true
     * isType.neg(+2)    // false
     * isType.neg(-0)    // false (!)
     * isType.neg(-1/0)  // false (!)
     * isType.neg([])    // false
     * isType.neg(NaN)   // false
     */
    static neg(x?): boolean
    /**
     * Checks if value is an instance of Map.
     * 
     * @example
     * isType.map(new Map())  // => true
     * isType.map({})         // => false
     * isType.map([])         // => false
     */
    static map(x?): boolean
}


/**
 * Returns the type of an unknown value as a lower-cased string. Type 'number'
 * is defined separately from 'infinity' and 'nan' because most functions on
 * numbers don't expect those types.
 *
 * @example
 * typeName(new Map)  // => 'map'
 * typeName(void f()) // => 'undefined'
 * typeName(null)     // => 'null'
 * typeName([])       // => 'array'
 * typeName({})       // => 'object'
 * typeName(/\s+/)    // => 'regexp'
 * typeName(0 / 0)    // => 'nan'
 * typeName(-1 / 0)   // => 'infinity'
 *
 * const buffer = new ArrayBuffer(16)
 * const view = new Int16Array(buffer)
 * const err = new Error()
 *
 * typeName(err)    // => 'error'
 * typeName(buffer) // => 'arraybuffer'
 * typeName(view)   // => 'int16view'
 */
function typeName(x?: any): string

Async

/**
 * Promisified setTimeout that resolves to `<any>` or `<void>`.
 * @example
 * // logs 'hi' after delay
 * let hi = async () => await wait(4000, 'hi')
 *    .then(console.log)
 */
function wait(ms?:number, resolveTo?:any): Promise <any>