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

safeobj

v1.0.3

Published

Safe object property access using Proxies

Downloads

7

Readme

safeobj

Safely access proprties on an object without the danger of Uncaught TypeError: Cannot read property '🚀' of undefined.

As described in my article Using ES6's Proxy for safe Object property access, we can avoid errors by using proxies. This allows us to achieve a cleaner and safer style of coding.

I'd recommend reading the article to fully understand the incentive.

Usage in TypeScript

This package contains embedded TypeScript type definitions. TypeScript 2.2.0 or higher is required.

API

The API is very simple. We have a default export from the module, which is a function you apply to any object you wish to make safe.

For example:

import safe from 'safeobj'

const safeDarthVader = safe({
  name : 'Anakin',
  mother : {
    name : 'Shmi'
  }
})

The constant safeDarthVader will now be safe and you can access any property on it without the fear of an error being throws.

When you access a property on a safe object you will get back either the object's property or a constant called Undefined which we can identify using the isUndefined function.

For example:

import safe, { Undefined, isUndefined } from 'safeobj'

const safeDarthVader = safe({
  name : 'Anakin',
  mother : {
    name : 'Shmi'
  }
})

expect(safeDarthVader.name).toBe('Anakin');
expect(safeDarthVader.mother.name).toBe('Shmi');
expect(safeDarthVader.father.name).toBe(Undefined);
expect(isUndefined(safeDarthVader.father.name).toBe(true);

This mean we no longer need to fear accessing properties on the object safeDarthVader, as apposed to dangerousDarthVader

const dangerousDarthVader = {
  name : 'Anakin',
  mother : {
    name : 'Shmi'
  }
}

expect(dangerousDarthVader.name).toBe('Anakin');
expect(dangerousDarthVader.mother.name).toBe('Shmi');
// The next line throws an "Uncaught TypeError: Cannot read property 'name' of undefined" Error
expect(dangerousDarthVader.father.name).toBe(undefined);

To make using the safe object a little easier we also provide an either function which takes as a first argument a property on the safe object and as a second argument a default value to use if the property is undefined.

import safe, { either } from 'safeobj'

const safeDarthVader = safe({
  name : 'Anakin',
  mother : {
    name : 'Shmi'
  }
})

expect(
  either(safeDarthVader.mother.name, new Error('TypeError: Darth Vader must have a mother'))
).toBe(
  'Shmi'
);

expect(
  either(safeDarthVader.father.name, 'Darth Vader has no father'))
.toBe(
  'Darth Vader has no father'
);

Good luck, and may the force be with you!