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

moar-lodash

v2.7.1

Published

Adding some other useful features to Lodash via the Mixins method

Downloads

49

Readme

Lodash Mixins

Just some extra functionality I find myself needing in some projects

  • _.uniqObjs - Return only the unique plain objects from a collection of plain objects
  • _.sortObj - Return a copy of the object with the content sorted by the keys
  • _.isNumeric - Checks if a value is numeric, also able to determine if a string value is numeric (useful for GetOpts or URI Params)
  • _.isEmail - Check if an e-mail address is RFC822 compliant
  • _.sortMatch - Checks if the sorted version of two objects or arrays match
  • _.bool - Checks if a string (or boolean) object is boolean (again, useful for GetOpts or URI Params)
  • _.typeof - Somewhat like the standard typeof operator, but can also parse strings as other possible values ('true' can be boolean, '1' can be number, etc)
  • _.utf8Encode - Encodes an ISO-8859-1 string to UTF-8, this is meant to provide the same functionality as the PHP utf8_encode function
  • _.utf8Decode - Decodes a UTF-8 encoded string to the standard ISO-8859-1, this is meant to provide the same functionality as the PHP utf8_decode function
  • _.censor - Censor common English profanity
  • _.sha1 - Calculate the sha1 hash of a specific string. This is the equivalent of PHP's sha1 function
  • _.endWith - Ensure a specific string ends with a certain character
  • _.startWith - Ensure a specific string starts with a certain character
  • _.multiReplace - This performs a series of replacements in a string, using the items within an object/array. Quicker than chaining a bunch of replace()
  • _.replaceAt - Substitute specific characters within a string with a specified replacement.
  • _.type - Return items true type by grabbing the 2nd string content from Object.prototype.toString.call, as opposed to the less-specific 'typeof'
  • _.swap - Return a version of the provided object with the keys/values swapped
  • _.nl2br - Replaces any line return variants with HTML line breaks
  • _.br2nl - Replaces any variants of the HTML line break tag with the line return character
  • _.randStr - Generate a random alpha-numeric string
  • _.hash - Generate a salted hash
  • _.passwordHash - Generate a randomly generated salted password hash, (which can only be verified via _.passwordVerify)
  • _.passwordVerify - Verify the hash generated by _.passwordHash
  • _.isUniq - Validate the uniqueness of an array, of objects in an array, or of a specific element in the objects in an array
  • _.removeObj - Remove one or more element from an object, returning a new array with said elements
  • _.includesAll - Verify that a collection (string, array or object) has all listed values.
  • _.isSnake - Validates that a string is in snake_case format
  • _.isCamel - Validates that a string is in camelCase format
  • _.isKebab - Validates that a string is in kebab-case format
  • _.isUpper - Validates that a string is in UPPER CASE format
  • _.isLower - Validates that a string is in lower case format
  • _.isStart - Validates that a string is in Start Case format
  • _.getCase - Retrieve the case type a specified string is formatted in
  • _.isCase - Validate that a string is in the format of the case-type specified

_.uniqObjs( array arrayOfObjects )

Return a new array containing only the unique objects inside the provided array. Unlike _.uniq, this will check every key/value in the array

const objs = [ { x: 1, y: 2 }, { a: 1, b: 2 }, { x: 1, y: 2 }]

_( objs ).uniqObjs().value()
_.uniqObjs( objs )

// => [ { x: 1, y: 2 }, { a: 1, b: 2 } ]

_.sortObj( object Object )

Return a copy of the object with the content sorted by the keys

const obj = {b: 3, c: 2, a: 1}

_.sortObj( obj )
_( obj ).sortObj().value()

// => {a: 1, b: 3, c: 2}

_.sortObj(obj, (value, key) => {
	return value
})

// => {a: 1, c: 2, b: 3}

_.isNumeric( mixed something)

Check if the provided number is a float or integer value. This just tacks a 2nd check onto lodashes isNumber, which uses a lenient comparative operator to check if the value of parseFloat is the same as the provided number

_.isNumeric( 123   )
_.isNumeric( '123' )
_.isNumeric( 1.2   )
_.isNumeric( '1.2' )

// => true

_.isEmail( string email )

Attempt to validate an e-mail address against the RFC822 standard.

Note: It's actually impossible to validate an e-mail address against the RFC822 format and be 100% positive in it's results. There are a very few cases that may slip through the pattern matching validation, but the pattern used here is about as close as I can get

_.isEmail( '[email protected]' ) === true
_.isEmail( '[email protected]' ) === true
_.isEmail( 'john@@gmail.com' ) === fail
_.isEmail( 'john@gmail,com' ) === fail

_.sortMatch( mixed foo, mixed bar )

Check if two values match each other. Basically sorts the object and source, then passes it off to _.isMatch, (Since objects/arrays with same values in different orders would be considered discrepancies

_.sortMatch([1,2,3], [3,2,1]) === true

_.sortMatch({a:1,b:2,c:3}, {c:3,b:2,a:1})==== true

_.sortMatch( {a:1,b:2,c:3}, {d:4,e:5,f:6} ) === false

_.bool( mixed boolStr [, mixed otherBools ] )

Just a boolean comparison tool, Allows you to specify other true-type variables, as well as convert the value to lower case (Since the string representations of the boolean values are lower). Also compares integer values

bool( true ) === true
bool( 'true' ) === true
bool( 'false' ) === false
bool( false ) === false
bool( 1 ) === true
bool( '1' ) === true
bool( 0 ) === false
bool( '0' ) === false
bool( 'foo', [ 'foo', 'bar' ] ) === true
bool( 'foo', [ 'bar', 'baz' ] ) === false

// => true

_.typeof( mixed element [, bool discern ])

Return the type of a specific variable, much like the standard 'typeof', only with a little more functionality. This is primarily used for input from libraries/packages/modules that may convert the variable to a different type when interacting with it. For example, pretty much anything passed through the URI parameters will be a string, as well as anything passed through GetOpts, but you may want integers, for example, to actually be identified as numbers, or true/false/null/undefined strings to be identified as boolean/null/undefined. That's what the discern parameter does here, it will process the variable to attempt to identify the type it originally was.

_.typeof( [1,2] )       // array
_.typeof( 'foo' )       // string
_.typeof( true )        // boolean
_.typeof( 'true' )      // string
_.typeof( 'true',true ) // boolean
_.typeof( null )        // null
_.typeof( 'null' )      // string
_.typeof( 'null',true ) // null

_.utf8Encode( string data )

Encodes an ISO-8859-1 string to UTF-8, this is meant to provide the same functionality as the PHP utf8_encode function.

_.utf8Encode( 0xD800 ) === '55296'

_.utf8Decode( string data )

Decodes a UTF-8 encoded string to the standard ISO-8859-1, this is meant to provide the same functionality as the PHP utf8_decode function.

_.utf8Decode('Télécom') === 'Télécom'

_.censor( string data )

Censor any common profanity words by replacing it with a specified word, or masking all or some of the characters with a single specified character. The words are kept in the separate data.js file, and base64 encrypted, as to not store a huge list of profanity on any users computer. The list of words is actually a list that was downloaded from a TeamSpeak related website of words to ban (here)

Note: This only supports the English language, the dirty version

Note: The content for this method (censored words) are all base64 encoded, meaning you wont have a file with hundreds of naughty words in your dependencies (In case that was bothering you)

_.censor( 'damn' ) === 'd**n' // Partial censor (default)
_.censor( 'damn', '!' ) === 'd!!n' // Partial with altered mask
_.censor( 'damn', '#', 'full' ) === '####' // Full censor
_.censor( 'damn', '#', 'firstlast' ) === '#am#' // Censor first and last letters
_.censor( 'damn', null, 'middle' ) === 'd**n' // Censor middle characters
_.censor( 'damn', '-censored-' ) === '-censored-' // Censor entire word (If mask is more than a single character)
_.censor( 'damn', '_', 'single' ) === 'd_mn' // Censor single character

_.sha1( string data )

Calculate the sha1 hash of a specific string. This is the equivalent of PHP's sha1 function.

_.sha1( 'Hello World' ) === '0a4d55a8d778e5022fab701977c5d840bbc486d0'
_.sha1('Télécom') === '1472543473c082833b239fee0f615b284b970519'

_.endWith( string data, string suffix )

Ensure a specific string ends with a certain character

_.endWith('/User/john.doe/Documents', '/') === '/User/john.doe/Documents/'
_.endWith('Something else.', '.') === 'Something else.'

_.startWith( string data, string prefix )

Ensure a specific string starts with a certain character

_.startWith('Documents/', '~/') === '~/Documents/'
_.startWith('Something else.', '.') === 'Something else.'
_( 'Using startsWith and endsWith together' ).startWith('(').endWith(')').value() === '(Using startsWith and endsWith together)'

_.multiReplace( string data, mixed replacements [, string regexFlags ] )

This performs a series of replacements in a string, using the items within an object/array. Just a quicker/easier way than chaining .replace() over and over again. The replacements can be an array of arrays, an array of objects, or an object

_.multiReplace( 'test', { t: 'T'} ) === 'TesT'
_.multiReplace( 'foo', { FOO: 'bar'}, 'i' ) === 'bar'
_.multiReplace( 'Windows XP', [{ windows: 'Linux'}, {xp: 'RHEL'}], 'i' ) === 'Linux RHEL'

_.replaceAt( string data, mixed locations [, string replacement ] )

Substitute specific characters within a string with a specified replacement. Replacement positions are specified by either a single (numeric) value, or an array of numeric values

_.replaceAt( 'baz', 2, 'r') === 'bar'
_.replaceAt( 'bad-word', [1,2,5,6], '*') === 'b**-w**d'
_.replaceAt( 'Hello World', [6,7,8,9,10] )=== 'Hello ?????'

_.type( mixed data )

Return items true type by grabbing the 2nd string content from Object.prototype.toString.call, as opposed to the less-specific 'typeof'

_.type([]) === 'array'
_.type({}) === 'object'
_.type(() => {}) === 'function'

_.swap( object data )

Swap the keys and values of a simple plain object

_.swap( { a: 'b', c: 'd'} ) === { b: 'a', d: 'c' }

_.nl2br( string data )

Convert any new-line characters to HTML Line breaks, which can optionally be specified, but defaults to just </br>. The replaced characters consists of \r\n, \n\r, \n and \r.

_.nl2br("One\r\nTwo\n\rThree\nFour\rFive") === 'One</br>Two</br>Three</br>Four</br>Five'

_.br2nl( string data )

Complete opposite of the _.nl2br - This replaces any HTML Line breaks with the line return character, which can optionally be specified, but defaults to just \r\n. The HTML break replaced is </br>, <br>, </BR> or <BR>

_.nl2br("One<br>Two</br>Three</BR>Four<BR>Five") === 'One\r\nTwo\r\nThree\r\nFour\r\nFive'

_.randStr( [ number length ] )

Generate a random alpha-numeric string, 20 characters in length by default, or a specific length

_.randStr()   // Random string, 20 characters in length
_.randStr(15) // Something like: l5hVisKauNR1a2h

_.hash( mixed string, string salt )

Generate a salted hash

_.hash('secret-word','3o3UnhWFB28hGYK') === 'WHJzvf0ZLXXOHW5uVlB/FWaAbsQFzkXgtG7CvDQGWplqlVd20WDZ4eYBX3062dRxJFf+4bx1IBn/LJBst6BN2w=='

_.passwordHash( string string )

Generate a password hash with a randomly generated salt, which can only be verified via _.passwordVerify (Based off of PHPs password-hash function)

_.passwordHash('secret') // d3eXU3x/LcnvQskL.eDruJHeJO+V6FaDYd+iF/DfrgJ7bYca3G6AR+o3Rd7j20osNLiQNNb/Q/6RZc7c6b/L9l5FW++LE7eX9g3NxWFxXg==

_.passwordVerify( string password, string hash )

Validate a password against a hash that was generated by _.passwordHash (Based off of PHPs password-verify function)

const pwdHash = _.passwordHash('secret')
_.passwordVerify( 'secret', pwdHash ) === true
_.passwordVerify( 'foo', pwdHash ) === false

_.isUniq( array collection [, string element ] )

Validate the uniqueness of an array, of objects in an array, or of a specific element in the objects in an array

_.isUniq( [ 1, 2, 3, 2 ] ) === false
_.isUniq( [ {a: 1}, {a: 2}, {a: 1} ] ) === false
_.isUniq( [ {a: 1, b: 2}, {a: 2, b: 5}, {a: 1, b: 2} ], 'b') === false

_.removeObj( object obj, mixed del )

Remove specific elements from an object (either a single element specifying the element key as a string, or multiple, specifying the element keys in an array), returning a new object with the elements removed from the original object. This is essentially the same logic as lodashes _.remove method, except this is for objects, not arrays

Note: This method manipulates the original object. The element(s) specified at del will be completely removed from the original object, and returned in a new object

const baz = { foo: 'one', bar: 'two', baz: 'three' }
const bar = _.removeObj( baz, [ 'foo', 'bar' ] )
const foo = _.removeObj( bar, 'foo' )

// foo: { foo: 'one' }
// bar: { bar: 'two' }
// baz: { baz: 'three' }

_.includesAll( mixed collection, mixed values[, number fromIndex ] )

Verify that a collection (string, array or object) has all listed values, basically just an array-friendly version of _.includes

_.includesAll( [1,2,3], [1,3] ) === true
_.includesAll( [1,2,3], [1,2], 2 ) === false
_.includesAll( {user: 'fred', age: 40 }, ['fred', 40] ) === true
_.includesAll( 'abcdef', ['a','d'] ) === true

_.isSnake( string str )

Verify that a specified string is in snake_case format

_.isSnake( 'kebab-case' ) === false
_.isSnake( 'snake_case' ) === true

_.isCamel( string str )

Verify that a specified string is in camelCase format

_.isCamel( 'kebab-case' ) === false
_.isCamel( 'camelCase' ) === true

_.isKebab( string str )

Verify that a specified string is in kebab-case format

_.isKebab( 'camelCase' ) === false
_.isKebab( 'kebab-case' ) === true

_.isStart( string str )

Verify that a specified string is in Start Case format

_.isStart( 'lower case' ) === false
_.isStart( 'Start Case' ) === true

_.isLower( string str )

Verify that a specified string is in lower case format

_.isLower( 'UPPER CASE' ) === false
_.isLower( 'lower case' ) === true

_.isUpper( string str )

Verify that a specified string is in UPPER CASE format

_.isUpper( 'lower case' ) === false
_.isUpper( 'UPPER CASE' ) === true

_.getCase( string str )

Retrieve the case type of a specified string

Note: The order of case checks is: snake, camel, kebab, start, lower, upper. So snake_case will register as snake, but snake case will register as lower

_.getCase( 'snake_case' ) === 'snake'
_.getCase( 'camelCase' ) === 'camel'
_.getCase( 'kebab-case' ) === 'kebab'
_.getCase( 'Start Case' ) === 'start'
_.getCase( 'lower case' ) === 'lower'
_.getCase( 'UPPER CASE' ) === 'upper'
_.getCase( 'This isnt-any_case' ) === undefined

_.isCase( string str, string case )

Verify a string is in a specified format

_.isCase( 'camelCase', 'camel' ) === true
_.isCase( 'snake_case', 'camel' ) === false
_.isCase( 'lower_case', 'lower' ) === false
_.isCase( 'lower_case', 'snake' ) === true

Note: If somehow I ended up re-inventing the wheel with one of these, and they already exist.. oops.