Socket
Socket
Sign inDemoInstall

safely-iterate

Package Overview
Dependencies
0
Maintainers
1
Versions
2
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    safely-iterate

Fail-safe optimized array iteration utilities for reactive environments.


Version published
Weekly downloads
64
increased by52.38%
Maintainers
1
Install size
21.0 kB
Created
Weekly downloads
 

Readme

Source

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

Keywords

FAQs

Last updated on 13 May 2020

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc