UNPKG

@roderickhsiao/react-i13n

Version:

[Experiment] React I13n provides a performant and scalable solution to application instrumentation.

124 lines (102 loc) 5.53 kB
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } /** * Copyright 2015 - Present, Yahoo Inc. * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. */ import React, { useContext, useMemo } from 'react'; import hoistNonReactStatics from 'hoist-non-react-statics'; import getDisplayName from '../utils/getDisplayName'; import warnAndPrintTrace from '../utils/warnAndPrintTrace'; import CoreComponent from '../components/core/CoreComponent'; import I13nContext from '../components/core/I13nContext'; import useI13nNode from '../hooks/useI13nNode'; var isFunctionalComponent = TargetComponent => typeof TargetComponent === 'function'; // && !(TargetComponent.prototype && TargetComponent.prototype.isReactComponent); /** * createI13nNode higher order function to create a Component with I13nNode functionality * @param {Object|String} Component the component you want to create a i13nNode * @param {Object} defaultProps default props * @param {Object} options * @param {String} options.displayName display name * @param {String} options.refToWrappedComponent ref name to wrapped component * @param {Boolean} options.skipUtilFunctionsByProps true to prevent i13n util function to be passed via props.i13n * @method createI13nNode */ function createI13nNode(Component, defaultProps) { var _options$displayName; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; if (!Component) { warnAndPrintTrace('You are passing a null component into createI13nNode'); return null; } var componentName = getDisplayName(Component); var componentIsFunction = isFunctionalComponent(Component); var { refToWrappedComponent } = options; var I13nComponentWrapper = props => { var { // i13n props bindClickEvent, follow, i13n, i13nModel, isLeafNode, scanLinks, shouldFollowLink, children } = props, restProps = _objectWithoutProperties(props, ["bindClickEvent", "follow", "i13n", "i13nModel", "isLeafNode", "scanLinks", "shouldFollowLink", "children"]); var { executeEvent, i13nInstance, i13nNode: parentI13nNode } = useContext(I13nContext); var i13nProps = _objectSpread({ bindClickEvent, componentIsFunction, follow, i13n, i13nModel, isLeafNode, scanLinks, shouldFollowLink }, refToWrappedComponent ? { ref: refToWrappedComponent // @TODO, won't work here, need to forwardRef } : {}); var node = /*#__PURE__*/React.createElement(CoreComponent, i13nProps, /*#__PURE__*/React.createElement(Component, restProps, children)); var { i13nNode } = useI13nNode({ parentI13nNode, i13nInstance, isLeafNode, i13nModel }); // overrides node/parent node var contextValue = useMemo(() => ({ executeEvent, i13nInstance, i13nNode, parentI13nNode }), [executeEvent, i13nInstance, i13nNode, parentI13nNode]); return /*#__PURE__*/React.createElement(I13nContext.Provider, { value: contextValue }, node); }; I13nComponentWrapper.displayName = (_options$displayName = options.displayName) !== null && _options$displayName !== void 0 ? _options$displayName : "I13n".concat(componentName); I13nComponentWrapper.defaultProps = _objectSpread({ i13nModel: undefined, isLeafNode: false, bindClickEvent: false, follow: false, scanLinks: undefined }, defaultProps); if (componentIsFunction) { return hoistNonReactStatics(I13nComponentWrapper, Component); } return I13nComponentWrapper; } export default createI13nNode;