1 | /*
|
2 | * Copyright 2020 Palantir Technologies, Inc. All rights reserved.
|
3 | *
|
4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | * you may not use this file except in compliance with the License.
|
6 | * You may obtain a copy of the License at
|
7 | *
|
8 | * http://www.apache.org/licenses/LICENSE-2.0
|
9 | *
|
10 | * Unless required by applicable law or agreed to in writing, software
|
11 | * distributed under the License is distributed on an "AS IS" BASIS,
|
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13 | * See the License for the specific language governing permissions and
|
14 | * limitations under the License.
|
15 | */
|
16 | import * as React from "react";
|
17 | /**
|
18 | * Returns true if `node` is null/undefined, false, empty string, or an array
|
19 | * composed of those. If `node` is an array, only one level of the array is
|
20 | * checked, for performance reasons.
|
21 | */
|
22 | export function isReactNodeEmpty(node, skipArray) {
|
23 | if (skipArray === void 0) { skipArray = false; }
|
24 | return (node == null ||
|
25 | node === "" ||
|
26 | node === false ||
|
27 | (!skipArray &&
|
28 | Array.isArray(node) &&
|
29 | // only recurse one level through arrays, for performance
|
30 | (node.length === 0 || node.every(function (n) { return isReactNodeEmpty(n, true); }))));
|
31 | }
|
32 | /**
|
33 | * Returns true if children are a mappable children array
|
34 | *
|
35 | * @internal
|
36 | */
|
37 | export function isReactChildrenElementOrElements(children) {
|
38 | return !isReactNodeEmpty(children, true) && children !== true;
|
39 | }
|
40 | /**
|
41 | * Converts a React node to an element: non-empty string or number or
|
42 | * `React.Fragment` (React 16.3+) is wrapped in given tag name; empty strings
|
43 | * and booleans are discarded.
|
44 | */
|
45 | export function ensureElement(child, tagName) {
|
46 | if (tagName === void 0) { tagName = "span"; }
|
47 | if (child == null || typeof child === "boolean") {
|
48 | return undefined;
|
49 | }
|
50 | else if (typeof child === "string") {
|
51 | // cull whitespace strings
|
52 | return child.trim().length > 0 ? React.createElement(tagName, {}, child) : undefined;
|
53 | }
|
54 | else if (typeof child === "number" || typeof child.type === "symbol" || Array.isArray(child)) {
|
55 | // React.Fragment has a symbol type, ReactNodeArray extends from Array
|
56 | return React.createElement(tagName, {}, child);
|
57 | }
|
58 | else if (isReactElement(child)) {
|
59 | return child;
|
60 | }
|
61 | else {
|
62 | // child is inferred as {}
|
63 | return undefined;
|
64 | }
|
65 | }
|
66 | function isReactElement(child) {
|
67 | return (typeof child === "object" &&
|
68 | typeof child.type !== "undefined" &&
|
69 | typeof child.props !== "undefined");
|
70 | }
|
71 | /**
|
72 | * Returns true if the given JSX element matches the given component type.
|
73 | *
|
74 | * NOTE: This function only checks equality of `displayName` for performance and
|
75 | * to tolerate multiple minor versions of a component being included in one
|
76 | * application bundle.
|
77 | *
|
78 | * @param element JSX element in question
|
79 | * @param ComponentType desired component type of element
|
80 | */
|
81 | // eslint-disable-next-line @typescript-eslint/ban-types
|
82 | export function isElementOfType(element, ComponentType) {
|
83 | return (element != null &&
|
84 | element.type != null &&
|
85 | element.type.displayName != null &&
|
86 | element.type.displayName === ComponentType.displayName);
|
87 | }
|
88 | //# sourceMappingURL=reactUtils.js.map |
\ | No newline at end of file |