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

@darkobits/private-data

v2.1.1

Published

A stopgap solution for private class data in JavaScript.

Downloads

14

Readme

This package provides a (temporary) way to achieve private fields (and methods) at runtime with JavaScript classes until the private fields proposal is finalized. It uses the Weak Map approach as outlined by Dr. Axel Rauschmayer's blog post on this topic.

This project is intended for academic purposes only and should not be used in production.

Install

$ npm i @darkobits/private-data

Use

This package's default export is a function that creates a new private data store and returns a function which accepts an instance reference (re: this) and returns its private data object.

Parameters

|Name|Type|Description| |---|---|---| |context|object|Reference to a class instance, usually this.|

Returns

object - The instance's private data object.

Example

In this example, we will define a Person class that uses private data. We will use the variable $ for the data store.

import dataStore from '@darkobits/private-data';

const $ = dataStore();

class Person {
  constructor(name) {
    $(this).name = name;
  }

  getName() {
    return $(this).name;
  }
}

const frodo = new Person('Frodo');
frodo.getName(); //=> 'Frodo'

It is also possible to create "private methods":

import dataStore from '@darkobits/private-data';

const $ = dataStore();

class Person {
  constructor(name) {
    $(this).privateMethod = () => {
      // ...
    };
  }

  publicMethod() {
    const result = $(this).privateMethod();
    // ...
  }
}

Caveats

  • Private data is backed by an object in a Weak Map. Bear in mind that objects in JavaScript are always passed by reference, so if you return $(this);, consumers of your class will have a direct reference to the instance's private data, which they can then modify at will. The same holds for return-ing any sub-tree of this object. To avoid this, always return primitive values or clone non-primitives before returning them.
  • This module performs basic checks on WeakMap.prototype.get and WeakMap.prototype.set to ensure they haven't been tampered-with, but a sophisticated attacker could subvert these checks.