1.1.0 • Published 6 years ago

class-is v1.1.0

Weekly downloads
107,591
License
MIT
Repository
github
Last release
6 years ago

class-is

NPM version Downloads Build Status Coverage Status Dependency status Dev Dependency status Greenkeeper badge

Enhances a JavaScript class by adding an is<Class> property to compare types between realms.

Motivation

Checking if a value is an instance of a class in JavaScript is not an easy task.

You can use instanceof, but that doesn't work between different realms or different versions. Comparing with constructor.name could be a solution but if you need to Uglify the module it doesn't work, as it creates different names for the same module.

Symbols to the rescue!

Installation

$ npm install class-is

If you want to use this module in the browser you have to compile it yourself to your desired target.

Usage

ES6 classes:

// Package X
const withIs = require('class-is');

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

module.exports = withIs(Person, {
    className: 'Person',
    symbolName: '@org/package-x/Person',
});
// Package Y
const withIs = require('class-is');

class Animal {
    constructor(species) {
        this.species = species;
    }
}

module.exports = withIs(Animal, {
    className: 'Animal',
    symbolName: '@org/package-y/Animal',
});
const Person = require('package-x');
const Animal = require('package-y');

const diogo = new Person('Diogo', 'Porto');
const wolf = new Animal('Gray Wolf');

console.log(Person.isPerson(diogo));
console.log(Person.isPerson(wolf));

Running the example above will print:

true
false

ES5 and below classes:

In ES5 it's not unusual to see constructors like the one below, so you can call it without using the new keyword.

function Circle(radius) {
    if (!(this instanceof Circle)) {
        return new Circle();
    }

    this.radius = radius;
}

In such cases you can use the withIs.proto method:

const withIs = require('class-is');

const Circle = withIs.proto(function (radius) {
    if (!(this instanceof Circle)) {
        return new Circle();
    }

    this.radius = radius;
}, {
    className: 'Circle',
    symbolName: '@org/package/Circle',
});

...or even better:

const withIs = require('class-is');

function Circle(radius) {
    this.radius = radius;
}

module.exports = withIs.proto(Circle, {
    className: 'Circle',
    symbolName: '@org/package/Circle',
    withoutNew: true,
});

API

withIs(Class, { className, symbolName })

class

Type: class

The class to be enhanced.

className

Type: String

The name of the class your passing.

symbolName

Type: String

Unique id for the class. This should be namespaced so different classes from different modules do not collide and give false positives.

Example: @organization/package/Class

withIs.proto(Class, { className, symbolName, withoutNew })

The className and symbolName parameters are the same as above.

withoutNew

Type: Boolean
Default: false

Allow creating an instance without the new operator.

Tests

$ npm test
$ npm test -- --watch during development

License

MIT

@everything-registry/sub-chunk-1332qudratic-uiquadratic-sdksan-sdk-crosssan-sdk.js@yak-spirit/yak-swap-uisdk-test.js@sudophunk/fulido@xstorage/xs-js-ipld-dag-pb@xstorage/xs-js-libp2p-tcp@xstorage/xs-js-libp2p-webrtc-star@xstorage/xs-js-libp2p-websockets@xswap/v2-core@xmader/ipfs-coreeth-libp2p-switcheth-libp2p-webrtc-stareth-libp2p-websocket-stareth-peer-idenefti-galeridynamics-contracts-xeaquererumjs-swrm-client-testgassefalsgassefals-2libp2p-switchlibp2p-tcplibp2p-webrtc-circuitlibp2p-webrtc-directlibp2p-webrtc-starlibp2p-stardustlibp2p-websocketslibp2p-websockets-curltechlibp2p-websockets-curltechtestlibp2p-websocket-starmini-ipfslittle-pubsub@eliteswap/v2-coreinterface-connectioninstaller-test-malware-client-2knightxv-libp2pipfs-blockipfs-vueipld-lfcipld-lfc-txjs-swrm-clientjs-swrm-client-betajs-swrm-client-videopeer-idpixiuswap-libs-sdkpixiu-swap-core@zalastax/nolb-clas@deconet/libp2p-webrtc-direct@galtproject/js-ipfs@idn/libp2p-webrtc-stardate-to-block-eth@innoswap/core@chakra-swap/corexs-js-ipfs-blockxs-js-libp2p-tcpxs-js-libp2p-websocketsxs-js-multiaddr@jimpick/cids@kodinghandle/bullswap-lib@bonsaiswap-lib/lib@bonsaiswapv3/core@bonsaiswapv3/deploy@afria/afria-libraries@arve.knudsen/libp2p-switch@arve.knudsen/peer-id@borealisswap/borealis-swap-libchained-config@compendia/ipfs-core@compendia/libp2p-commonjszona-x@ipld/block@ipld/generics@ipld/types@mdip/libp2p@materia-dex/materia-contracts-proxy@nirin100/quadratic-protocol@nirin100/quadratic-sdk@olympfin/olymp-swap-lib@nodeberry/solidity-payment-processor@lit-protocol/libp2p-webrtc-direct@dstack-js/transport
1.1.0

6 years ago

1.0.0

6 years ago

0.5.1

6 years ago

0.5.0

6 years ago

0.4.0

6 years ago

0.3.1

6 years ago

0.3.0

6 years ago

0.2.1

6 years ago

0.2.0

6 years ago