Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC] Add react-is package #11279

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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"
}