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

@productive-codebases/toolbox

v1.1.4

Published

Tooling for productive codebases.

Downloads

28

Readme

Toolbox

Some useful functions and types.

Motivation

Set of functions and types used across the different projects of Productive Codebases.

Prerequisites

Typescript is not mandatory but highly recommended.

Installation

npm install @productive-codebases/toolbox

Exposed tooling

Conditions

assertUnreachableCase

Ensures that all cases of a switch are implemented by returning a never type in the default case.

Usage:

switch (unionOfValues) {
  case 'value1': {
    // ...
  }

  case 'value2': {
    // ...
  }

  default: {
    assertUnreachableCase(unionOfValues)
  }
}

Entities

createEntity and createEntities

Instanciate entities from a litteral objects.

Usage:

const user = createEntity(EntityUser, {
  id: '1',
  username: 'John'
})

const users = createEntities(EntityUser, [
  {
    id: '1',
    username: 'John'
  },
  {
    id: '2',
    username: 'T1000'
  }
])

StrictObject

Typed listing of keys, values and entries from an object.

Usage:

const user = {
  id: '1',
  username: 'John'
}

StrictObject.keys(user)     // ['id', 'username']
StrictObject.values(user)   // ['1', 'John']
StrictObject.entries(user)  // [['id', '1'], ['username', 'John']]

Objects

deepMerge

Deeply merges multiple objects.

Usage:

const mergedObjects = deepMerge([object1, object2], optionalOptions)

Arrays

ensureArray

Ensures that a value is an array.

Usage:

ensureArray(x).map(...)

Sets

ensureSet

Ensures that a value is a set.

Usage:

ensureSet(x).forEach(...)

Maps

addSetValueToMap, removeSetValueToMap

Add or remove a Set value to a map.

Usage:

const map = new Map<string, Set<number>>()

addSetValueToMap(map, 'scores', 42)
addSetValueToMap(map, 'scores', 92)

const numbers = map.get('scores')

numbers.size // 2

indexEntitiesToMap, appendEntitiesToMap

Index / Append entities (objects) to a map.

Usage:

const users = [
  {
    id: 1,
    name: 'Bob'
  },
  {
    id: 2,
    name: 'Alice'
  },
  {
    id: 3,
    name: 'John'
  }
]

const usersMap = indexEntitiesToMap(users, 'id')
const bobUser = usersMap.get(1)
const users = [
  {
    id: 1,
    name: 'Bob',
    lastName: 'Foo'
  },
  {
    id: 2,
    name: 'Alice',
    lastName: 'Foo'
  },
  {
    id: 3,
    name: 'John',
    lastName: 'Bar'
  }
]

const usersMap = appendEntitiesToMap(users, 'lastName')
const usersHavingFoo = usersMap.get('Foo')

usersHavingFoo.size // 2

Assertions

isDefined

Returns a type predicate to remove undefined or nullable values of an array.

Usage:

if (isDefined(x)) {
  //...
}
const values = [null, undefined, '', 'value', 0].filter(isDefined)

values.length // 3

isNotFalsy, isNotFalsy

Returns a type predicate to filter falsy values of an array.

Usage:

if (isNotFalsy(x)) {
  //...
}
const values = [null, undefined, '', 'value', 0].filter(filterFalsies)

values.length // 1

isTruthy

Return true if the value is truthy.

Usage:

if (isTruthy(x)) {
  //...
}

Tooling

setupLogger

Return a composite function allowing to log message from a defined logger mapping.

const loggerMapping = {
  server: {
    express: 'express',
    middleware: 'middleware'
  },
  client: {
    react: 'react',
    store: 'store'
  }
}

const { newLogger } = setupLogger(loggerMapping)
const logger = newLogger('server')('middleware')

logger('info')('Send request')
logger('error')('Error 500')

You can enable / disable logger messages by adding a debug property in local storage. Example:

// Will show only log messages for the server middleware:
localStorage.set('debug', 'server:middleware:*')

MetaData

Metadata-like data storage.

Usage:

interface IMetaData {
  data: string
}

const metadata = new MetaData<IMetaData>()
metadata.set({ data: 'foo' })
const value = metadata.get('data')

Types

Maybe

Define a value that can be null.

Usage:

type Value = Maybe<string>

MaybeUndef

Define a value that can be undefined.

Usage:

type Value = MaybeUndef<string>

Perhaps

Define a value that can be null or undefined.

Usage:

type Value = Perhaps<string>

PropertiesNullable

Define an object with all properties as nullable values.

Usage:

interface IUser = {
  id: number
  name: string
}

const user: PropertiesNullable<IUser> = {
  id: null,
  name: null
}

PropertiesNonNullable

Define an object with all properties as non-nullable values.

Usage:

interface INullableUser = {
  id: Maybe<number>
  name: Maybe<string>
}

const user: PropertiesNonNullable<INullableUser> = {
  id: 1,
  name: null  // Error
}

PartialDeep

Partial applyed deeply.

Usage:

interface IUser = {
  id: number
  name: string
  address: {
    city: string
    country: string
  }
}

const user: PartialDeep<IUser> = {
  id: 1,
  address: {
    country: 'France'
  }
}