Skip to content

Commit

Permalink
Authoritative brand checking library
Browse files Browse the repository at this point in the history
Can be used without any dependency on React. Plausible replacement for
React.isValidElement.
  • Loading branch information
sebmarkbage committed Oct 19, 2017
1 parent b52a562 commit 95419c5
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 0 deletions.
33 changes: 33 additions & 0 deletions packages/react-is/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# `react-is`

This package allows you to test arbitrary values and see if they're a particular React type, e.g. React Elements.

## Usage

```js
import React from 'react';
import {isElement} from 'react-is';
isElement(<div />); // true
```

```js
import React from 'react';
import {isFragment} from 'react-is';
isFragment(<></>); // true
```

```js
import React from 'react';
import {createPortal} from 'react-dom';
import {isPortal} from 'react-is';
isPortal(createPortal(<div />, document.body)); // true
```

```js
import React from 'react';
import {createPortal} from 'react-dom';
import {typeOf} from 'react-is';
typeOf(<div />); // "ReactElement"
typeOf(<></>); // "ReactFragment"
typeOf(createPortal(<div />, document.body)); // "ReactPortal"
```
67 changes: 67 additions & 0 deletions packages/react-is/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/**
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

'use strict';

var REACT_ELEMENT_TYPE;
var REACT_COROUTINE_TYPE;
var REACT_YIELD_TYPE;
var REACT_PORTAL_TYPE;
var REACT_FRAGMENT_TYPE;
if (typeof Symbol === 'function' && Symbol.for) {
REACT_ELEMENT_TYPE = Symbol.for('react.element');
REACT_COROUTINE_TYPE = Symbol.for('react.coroutine');
REACT_YIELD_TYPE = Symbol.for('react.yield');
REACT_PORTAL_TYPE = Symbol.for('react.portal');
REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');
} else {
REACT_ELEMENT_TYPE = 0xeac7;
REACT_COROUTINE_TYPE = 0xeac8;
REACT_YIELD_TYPE = 0xeac9;
REACT_PORTAL_TYPE = 0xeaca;
REACT_FRAGMENT_TYPE = 0xeacb;
}

function is(object, type) {
return (
typeof object === 'object' && object !== null && object.$$typeof === type
);
}

module.exports = {
typeOf(object) {
switch (typeof object === 'object' && object !== null && object.$$typeof) {
case REACT_ELEMENT_TYPE:
return 'ReactElement';
case REACT_COROUTINE_TYPE:
return 'ReactCoroutine';
case REACT_YIELD_TYPE:
return 'ReactYield';
case REACT_PORTAL_TYPE:
return 'ReactPortal';
case REACT_FRAGMENT_TYPE:
return 'ReactFragment';
default:
return undefined;
}
},
isElement(object) {
return is(object, REACT_ELEMENT_TYPE);
},
isCoroutine(object) {
return is(object, REACT_COROUTINE_TYPE);
},
isYield(object) {
return is(object, REACT_YIELD_TYPE);
},
isPortal(object) {
return is(object, REACT_PORTAL_TYPE);
},
isFragment(object) {
return is(object, REACT_FRAGMENT_TYPE);
},
};
12 changes: 12 additions & 0 deletions packages/react-is/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"name": "react-is",
"description": "Brand checking of React Elements.",
"keywords": ["react"],
"version": "1.0.0",
"homepage": "https://reactjs.org/",
"bugs": "https://github.com/facebook/react/issues",
"license": "MIT",
"files": ["index.js"],
"main": "index.js",
"repository": "facebook/react"
}

0 comments on commit 95419c5

Please sign in to comment.