1.0.1 ā€¢ Published 4 years ago

safely-iterate v1.0.1

Weekly downloads
9
License
MIT
Repository
github
Last release
4 years ago

safely-iterate

šŸŒ± Fail-safe optimized array iteration utilities for reactive environments.

āœØ Features

  • šŸ“¦ ~400b (gzipped)
  • šŸ™…ā€ā™‚ļø Zero dependencies
  • šŸŒˆ TypeScript Support
  • āœ… Fully tested and reliable
  • šŸŽ Works with NodeList and HTMLCollection
  • āš’ CommonJS, ESM & browser standalone support

šŸ”§ Installation

You can easily install this package with yarn or npm:

$ yarn add safely-iterate

or

$ npm install --save safely-iterate

šŸ¤·ā€ā™‚ Why this?

If you've worked with JavaScript well enough, I bet you're familiar with errors like "TypeError: Cannot read property 'map' of undefined". Now, this can occur due to several reasons like unpredictable data response from an API, delayed arrival of data etc.

With JavaScript apps dominating the web today, this can be quite costly as it could result in several problems like CSR interruption, broken server-side rendering and the worst of them all - unusable systems.

This library exists to provide a solution by offering re-usable utilities intentionally optimized to fail gracefully and leverage a pass-first-replace-later strategy which only works in reactive environments. As a bonus, you can use the functions to iterate over NodeList and HTMLCollection without worrying about cross-browser compat.

šŸ“– Usage

To start with, this library exposes the safe functions safeEvery, safeFilter, safeFind, safeFindIndex, safeForEach, safeMap, safeReduce, safeReduceRight, safeSome and safeSort.

The common signature for all safe functions excluding safeReduce and safeReduceRight look something like:

function safeFn<T>(
  array: T[] | NodeList | HTMLCollection,
  // Here, `any` is the actual callback return value of the safe function being used.
  callbackfn: (value: T, index: number, obj: T[]) => any,
  thisArg?: any
)

// This variant is for when a non-array is passed to the safe function
function safeFn<T>(
  array: T,
  // Here, `any` is the actual callback return value of the safe function being used.
  callbackfn: (value: undefined, index: undefined, obj: never[]) => any,
  thisArg?: any
)

See index.d.ts for more information on safeReduce, safeReduceRight and the signatures of all the safe functions.

In the example below, regardless of what type items in state is, it gracefully gets converted to an array internally, which also means even if the type gets polluted sometime in the future of the component's existence, safeMap will retain its internal type of array.

However, as long as items is an array in the component, any time it's updated, safeMap will react to that change and display the updated items. Same applies for safeEvery, safeFilter etc.

Example

import { useEffect, useCallback } from 'react'
import { safeMap } from 'safely-iterate'

function ItemList() {
  const [items, setItems] = useState([])
  const [isLoaded, setIsLoaded] = useState(false)
  const getItems = useCallback(() => {
    return fetch('https://api.example.com/items').then(res => res.json())
  }, [])

  useEffect(() => {
    ;(async function () {
      const result = await getItems()
      setIsLoaded(true)
      setItems(result.items)
    })()
  }, [])

  if (!isLoaded) return <div>Loading...</div>
  return (
    <ul>
      {safeMap(items, item => {
        if (!item) return
        return (
          <li key={item.name}>
            {item.name} {item.price}
          </li>
        )
      })}
    </ul>
  )
}

āœØ

šŸ¤ License

MIT Ā© Olaolu Olawuyi