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

idx

v3.0.3

Published

Utility function for traversing properties on objects and arrays.

Downloads

146,892

Readme

idx

This module is deprecated and no longer maintained. Use optional chaining instead.

idx is a utility function for traversing properties on objects and arrays, where intermediate properties may be null or undefined.

One notable difference between idx and optional chaining is what happens when an intermediate property is null or undefined. With idx, the null or undefined value is returned, whereas optional chaining would resolve to undefined.

Install

$ npm install idx babel-plugin-idx

or

$ yarn add idx babel-plugin-idx

Configure Babel to include the babel-plugin-idx Babel plugin.

{
  plugins: [['babel-plugin-idx']];
}

This is necessary for idx to behave correctly with minimal performance impact.

Usage

Consider the following type for props:

type User = {
  user: ?{
    name: string,
    friends: ?Array<User>,
  },
};

Getting to the friends of my first friend would resemble:

props.user &&
  props.user.friends &&
  props.user.friends[0] &&
  props.user.friends[0].friends;

Instead, idx allows us to safely write:

idx(props, _ => _.user.friends[0].friends);

The second argument must be a function that returns one or more nested member expressions. Any other expression has undefined behavior.

Static Typing

Flow and TypeScript understand the idx idiom:

// @flow

import idx from 'idx';

function getName(props: User): ?string {
  return idx(props, _ => _.user.name);
}

If you use idx@3+, you may need to add the following to your .flowconfig:

[options]
conditional_type=true
mapped_type=true

Babel Plugin

The idx runtime function exists for the purpose of illustrating the expected behavior and is not meant to be executed. The idx function requires the use of a Babel plugin that replaces it with an implementation that does not depend on details related to browser error messages.

This Babel plugin searches for requires or imports to the idx module and replaces all its usages, so this code:

import idx from 'idx';

function getFriends() {
  return idx(props, _ => _.user.friends[0].friends);
}

gets transformed to something like:

function getFriends() {
  return props.user == null
    ? props.user
    : props.user.friends == null
    ? props.user.friends
    : props.user.friends[0] == null
    ? props.user.friends[0]
    : props.user.friends[0].friends;
}

Note that the original import gets also removed.

It's possible to customize the name of the import/require, so code that is not directly requiring the idx npm package can also get transformed:

{
  plugins: [
    [
      'babel-plugin-idx',
      {
        importName: './idx',
      },
    ],
  ];
}

License

idx is MIT licensed.