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

@escaladesports/utils

v2.0.1

Published

Utility functions for use in Escalade Sports projects

Downloads

33

Readme

@escaladesports/utils

Utility functions for use in websites & other projects

Included functions:


graphToArray

Makes a plain array out of the graph structure commonly returned by GraphQL APIs. Accepts an object with either an edges or nodes array.

Example usage:

const mockData = {
  edges: [
    {
      node: {
        someProperty: `Marco`
      }
    },
    {
      node: {
        someProperty: `Polo`
      }
    }
  ]
}

graphToArray(mockData)
// [
//   { someProperty: `Marco` },
//   { someProperty: `Polo` }
// ]

You can also pass a 2nd argument specifying a path for returning a nested property in each node that is an object (uses get() from Lodash internally).

graphToArray(mockData, `someProperty`)
// [`Marco`, `Polo`]

Alternatively, you can pass an object containing nodes directly instead of edges. Some GraphQL APIs are able to return data this way.

const mockData2 = {
  nodes: [
    { someProperty: `Marco` },
    { someProperty: `Polo` }
  ]
}

graphToArray(mockData2, `someProperty`)
// [`Marco`, `Polo`]

NOTE: This function assumes only one connection in the graph structure, so the conversion is only applied to the edges array at the top/root level of the data. It does not handle multiple or nested connections – so it's mostly useful when the data being worked with doesn't fit a graph structure in the first place but gets returned that way from an API (e.g. most Escalade CMS data).

See this blog post for more info on graph data structures.


getComponentName

Returns the display name of a React component. Useful for making a higher-order component display a developer-friendly tag name in the React dev tools Components tab.

Example usage:

function MyComponent(props) {
  return <h1>{props.title}</h1>
}

getComponentName(MyComponent)
// `MyComponent`

Example usage in HOC:

function withEnhancement(OrigComponent) {
  function EnhancedComponent(props) {
    console.log(`I'm enhanced now!!!`)
    return <OrigComponent {...props} />
  }

  const origName = getComponentName(OrigComponent)
  EnhancedComponent.displayName = `withEnhancement(${origName})`

  return EnhancedComponent
}

trimCommon

Removes all beginning characters that are shared in common by every string in a given list. The list can be an array of either strings or objects containing strings.

When passing an array of objects, the 2nd argument is the property or path (as a string) to follow in each object to get to the intended string value. The objects will be preserved in the output with the inner targeted property values changed; this mutates the original object.

Example Usage

With strings:

const strings = [
  `Virtuous Contract`,
  `Virtuous Treaty`,
  `Virtuous Dignity`,
  `Virtuous Grief`,
]

trimCommon(strings)
// [`Contract`, `Treaty`, `Dignity`, `Grief`]

With objects:

const objects = [
  { strings: [`Cruel Oath`] },
  { strings: [`Cruel Blood Oath`] },
  { strings: [`Cruel Arrogance`] },
  { strings: [`Cruel Lament`] },
]

trimCommon(objects, `strings[0]`)
// [
// 	{ strings: [`Oath`] },
// 	{ strings: [`Blood Oath`] },
// 	{ strings: [`Arrogance`] },
// 	{ strings: [`Lament`] },
// ]

Currency Functions

These functions are meant to be as flexible and predictable as possible – so despite the thorough documentation of their behavior below, you can usually safely assume that they will work with whatever value you're passing and output what you would expect.

Just keep in mind that toDollars always assumes you're passing a value in cents – even if you pass it a value containing a dollar sign! (see below)

formatPrice

Formats a number as US currency.

Takes either a number or numeric string as input and can handle different input formats to a reasonable degree. An empty string is returned if the input is falsey or not number-like at all.

Examples:

formatPrice(2)            // `$2.00`
formatPrice(12.345)       // `$12.35`
formatPrice(1000000)      // `$1,000,000.00`
formatPrice(0)            // `$0.00`
formatPrice(`3.501`)      // `$3.50`
formatPrice(`$9,000.01`)  // `$9,000.01`
formatPrice(`-9,000.01`)  // `-$9,000.01`
formatPrice(`123abc`)     // `$123.00`
formatPrice(`godzilla`)   // ``
formatPrice(``)           // ``
formatPrice(false)        // ``
formatPrice(null)         // ``
formatPrice(undefined)    // ``

unformatPrice

Converts US currency format to a plain number.

Takes either a string or number as input and can handle different input formats to a reasonable degree. For example: the function can take a value that is already a plain number type and simply output the same value.

Always returns a number (for valid number-like input) or null (for invalid/non-zero falsey input).

Examples:

unformatPrice(`$3.50`)          // 3.5
unformatPrice(`$1,000,000.00`)  // 1000000
unformatPrice(`-$100.00`)       // -100
unformatPrice(`$0.00`)          // 0
unformatPrice(`123.45`)         // 123.45
unformatPrice(`1,234.5`)        // 1234.5
unformatPrice(123.45)           // 123.45
unformatPrice(0)                // 0
unformatPrice(`Not a price`)    // null
unformatPrice(``)               // null
unformatPrice(false)            // null
unformatPrice(null)             // null
unformatPrice(undefined)        // null

toCents

Converts dollars to cents (i.e. multiplies by 100).

Takes either a number or numeric string as input and can handle different input formats to a reasonable degree. Returns null if the input value is falsey (non-zero) or not number-like at all.

Examples:

toCents(`$123.45`)      // 12345
toCents(`1,234.56`)     // 123456
toCents(`$9,001`)       // 900100
toCents(-1234.56)       // -123456
toCents(0)              // 0
toCents(`Not a price`)  // null
toCents(null)           // null
toCents(undefined)      // null
toCents(false)          // null
toCents({})             // null
toCents([])             // null

toDollars

Converts cents to dollars (i.e. divides by 100) and optionally formats the output as currency.

Takes either a number or numeric string as input and can handle different input formats to a reasonable degree. The input value is always assumed to be in cents even if it contains a dollar sign (see code example down below).

By default, the function returns a number when the input is valid (number-like) or null when the input is invalid (non-zero falsey/non-number-like).

Optionally, true can be passed for the 2nd argument to format the output as US currency. In this case, the function returns a US currency-formatted string when the input is valid or an empty string when the input is invalid.

Examples:

toDollars(123)              // 1.23
toDollars(123, true)        // `$1.23`

toDollars(234.56)           // 2.35
toDollars(234.56, true)     // `$2.35`

toDollars(0)                // 0
toDollars(0, true)          // `$0.00`

toDollars(`0.1`)            // 0
toDollars(`0.1`, true)      // `$0.00`

toDollars(`900,001`)        // 9000.01
toDollars(`900,001`, true)  // `$9,000.01`

// IMPORTANT: make note of this behavior
toDollars(`$9,001`)         // 90.01
toDollars(`$9,001`, true)   // `$90.01`

toDollars(null)             // null
toDollars(null, true)       // ``

toDollars(undefined)        // null
toDollars(undefined, true)  // ``

toDollars(false)            // null
toDollars(false, true)      // ``

Image Functions

getFixedGatsbyImage and getFluidGatsbyImage

Creates a fixed/fluid object to pass to Gatsby Image. Works fully with Sanity asset IDs and Salsify URLs. Works partially with all other image URLs (multiple sizes are not generated).

Example usage:

import { getFixedGatsbyImage, getFluidGatsbyImage } from '@escaladesports/utils'
import Img from 'gatsby-image'

// Salsify Fixed/Fluid
const salsifyUrl = `http://images.salsify.com/image/upload/s--q4bsEzUQ--/qqfmqkexp77wmzirnvrv.jpg`

const salsifyFixed = getFixedGatsbyImage(salsifyUrl, { maxWidth: 1600 })
const salsifyFluid = getFluidGatsbyImage(salsifyUrl, { width: 800 })

// With Gatsby Image
return (
  <>
    <Img fixed={salsifyFixed} />
    <Img fluid={salsifyFluid} />
  </>
)

// Sanity Fixed/Fluid
const sanityConfig = {
  projectId: `yourProjectId`,
  dataset: `yourDataset`,
}
const sanityImageId = `image-ae1185e833772f2c39366f69a425d78ae5517965-2000x2000-png`

const sanityFixed = getFixedGatsbyImage(sanityImageId, { maxWidth: 1600 }, sanityConfig)
const sanityFluid = getFluidGatsbyImage(sanityImageId, { width: 800 }, sanityConfig)

// With Gatsby Image
return (
  <>
    <Img fixed={sanityFixed} />
    <Img fluid={sanityFluid} />
  </>
)

// Other Fixed/Fluid
const otherUrl = `https://via.placeholder.com/1600`

const otherFixed = getFixedGatsbyImage(otherUrl, { maxWidth: 1600 })
const otherFluid = getFluidGatsbyImage(otherUrl, { width: 800 })

// With Gatsby Image
return (
  <>
    <Img fixed={otherFixed} />
    <Img fluid={otherFluid} />
  </>
)

buildSalsifyImageUrl

Takes an existing Salsify image URL and inserts image transformation parameters based on options passed. Any existing transformation parameters in the original URL are detected and replaced.

Arguments

  1. Original URL
  2. Options object

Options Object

| Property | Prefix in URL | Default | | --- | --- | --- | | width | w_ | |
| height | h_ | | | quality | q_ | 60 | | cropMode | c_ | "fit" |

Example usage:

const url = `http://images.salsify.com/image/upload/w_2000,h_2000/abc123.jpg`

const fullUrl = buildSalsifyImageUrl(url, {
  width: 1200,
  quality: 90,
  cropMode: `fill`
})
// output: `http://images.salsify.com/image/upload/w_1200,q_90,c_fill/abc123.jpg`