@wojtekmaj/enzyme-adapter-react-17
Version:
JavaScript Testing utilities for React
893 lines (887 loc) • 111 kB
JavaScript
"use strict";
var _react = _interopRequireDefault(require("react"));
var _reactDom = _interopRequireDefault(require("react-dom"));
var _server = _interopRequireDefault(require("react-dom/server"));
var _shallow = _interopRequireDefault(require("react-test-renderer/shallow"));
var _testUtils = _interopRequireDefault(require("react-dom/test-utils"));
var _checkPropTypes2 = _interopRequireDefault(require("prop-types/checkPropTypes"));
var _has = _interopRequireDefault(require("has"));
var _reactIs = require("react-is");
var _enzyme = require("enzyme");
var _Utils = require("enzyme/build/Utils");
var _enzymeShallowEqual = _interopRequireDefault(require("enzyme-shallow-equal"));
var _enzymeAdapterUtils = require("@wojtekmaj/enzyme-adapter-utils");
var _findCurrentFiberUsingSlowPath = _interopRequireDefault(require("./findCurrentFiberUsingSlowPath"));
var _detectFiberTags = _interopRequireDefault(require("./detectFiberTags"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); 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 = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : 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; }
// Lazily populated if DOM is available.
var FiberTags = null;
function nodeAndSiblingsArray(nodeWithSibling) {
var array = [];
var node = nodeWithSibling;
while (node != null) {
array.push(node);
node = node.sibling;
}
return array;
}
function flatten(arr) {
var result = [];
var stack = [{
i: 0,
array: arr
}];
while (stack.length) {
var n = stack.pop();
while (n.i < n.array.length) {
var el = n.array[n.i];
n.i += 1;
if (Array.isArray(el)) {
stack.push(n);
stack.push({
i: 0,
array: el
});
break;
}
result.push(el);
}
}
return result;
}
function nodeTypeFromType(type) {
if (type === _reactIs.Portal) {
return 'portal';
}
return (0, _enzymeAdapterUtils.nodeTypeFromType)(type);
}
function isMemo(type) {
return (0, _enzymeAdapterUtils.compareNodeTypeOf)(type, _reactIs.Memo);
}
function isLazy(type) {
return (0, _enzymeAdapterUtils.compareNodeTypeOf)(type, _reactIs.Lazy);
}
function unmemoType(type) {
return isMemo(type) ? type.type : type;
}
function checkIsSuspenseAndCloneElement(el, _ref) {
var suspenseFallback = _ref.suspenseFallback;
if (!(0, _reactIs.isSuspense)(el)) {
return el;
}
var children = el.props.children;
if (suspenseFallback) {
var fallback = el.props.fallback;
children = replaceLazyWithFallback(children, fallback);
}
var FakeSuspenseWrapper = function FakeSuspenseWrapper(props) {
return /*#__PURE__*/_react["default"].createElement(el.type, _objectSpread(_objectSpread({}, el.props), props), children);
};
return /*#__PURE__*/_react["default"].createElement(FakeSuspenseWrapper, null, children);
}
function elementToTree(el) {
if (!(0, _reactIs.isPortal)(el)) {
return (0, _enzymeAdapterUtils.elementToTree)(el, elementToTree);
}
var children = el.children,
containerInfo = el.containerInfo;
var props = {
children: children,
containerInfo: containerInfo
};
return {
nodeType: 'portal',
type: _reactIs.Portal,
props: props,
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(el.key),
ref: el.ref || null,
instance: null,
rendered: elementToTree(el.children)
};
}
function _toTree(vnode) {
if (vnode == null) {
return null;
}
// TODO(lmr): I'm not really sure I understand whether or not this is what
// i should be doing, or if this is a hack for something i'm doing wrong
// somewhere else. Should talk to sebastian about this perhaps
var node = (0, _findCurrentFiberUsingSlowPath["default"])(vnode);
switch (node.tag) {
case FiberTags.HostRoot:
return childrenToTree(node.child);
case FiberTags.HostPortal:
{
var containerInfo = node.stateNode.containerInfo,
children = node.memoizedProps;
var props = {
containerInfo: containerInfo,
children: children
};
return {
nodeType: 'portal',
type: _reactIs.Portal,
props: props,
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: null,
rendered: childrenToTree(node.child)
};
}
case FiberTags.ClassComponent:
return {
nodeType: 'class',
type: node.type,
props: _objectSpread({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: node.stateNode,
rendered: childrenToTree(node.child)
};
case FiberTags.FunctionalComponent:
return {
nodeType: 'function',
type: node.type,
props: _objectSpread({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: null,
rendered: childrenToTree(node.child)
};
case FiberTags.MemoClass:
return {
nodeType: 'class',
type: node.elementType.type,
props: _objectSpread({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: node.stateNode,
rendered: childrenToTree(node.child.child)
};
case FiberTags.MemoSFC:
{
var renderedNodes = flatten(nodeAndSiblingsArray(node.child).map(_toTree));
if (renderedNodes.length === 0) {
renderedNodes = childrenToTree(node.memoizedProps.children);
}
return {
nodeType: 'function',
type: node.elementType,
props: _objectSpread({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: null,
rendered: renderedNodes
};
}
case FiberTags.HostComponent:
{
var _renderedNodes = flatten(nodeAndSiblingsArray(node.child).map(_toTree));
if (_renderedNodes.length === 0) {
_renderedNodes = [node.memoizedProps.children];
}
return {
nodeType: 'host',
type: node.type,
props: _objectSpread({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: node.stateNode,
rendered: _renderedNodes
};
}
case FiberTags.HostText:
return node.memoizedProps;
case FiberTags.Fragment:
case FiberTags.Mode:
case FiberTags.ContextProvider:
case FiberTags.ContextConsumer:
return childrenToTree(node.child);
case FiberTags.Profiler:
case FiberTags.ForwardRef:
{
return {
nodeType: 'function',
type: node.type,
props: _objectSpread({}, node.pendingProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: null,
rendered: childrenToTree(node.child)
};
}
case FiberTags.Suspense:
{
return {
nodeType: 'function',
type: _reactIs.Suspense,
props: _objectSpread({}, node.memoizedProps),
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(node.key),
ref: node.ref,
instance: null,
rendered: childrenToTree(node.child)
};
}
case FiberTags.Lazy:
return childrenToTree(node.child);
case FiberTags.OffscreenComponent:
return childrenToTree(node.child);
default:
throw new Error("Enzyme Internal Error: unknown node with tag ".concat(node.tag));
}
}
function childrenToTree(node) {
if (!node) {
return null;
}
var children = nodeAndSiblingsArray(node);
if (children.length === 0) {
return null;
}
if (children.length === 1) {
return _toTree(children[0]);
}
return flatten(children.map(_toTree));
}
function _nodeToHostNode(_node) {
// NOTE(lmr): node could be a function component
// which wont have an instance prop, but we can get the
// host node associated with its return value at that point.
// Although this breaks down if the return value is an array,
// as is possible with React 16.
var node = _node;
while (node && !Array.isArray(node) && node.instance === null) {
node = node.rendered;
}
// if the SFC returned null effectively, there is no host node.
if (!node) {
return null;
}
var mapper = function mapper(item) {
if (item && item.instance) return _reactDom["default"].findDOMNode(item.instance);
return null;
};
if (Array.isArray(node)) {
return node.map(mapper);
}
if (Array.isArray(node.rendered) && node.nodeType === 'class') {
return node.rendered.map(mapper);
}
return mapper(node);
}
function replaceLazyWithFallback(node, fallback) {
if (!node) {
return null;
}
if (Array.isArray(node)) {
return node.map(function (el) {
return replaceLazyWithFallback(el, fallback);
});
}
if (isLazy(node.type)) {
return fallback;
}
return _objectSpread(_objectSpread({}, node), {}, {
props: _objectSpread(_objectSpread({}, node.props), {}, {
children: replaceLazyWithFallback(node.props.children, fallback)
})
});
}
function wrapAct(fn) {
var returnVal;
_testUtils["default"].act(function () {
returnVal = fn();
});
return returnVal;
}
function getProviderDefaultValue(Provider) {
// React stores references to the Provider's defaultValue differently across versions.
if ('_defaultValue' in Provider._context) {
return Provider._context._defaultValue;
}
if ('_currentValue' in Provider._context) {
return Provider._context._currentValue;
}
throw new Error('Enzyme Internal Error: can’t figure out how to get Provider’s default value');
}
function makeFakeElement(type) {
return {
$$typeof: _reactIs.Element,
type: type
};
}
function isStateful(Component) {
return Component.prototype && (Component.prototype.isReactComponent || Array.isArray(Component.__reactAutoBindPairs)) // fallback for createClass components
;
}
var ReactSeventeenAdapter = /*#__PURE__*/function (_EnzymeAdapter) {
_inherits(ReactSeventeenAdapter, _EnzymeAdapter);
var _super = _createSuper(ReactSeventeenAdapter);
function ReactSeventeenAdapter() {
var _this;
_classCallCheck(this, ReactSeventeenAdapter);
_this = _super.call(this);
var lifecycles = _this.options.lifecycles;
_this.options = _objectSpread(_objectSpread({}, _this.options), {}, {
enableComponentDidUpdateOnSetState: true,
// TODO: remove, semver-major
legacyContextMode: 'parent',
lifecycles: _objectSpread(_objectSpread({}, lifecycles), {}, {
componentDidUpdate: {
onSetState: true
},
getDerivedStateFromProps: {
hasShouldComponentUpdateBug: false
},
getSnapshotBeforeUpdate: true,
setState: {
skipsComponentDidUpdateOnNullish: true
},
getChildContext: {
calledByRenderer: false
},
getDerivedStateFromError: true
})
});
return _this;
}
_createClass(ReactSeventeenAdapter, [{
key: "createMountRenderer",
value: function createMountRenderer(options) {
(0, _enzymeAdapterUtils.assertDomAvailable)('mount');
if ((0, _has["default"])(options, 'suspenseFallback')) {
throw new TypeError('`suspenseFallback` is not supported by the `mount` renderer');
}
if (FiberTags === null) {
// Requires DOM.
FiberTags = (0, _detectFiberTags["default"])();
}
var attachTo = options.attachTo,
hydrateIn = options.hydrateIn,
wrappingComponentProps = options.wrappingComponentProps;
var domNode = hydrateIn || attachTo || global.document.createElement('div');
var instance = null;
var adapter = this;
return {
render: function render(el, context, callback) {
return wrapAct(function () {
if (instance === null) {
var type = el.type,
props = el.props,
ref = el.ref;
var wrapperProps = _objectSpread({
Component: type,
props: props,
wrappingComponentProps: wrappingComponentProps,
context: context
}, ref && {
refProp: ref
});
var ReactWrapperComponent = (0, _enzymeAdapterUtils.createMountWrapper)(el, _objectSpread(_objectSpread({}, options), {}, {
adapter: adapter
}));
var wrappedEl = /*#__PURE__*/_react["default"].createElement(ReactWrapperComponent, wrapperProps);
instance = hydrateIn ? _reactDom["default"].hydrate(wrappedEl, domNode) : _reactDom["default"].render(wrappedEl, domNode);
if (typeof callback === 'function') {
callback();
}
} else {
instance.setChildProps(el.props, context, callback);
}
});
},
unmount: function unmount() {
wrapAct(function () {
_reactDom["default"].unmountComponentAtNode(domNode);
});
instance = null;
},
getNode: function getNode() {
if (!instance) {
return null;
}
return (0, _enzymeAdapterUtils.getNodeFromRootFinder)(adapter.isCustomComponent, _toTree(instance._reactInternals), options);
},
simulateError: function simulateError(nodeHierarchy, rootNode, error) {
var isErrorBoundary = function isErrorBoundary(_ref2) {
var elInstance = _ref2.instance,
type = _ref2.type;
if (type && type.getDerivedStateFromError) {
return true;
}
return elInstance && elInstance.componentDidCatch;
};
var _ref3 = nodeHierarchy.find(isErrorBoundary) || {},
catchingInstance = _ref3.instance,
catchingType = _ref3.type;
(0, _enzymeAdapterUtils.simulateError)(error, catchingInstance, nodeHierarchy, nodeTypeFromType, adapter.displayNameOfNode.bind(adapter), catchingType);
},
simulateEvent: function simulateEvent(node, event, mock) {
var mappedEvent = (0, _enzymeAdapterUtils.mapNativeEventNames)(event);
var eventFn = _testUtils["default"].Simulate[mappedEvent];
if (!eventFn) {
throw new TypeError("ReactWrapper::simulate() event '".concat(event, "' does not exist"));
}
wrapAct(function () {
eventFn(adapter.nodeToHostNode(node), mock);
});
},
batchedUpdates: function batchedUpdates(fn) {
return fn();
// return ReactDOM.unstable_batchedUpdates(fn);
},
getWrappingComponentRenderer: function getWrappingComponentRenderer() {
return _objectSpread(_objectSpread({}, this), (0, _enzymeAdapterUtils.getWrappingComponentMountRenderer)({
toTree: function toTree(inst) {
return _toTree(inst._reactInternals);
},
getMountWrapperInstance: function getMountWrapperInstance() {
return instance;
}
}));
},
wrapInvoke: wrapAct
};
}
}, {
key: "createShallowRenderer",
value: function createShallowRenderer() {
var _this2 = this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var adapter = this;
var renderer = new _shallow["default"]();
var suspenseFallback = options.suspenseFallback;
if (typeof suspenseFallback !== 'undefined' && typeof suspenseFallback !== 'boolean') {
throw TypeError('`options.suspenseFallback` should be boolean or undefined');
}
var isDOM = false;
var cachedNode = null;
var lastComponent = null;
var wrappedComponent = null;
var sentinel = {};
// wrap memo components with a PureComponent, or a class component with sCU
var wrapPureComponent = function wrapPureComponent(Component, compare) {
if (lastComponent !== Component) {
if (isStateful(Component)) {
wrappedComponent = /*#__PURE__*/function (_Component) {
_inherits(wrappedComponent, _Component);
var _super2 = _createSuper(wrappedComponent);
function wrappedComponent() {
_classCallCheck(this, wrappedComponent);
return _super2.apply(this, arguments);
}
return _createClass(wrappedComponent);
}(Component);
if (compare) {
wrappedComponent.prototype.shouldComponentUpdate = function (nextProps) {
return !compare(_this2.props, nextProps);
};
} else {
wrappedComponent.prototype.isPureReactComponent = true;
}
} else {
var memoized = sentinel;
var prevProps;
wrappedComponent = function wrappedComponentFn(props) {
var shouldUpdate = memoized === sentinel || (compare ? !compare(prevProps, props) : !(0, _enzymeShallowEqual["default"])(prevProps, props));
if (shouldUpdate) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
memoized = Component.apply(void 0, [_objectSpread(_objectSpread({}, Component.defaultProps), props)].concat(args));
prevProps = props;
}
return memoized;
};
}
Object.assign(wrappedComponent, Component, {
displayName: adapter.displayNameOfNode({
type: Component
})
});
lastComponent = Component;
}
return wrappedComponent;
};
// Wrap functional components on versions prior to 16.5,
// to avoid inadvertently pass a `this` instance to it.
var wrapFunctionalComponent = function wrapFunctionalComponent(Component) {
if ((0, _has["default"])(Component, 'defaultProps')) {
if (lastComponent !== Component) {
wrappedComponent = Object.assign(function (props) {
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
args[_key2 - 1] = arguments[_key2];
}
return Component.apply(void 0, [_objectSpread(_objectSpread({}, Component.defaultProps), props)].concat(args));
}, Component, {
displayName: adapter.displayNameOfNode({
type: Component
})
});
lastComponent = Component;
}
return wrappedComponent;
}
return Component;
};
var renderElement = function renderElement(elConfig) {
for (var _len3 = arguments.length, rest = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
rest[_key3 - 1] = arguments[_key3];
}
var renderedEl = renderer.render.apply(renderer, [elConfig].concat(rest));
var typeIsExisted = !!(renderedEl && renderedEl.type);
if (typeIsExisted) {
var clonedEl = checkIsSuspenseAndCloneElement(renderedEl, {
suspenseFallback: suspenseFallback
});
var elementIsChanged = clonedEl.type !== renderedEl.type;
if (elementIsChanged) {
return renderer.render.apply(renderer, [_objectSpread(_objectSpread({}, elConfig), {}, {
type: clonedEl.type
})].concat(rest));
}
}
return renderedEl;
};
return {
render: function render(el, unmaskedContext) {
var _ref4 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
_ref4$providerValues = _ref4.providerValues,
providerValues = _ref4$providerValues === void 0 ? new Map() : _ref4$providerValues;
cachedNode = el;
if (typeof el.type === 'string') {
isDOM = true;
} else if ((0, _reactIs.isContextProvider)(el)) {
providerValues.set(el.type, el.props.value);
var MockProvider = Object.assign(function (props) {
return props.children;
}, el.type);
return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
return renderElement(_objectSpread(_objectSpread({}, el), {}, {
type: MockProvider
}));
});
} else if ((0, _reactIs.isContextConsumer)(el)) {
var Provider = adapter.getProviderFromConsumer(el.type);
var value = providerValues.has(Provider) ? providerValues.get(Provider) : getProviderDefaultValue(Provider);
var MockConsumer = Object.assign(function (props) {
return props.children(value);
}, el.type);
return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
return renderElement(_objectSpread(_objectSpread({}, el), {}, {
type: MockConsumer
}));
});
} else {
isDOM = false;
var renderedEl = el;
if (isLazy(renderedEl)) {
throw TypeError('`React.lazy` is not supported by shallow rendering.');
}
renderedEl = checkIsSuspenseAndCloneElement(renderedEl, {
suspenseFallback: suspenseFallback
});
var _renderedEl = renderedEl,
Component = _renderedEl.type;
var context = (0, _enzymeAdapterUtils.getMaskedContext)(Component.contextTypes, unmaskedContext);
if (isMemo(el.type)) {
var _el$type = el.type,
InnerComp = _el$type.type,
compare = _el$type.compare;
return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
return renderElement(_objectSpread(_objectSpread({}, el), {}, {
type: wrapPureComponent(InnerComp, compare)
}), context);
});
}
var isComponentStateful = isStateful(Component);
if (!isComponentStateful && typeof Component === 'function') {
return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
return renderElement(_objectSpread(_objectSpread({}, renderedEl), {}, {
type: wrapFunctionalComponent(Component)
}), context);
});
}
if (isComponentStateful && renderer._instance && el.props === renderer._instance.props && !(0, _enzymeShallowEqual["default"])(context, renderer._instance.context)) {
var _spyMethod = (0, _enzymeAdapterUtils.spyMethod)(renderer, '_updateClassComponent', function (originalMethod) {
return function _updateClassComponent() {
var props = renderer._instance.props;
var clonedProps = _objectSpread({}, props);
renderer._instance.props = clonedProps;
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
args[_key4] = arguments[_key4];
}
var result = originalMethod.apply(renderer, args);
renderer._instance.props = props;
restore();
return result;
};
}),
restore = _spyMethod.restore;
}
return (0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
return renderElement(renderedEl, context);
});
}
},
unmount: function unmount() {
renderer.unmount();
},
getNode: function getNode() {
if (isDOM) {
return elementToTree(cachedNode);
}
var output = renderer.getRenderOutput();
return {
nodeType: nodeTypeFromType(cachedNode.type),
type: cachedNode.type,
props: cachedNode.props,
key: (0, _enzymeAdapterUtils.ensureKeyOrUndefined)(cachedNode.key),
ref: cachedNode.ref,
instance: renderer._instance,
rendered: Array.isArray(output) ? flatten(output).map(function (el) {
return elementToTree(el);
}) : elementToTree(output)
};
},
simulateError: function simulateError(nodeHierarchy, rootNode, error) {
(0, _enzymeAdapterUtils.simulateError)(error, renderer._instance, nodeHierarchy.concat(cachedNode), nodeTypeFromType, adapter.displayNameOfNode.bind(adapter), cachedNode.type);
},
simulateEvent: function simulateEvent(node, event) {
for (var _len5 = arguments.length, args = new Array(_len5 > 2 ? _len5 - 2 : 0), _key5 = 2; _key5 < _len5; _key5++) {
args[_key5 - 2] = arguments[_key5];
}
var handler = node.props[(0, _enzymeAdapterUtils.propFromEvent)(event)];
if (handler) {
(0, _enzymeAdapterUtils.withSetStateAllowed)(function () {
// TODO(lmr): create/use synthetic events
// TODO(lmr): emulate React's event propagation
// ReactDOM.unstable_batchedUpdates(() => {
handler.apply(void 0, args);
// });
});
}
},
batchedUpdates: function batchedUpdates(fn) {
return fn();
// return ReactDOM.unstable_batchedUpdates(fn);
},
checkPropTypes: function checkPropTypes(typeSpecs, values, location, hierarchy) {
return (0, _checkPropTypes2["default"])(typeSpecs, values, location, (0, _enzymeAdapterUtils.displayNameOfNode)(cachedNode), function () {
return (0, _enzymeAdapterUtils.getComponentStack)(hierarchy.concat([cachedNode]));
});
}
};
}
}, {
key: "createStringRenderer",
value: function createStringRenderer(options) {
if ((0, _has["default"])(options, 'suspenseFallback')) {
throw new TypeError('`suspenseFallback` should not be specified in options of string renderer');
}
return {
render: function render(el, context) {
if (options.context && (el.type.contextTypes || options.childContextTypes)) {
var childContextTypes = _objectSpread(_objectSpread({}, el.type.contextTypes || {}), options.childContextTypes);
var ContextWrapper = (0, _enzymeAdapterUtils.createRenderWrapper)(el, context, childContextTypes);
return _server["default"].renderToStaticMarkup( /*#__PURE__*/_react["default"].createElement(ContextWrapper));
}
return _server["default"].renderToStaticMarkup(el);
}
};
}
// Provided a bag of options, return an `EnzymeRenderer`. Some options can be implementation
// specific, like `attach` etc. for React, but not part of this interface explicitly.
}, {
key: "createRenderer",
value: function createRenderer(options) {
switch (options.mode) {
case _enzyme.EnzymeAdapter.MODES.MOUNT:
return this.createMountRenderer(options);
case _enzyme.EnzymeAdapter.MODES.SHALLOW:
return this.createShallowRenderer(options);
case _enzyme.EnzymeAdapter.MODES.STRING:
return this.createStringRenderer(options);
default:
throw new Error("Enzyme Internal Error: Unrecognized mode: ".concat(options.mode));
}
}
}, {
key: "wrap",
value: function wrap(element) {
return (0, _enzymeAdapterUtils.wrap)(element);
}
// converts an RSTNode to the corresponding JSX Pragma Element. This will be needed
// in order to implement the `Wrapper.mount()` and `Wrapper.shallow()` methods, but should
// be pretty straightforward for people to implement.
}, {
key: "nodeToElement",
value: function nodeToElement(node) {
if (!node || _typeof(node) !== 'object') return null;
var type = node.type;
return /*#__PURE__*/_react["default"].createElement(unmemoType(type), (0, _enzymeAdapterUtils.propsWithKeysAndRef)(node));
}
}, {
key: "matchesElementType",
value: function matchesElementType(node, matchingType) {
if (!node) {
return node;
}
var type = node.type;
return unmemoType(type) === unmemoType(matchingType);
}
}, {
key: "elementToNode",
value: function elementToNode(element) {
return elementToTree(element);
}
}, {
key: "nodeToHostNode",
value: function nodeToHostNode(node) {
var supportsArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var nodes = _nodeToHostNode(node);
if (Array.isArray(nodes) && !supportsArray) {
// get the first non-null node
return nodes.filter(Boolean)[0];
}
return nodes;
}
}, {
key: "displayNameOfNode",
value: function displayNameOfNode(node) {
if (!node) return null;
var type = node.type,
$$typeof = node.$$typeof;
var adapter = this;
var nodeType = type || $$typeof;
// newer node types may be undefined, so only test if the nodeType exists
if (nodeType) {
switch (nodeType) {
case _reactIs.ConcurrentMode || NaN:
return 'ConcurrentMode';
case _reactIs.Fragment || NaN:
return 'Fragment';
case _reactIs.StrictMode || NaN:
return 'StrictMode';
case _reactIs.Profiler || NaN:
return 'Profiler';
case _reactIs.Portal || NaN:
return 'Portal';
case _reactIs.Suspense || NaN:
return 'Suspense';
default:
}
}
var $$typeofType = type && type.$$typeof;
switch ($$typeofType) {
case _reactIs.ContextConsumer || NaN:
return 'ContextConsumer';
case _reactIs.ContextProvider || NaN:
return 'ContextProvider';
case _reactIs.Memo || NaN:
{
var nodeName = (0, _enzymeAdapterUtils.displayNameOfNode)(node);
return typeof nodeName === 'string' ? nodeName : "Memo(".concat(adapter.displayNameOfNode(type), ")");
}
case _reactIs.ForwardRef || NaN:
{
if (type.displayName) {
return type.displayName;
}
var name = adapter.displayNameOfNode({
type: type.render
});
return name ? "ForwardRef(".concat(name, ")") : 'ForwardRef';
}
case _reactIs.Lazy || NaN:
{
return 'lazy';
}
default:
return (0, _enzymeAdapterUtils.displayNameOfNode)(node);
}
}
}, {
key: "isValidElement",
value: function isValidElement(element) {
return (0, _reactIs.isElement)(element);
}
}, {
key: "isValidElementType",
value: function isValidElementType(object) {
return !!object && (0, _reactIs.isValidElementType)(object);
}
}, {
key: "isFragment",
value: function isFragment(fragment) {
return (0, _Utils.typeOfNode)(fragment) === _reactIs.Fragment;
}
}, {
key: "isCustomComponent",
value: function isCustomComponent(type) {
var fakeElement = makeFakeElement(type);
return !!type && (typeof type === 'function' || (0, _reactIs.isForwardRef)(fakeElement) || (0, _reactIs.isContextProvider)(fakeElement) || (0, _reactIs.isContextConsumer)(fakeElement) || (0, _reactIs.isSuspense)(fakeElement));
}
}, {
key: "isContextConsumer",
value: function isContextConsumer(type) {
return !!type && (0, _reactIs.isContextConsumer)(makeFakeElement(type));
}
}, {
key: "isCustomComponentElement",
value: function isCustomComponentElement(inst) {
if (!inst || !this.isValidElement(inst)) {
return false;
}
return this.isCustomComponent(inst.type);
}
}, {
key: "getProviderFromConsumer",
value: function getProviderFromConsumer(Consumer) {
// React stores references to the Provider on a Consumer differently across versions.
if (Consumer) {
var Provider;
if (Consumer._context) {
// check this first, to avoid a deprecation warning
Provider = Consumer._context.Provider;
} else if (Consumer.Provider) {
Provider = Consumer.Provider;
}
if (Provider) {
return Provider;
}
}
throw new Error('Enzyme Internal Error: can’t figure out how to get Provider from Consumer');
}
}, {
key: "createElement",
value: function createElement() {
return /*#__PURE__*/_react["default"].createElement.apply(_react["default"], arguments);
}
}, {
key: "wrapWithWrappingComponent",
value: function wrapWithWrappingComponent(node, options) {
return {
RootFinder: _enzymeAdapterUtils.RootFinder,
node: (0, _enzymeAdapterUtils.wrapWithWrappingComponent)(_react["default"].createElement, node, options)
};
}
}]);
return ReactSeventeenAdapter;
}(_enzyme.EnzymeAdapter);
module.exports = ReactSeventeenAdapter;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGaWJlclRhZ3MiLCJub2RlQW5kU2libGluZ3NBcnJheSIsIm5vZGVXaXRoU2libGluZyIsImFycmF5Iiwibm9kZSIsInB1c2giLCJzaWJsaW5nIiwiZmxhdHRlbiIsImFyciIsInJlc3VsdCIsInN0YWNrIiwiaSIsImxlbmd0aCIsIm4iLCJwb3AiLCJlbCIsIkFycmF5IiwiaXNBcnJheSIsIm5vZGVUeXBlRnJvbVR5cGUiLCJ0eXBlIiwiUG9ydGFsIiwidXRpbE5vZGVUeXBlRnJvbVR5cGUiLCJpc01lbW8iLCJjb21wYXJlTm9kZVR5cGVPZiIsIk1lbW8iLCJpc0xhenkiLCJMYXp5IiwidW5tZW1vVHlwZSIsImNoZWNrSXNTdXNwZW5zZUFuZENsb25lRWxlbWVudCIsInN1c3BlbnNlRmFsbGJhY2siLCJpc1N1c3BlbnNlIiwiY2hpbGRyZW4iLCJwcm9wcyIsImZhbGxiYWNrIiwicmVwbGFjZUxhenlXaXRoRmFsbGJhY2siLCJGYWtlU3VzcGVuc2VXcmFwcGVyIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50IiwiZWxlbWVudFRvVHJlZSIsImlzUG9ydGFsIiwidXRpbEVsZW1lbnRUb1RyZWUiLCJjb250YWluZXJJbmZvIiwibm9kZVR5cGUiLCJrZXkiLCJlbnN1cmVLZXlPclVuZGVmaW5lZCIsInJlZiIsImluc3RhbmNlIiwicmVuZGVyZWQiLCJ0b1RyZWUiLCJ2bm9kZSIsImZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoIiwidGFnIiwiSG9zdFJvb3QiLCJjaGlsZHJlblRvVHJlZSIsImNoaWxkIiwiSG9zdFBvcnRhbCIsInN0YXRlTm9kZSIsIm1lbW9pemVkUHJvcHMiLCJDbGFzc0NvbXBvbmVudCIsIkZ1bmN0aW9uYWxDb21wb25lbnQiLCJNZW1vQ2xhc3MiLCJlbGVtZW50VHlwZSIsIk1lbW9TRkMiLCJyZW5kZXJlZE5vZGVzIiwibWFwIiwiSG9zdENvbXBvbmVudCIsIkhvc3RUZXh0IiwiRnJhZ21lbnQiLCJNb2RlIiwiQ29udGV4dFByb3ZpZGVyIiwiQ29udGV4dENvbnN1bWVyIiwiUHJvZmlsZXIiLCJGb3J3YXJkUmVmIiwicGVuZGluZ1Byb3BzIiwiU3VzcGVuc2UiLCJPZmZzY3JlZW5Db21wb25lbnQiLCJFcnJvciIsIm5vZGVUb0hvc3ROb2RlIiwiX25vZGUiLCJtYXBwZXIiLCJpdGVtIiwiUmVhY3RET00iLCJmaW5kRE9NTm9kZSIsIndyYXBBY3QiLCJmbiIsInJldHVyblZhbCIsIlRlc3RVdGlscyIsImFjdCIsImdldFByb3ZpZGVyRGVmYXVsdFZhbHVlIiwiUHJvdmlkZXIiLCJfY29udGV4dCIsIl9kZWZhdWx0VmFsdWUiLCJfY3VycmVudFZhbHVlIiwibWFrZUZha2VFbGVtZW50IiwiJCR0eXBlb2YiLCJFbGVtZW50IiwiaXNTdGF0ZWZ1bCIsIkNvbXBvbmVudCIsInByb3RvdHlwZSIsImlzUmVhY3RDb21wb25lbnQiLCJfX3JlYWN0QXV0b0JpbmRQYWlycyIsIlJlYWN0U2V2ZW50ZWVuQWRhcHRlciIsImxpZmVjeWNsZXMiLCJvcHRpb25zIiwiZW5hYmxlQ29tcG9uZW50RGlkVXBkYXRlT25TZXRTdGF0ZSIsImxlZ2FjeUNvbnRleHRNb2RlIiwiY29tcG9uZW50RGlkVXBkYXRlIiwib25TZXRTdGF0ZSIsImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsImhhc1Nob3VsZENvbXBvbmVudFVwZGF0ZUJ1ZyIsImdldFNuYXBzaG90QmVmb3JlVXBkYXRlIiwic2V0U3RhdGUiLCJza2lwc0NvbXBvbmVudERpZFVwZGF0ZU9uTnVsbGlzaCIsImdldENoaWxkQ29udGV4dCIsImNhbGxlZEJ5UmVuZGVyZXIiLCJnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IiLCJhc3NlcnREb21BdmFpbGFibGUiLCJoYXMiLCJUeXBlRXJyb3IiLCJkZXRlY3RGaWJlclRhZ3MiLCJhdHRhY2hUbyIsImh5ZHJhdGVJbiIsIndyYXBwaW5nQ29tcG9uZW50UHJvcHMiLCJkb21Ob2RlIiwiZ2xvYmFsIiwiZG9jdW1lbnQiLCJhZGFwdGVyIiwicmVuZGVyIiwiY29udGV4dCIsImNhbGxiYWNrIiwid3JhcHBlclByb3BzIiwicmVmUHJvcCIsIlJlYWN0V3JhcHBlckNvbXBvbmVudCIsImNyZWF0ZU1vdW50V3JhcHBlciIsIndyYXBwZWRFbCIsImh5ZHJhdGUiLCJzZXRDaGlsZFByb3BzIiwidW5tb3VudCIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJnZXROb2RlIiwiZ2V0Tm9kZUZyb21Sb290RmluZGVyIiwiaXNDdXN0b21Db21wb25lbnQiLCJfcmVhY3RJbnRlcm5hbHMiLCJzaW11bGF0ZUVycm9yIiwibm9kZUhpZXJhcmNoeSIsInJvb3ROb2RlIiwiZXJyb3IiLCJpc0Vycm9yQm91bmRhcnkiLCJlbEluc3RhbmNlIiwiY29tcG9uZW50RGlkQ2F0Y2giLCJmaW5kIiwiY2F0Y2hpbmdJbnN0YW5jZSIsImNhdGNoaW5nVHlwZSIsImRpc3BsYXlOYW1lT2ZOb2RlIiwiYmluZCIsInNpbXVsYXRlRXZlbnQiLCJldmVudCIsIm1vY2siLCJtYXBwZWRFdmVudCIsIm1hcE5hdGl2ZUV2ZW50TmFtZXMiLCJldmVudEZuIiwiU2ltdWxhdGUiLCJiYXRjaGVkVXBkYXRlcyIsImdldFdyYXBwaW5nQ29tcG9uZW50UmVuZGVyZXIiLCJnZXRXcmFwcGluZ0NvbXBvbmVudE1vdW50UmVuZGVyZXIiLCJpbnN0IiwiZ2V0TW91bnRXcmFwcGVySW5zdGFuY2UiLCJ3cmFwSW52b2tlIiwicmVuZGVyZXIiLCJTaGFsbG93UmVuZGVyZXIiLCJpc0RPTSIsImNhY2hlZE5vZGUiLCJsYXN0Q29tcG9uZW50Iiwid3JhcHBlZENvbXBvbmVudCIsInNlbnRpbmVsIiwid3JhcFB1cmVDb21wb25lbnQiLCJjb21wYXJlIiwic2hvdWxkQ29tcG9uZW50VXBkYXRlIiwibmV4dFByb3BzIiwiaXNQdXJlUmVhY3RDb21wb25lbnQiLCJtZW1vaXplZCIsInByZXZQcm9wcyIsIndyYXBwZWRDb21wb25lbnRGbiIsInNob3VsZFVwZGF0ZSIsInNoYWxsb3dFcXVhbCIsImFyZ3MiLCJkZWZhdWx0UHJvcHMiLCJPYmplY3QiLCJhc3NpZ24iLCJkaXNwbGF5TmFtZSIsIndyYXBGdW5jdGlvbmFsQ29tcG9uZW50IiwicmVuZGVyRWxlbWVudCIsImVsQ29uZmlnIiwicmVzdCIsInJlbmRlcmVkRWwiLCJ0eXBlSXNFeGlzdGVkIiwiY2xvbmVkRWwiLCJlbGVtZW50SXNDaGFuZ2VkIiwidW5tYXNrZWRDb250ZXh0IiwicHJvdmlkZXJWYWx1ZXMiLCJNYXAiLCJpc0NvbnRleHRQcm92aWRlciIsInNldCIsInZhbHVlIiwiTW9ja1Byb3ZpZGVyIiwid2l0aFNldFN0YXRlQWxsb3dlZCIsImlzQ29udGV4dENvbnN1bWVyIiwiZ2V0UHJvdmlkZXJGcm9tQ29uc3VtZXIiLCJnZXQiLCJNb2NrQ29uc3VtZXIiLCJnZXRNYXNrZWRDb250ZXh0IiwiY29udGV4dFR5cGVzIiwiSW5uZXJDb21wIiwiaXNDb21wb25lbnRTdGF0ZWZ1bCIsIl9pbnN0YW5jZSIsInNweU1ldGhvZCIsIm9yaWdpbmFsTWV0aG9kIiwiX3VwZGF0ZUNsYXNzQ29tcG9uZW50IiwiY2xvbmVkUHJvcHMiLCJhcHBseSIsInJlc3RvcmUiLCJvdXRwdXQiLCJnZXRSZW5kZXJPdXRwdXQiLCJjb25jYXQiLCJoYW5kbGVyIiwicHJvcEZyb21FdmVudCIsImNoZWNrUHJvcFR5cGVzIiwidHlwZVNwZWNzIiwidmFsdWVzIiwibG9jYXRpb24iLCJoaWVyYXJjaHkiLCJnZXRDb21wb25lbnRTdGFjayIsImNoaWxkQ29udGV4dFR5cGVzIiwiQ29udGV4dFdyYXBwZXIiLCJjcmVhdGVSZW5kZXJXcmFwcGVyIiwiUmVhY3RET01TZXJ2ZXIiLCJyZW5kZXJUb1N0YXRpY01hcmt1cCIsIm1vZGUiLCJFbnp5bWVBZGFwdGVyIiwiTU9ERVMiLCJNT1VOVCIsImNyZWF0ZU1vdW50UmVuZGVyZXIiLCJTSEFMTE9XIiwiY3JlYXRlU2hhbGxvd1JlbmRlcmVyIiwiU1RSSU5HIiwiY3JlYXRlU3RyaW5nUmVuZGVyZXIiLCJlbGVtZW50Iiwid3JhcCIsInByb3BzV2l0aEtleXNBbmRSZWYiLCJtYXRjaGluZ1R5cGUiLCJzdXBwb3J0c0FycmF5Iiwibm9kZXMiLCJmaWx0ZXIiLCJCb29sZWFuIiwiQ29uY3VycmVudE1vZGUiLCJOYU4iLCJTdHJpY3RNb2RlIiwiJCR0eXBlb2ZUeXBlIiwibm9kZU5hbWUiLCJuYW1lIiwiaXNFbGVtZW50Iiwib2JqZWN0IiwiaXNWYWxpZEVsZW1lbnRUeXBlIiwiZnJhZ21lbnQiLCJ0eXBlT2ZOb2RlIiwiZmFrZUVsZW1lbnQiLCJpc0ZvcndhcmRSZWYiLCJpc1ZhbGlkRWxlbWVudCIsIkNvbnN1bWVyIiwiUm9vdEZpbmRlciIsIndyYXBXaXRoV3JhcHBpbmdDb21wb25lbnQiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL1JlYWN0U2V2ZW50ZWVuQWRhcHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IFJlYWN0RE9NU2VydmVyIGZyb20gJ3JlYWN0LWRvbS9zZXJ2ZXInO1xuaW1wb3J0IFNoYWxsb3dSZW5kZXJlciBmcm9tICdyZWFjdC10ZXN0LXJlbmRlcmVyL3NoYWxsb3cnO1xuaW1wb3J0IFRlc3RVdGlscyBmcm9tICdyZWFjdC1kb20vdGVzdC11dGlscyc7XG5pbXBvcnQgY2hlY2tQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcyc7XG5pbXBvcnQgaGFzIGZyb20gJ2hhcyc7XG5pbXBvcnQge1xuICBDb25jdXJyZW50TW9kZSxcbiAgQ29udGV4dENvbnN1bWVyLFxuICBDb250ZXh0UHJvdmlkZXIsXG4gIEVsZW1lbnQsXG4gIEZvcndhcmRSZWYsXG4gIEZyYWdtZW50LFxuICBpc0NvbnRleHRDb25zdW1lcixcbiAgaXNDb250ZXh0UHJvdmlkZXIsXG4gIGlzRWxlbWVudCxcbiAgaXNGb3J3YXJkUmVmLFxuICBpc1BvcnRhbCxcbiAgaXNTdXNwZW5zZSxcbiAgaXNWYWxpZEVsZW1lbnRUeXBlLFxuICBMYXp5LFxuICBNZW1vLFxuICBQb3J0YWwsXG4gIFByb2ZpbGVyLFxuICBTdHJpY3RNb2RlLFxuICBTdXNwZW5zZSxcbn0gZnJvbSAncmVhY3QtaXMnO1xuaW1wb3J0IHsgRW56eW1lQWRhcHRlciB9IGZyb20gJ2VuenltZSc7XG5pbXBvcnQgeyB0eXBlT2ZOb2RlIH0gZnJvbSAnZW56eW1lL2J1aWxkL1V0aWxzJztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnZW56eW1lLXNoYWxsb3ctZXF1YWwnO1xuaW1wb3J0IHtcbiAgZGlzcGxheU5hbWVPZk5vZGUsXG4gIGVsZW1lbnRUb1RyZWUgYXMgdXRpbEVsZW1lbnRUb1RyZWUsXG4gIG5vZGVUeXBlRnJvbVR5cGUgYXMgdXRpbE5vZGVUeXBlRnJvbVR5cGUsXG4gIG1hcE5hdGl2ZUV2ZW50TmFtZXMsXG4gIHByb3BGcm9tRXZlbnQsXG4gIGFzc2VydERvbUF2YWlsYWJsZSxcbiAgd2l0aFNldFN0YXRlQWxsb3dlZCxcbiAgY3JlYXRlUmVuZGVyV3JhcHBlcixcbiAgY3JlYXRlTW91bnRXcmFwcGVyLFxuICBwcm9wc1dpdGhLZXlzQW5kUmVmLFxuICBlbnN1cmVLZXlPclVuZGVmaW5lZCxcbiAgc2ltdWxhdGVFcnJvcixcbiAgd3JhcCxcbiAgZ2V0TWFza2VkQ29udGV4dCxcbiAgZ2V0Q29tcG9uZW50U3RhY2ssXG4gIFJvb3RGaW5kZXIsXG4gIGdldE5vZGVGcm9tUm9vdEZpbmRlcixcbiAgd3JhcFdpdGhXcmFwcGluZ0NvbXBvbmVudCxcbiAgZ2V0V3JhcHBpbmdDb21wb25lbnRNb3VudFJlbmRlcmVyLFxuICBjb21wYXJlTm9kZVR5cGVPZixcbiAgc3B5TWV0aG9kLFxufSBmcm9tICdAd29qdGVrbWFqL2VuenltZS1hZGFwdGVyLXV0aWxzJztcbmltcG9ydCBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aCBmcm9tICcuL2ZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoJztcbmltcG9ydCBkZXRlY3RGaWJlclRhZ3MgZnJvbSAnLi9kZXRlY3RGaWJlclRhZ3MnO1xuXG4vLyBMYXppbHkgcG9wdWxhdGVkIGlmIERPTSBpcyBhdmFpbGFibGUuXG5sZXQgRmliZXJUYWdzID0gbnVsbDtcblxuZnVuY3Rpb24gbm9kZUFuZFNpYmxpbmdzQXJyYXkobm9kZVdpdGhTaWJsaW5nKSB7XG4gIGNvbnN0IGFycmF5ID0gW107XG4gIGxldCBub2RlID0gbm9kZVdpdGhTaWJsaW5nO1xuICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgYXJyYXkucHVzaChub2RlKTtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlbihhcnIpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IHN0YWNrID0gW3sgaTogMCwgYXJyYXk6IGFyciB9XTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgIGNvbnN0IG4gPSBzdGFjay5wb3AoKTtcbiAgICB3aGlsZSAobi5pIDwgbi5hcnJheS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVsID0gbi5hcnJheVtuLmldO1xuICAgICAgbi5pICs9IDE7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbCkpIHtcbiAgICAgICAgc3RhY2sucHVzaChuKTtcbiAgICAgICAgc3RhY2sucHVzaCh7IGk6IDAsIGFycmF5OiBlbCB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChlbCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG5vZGVUeXBlRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PT0gUG9ydGFsKSB7XG4gICAgcmV0dXJuICdwb3J0YWwnO1xuICB9XG5cbiAgcmV0dXJuIHV0aWxOb2RlVHlwZUZyb21UeXBlKHR5cGUpO1xufVxuXG5mdW5jdGlvbiBpc01lbW8odHlwZSkge1xuICByZXR1cm4gY29tcGFyZU5vZGVUeXBlT2YodHlwZSwgTWVtbyk7XG59XG5cbmZ1bmN0aW9uIGlzTGF6eSh0eXBlKSB7XG4gIHJldHVybiBjb21wYXJlTm9kZVR5cGVPZih0eXBlLCBMYXp5KTtcbn1cblxuZnVuY3Rpb24gdW5tZW1vVHlwZSh0eXBlKSB7XG4gIHJldHVybiBpc01lbW8odHlwZSkgPyB0eXBlLnR5cGUgOiB0eXBlO1xufVxuXG5mdW5jdGlvbiBjaGVja0lzU3VzcGVuc2VBbmRDbG9uZUVsZW1lbnQoZWwsIHsgc3VzcGVuc2VGYWxsYmFjayB9KSB7XG4gIGlmICghaXNTdXNwZW5zZShlbCkpIHtcbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICBsZXQgeyBjaGlsZHJlbiB9ID0gZWwucHJvcHM7XG5cbiAgaWYgKHN1c3BlbnNlRmFsbGJhY2spIHtcbiAgICBjb25zdCB7IGZhbGxiYWNrIH0gPSBlbC5wcm9wcztcbiAgICBjaGlsZHJlbiA9IHJlcGxhY2VMYXp5V2l0aEZhbGxiYWNrKGNoaWxkcmVuLCBmYWxsYmFjayk7XG4gIH1cblxuICBjb25zdCBGYWtlU3VzcGVuc2VXcmFwcGVyID0gKHByb3BzKSA9PlxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoZWwudHlwZSwgeyAuLi5lbC5wcm9wcywgLi4ucHJvcHMgfSwgY2hpbGRyZW4pO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChGYWtlU3VzcGVuc2VXcmFwcGVyLCBudWxsLCBjaGlsZHJlbik7XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRUb1RyZWUoZWwpIHtcbiAgaWYgKCFpc1BvcnRhbChlbCkpIHtcbiAgICByZXR1cm4gdXRpbEVsZW1lbnRUb1RyZWUoZWwsIGVsZW1lbnRUb1RyZWUpO1xuICB9XG5cbiAgY29uc3QgeyBjaGlsZHJlbiwgY29udGFpbmVySW5mbyB9ID0gZWw7XG4gIGNvbnN0IHByb3BzID0geyBjaGlsZHJlbiwgY29udGFpbmVySW5mbyB9O1xuXG4gIHJldHVybiB7XG4gICAgbm9kZVR5cGU6ICdwb3J0YWwnLFxuICAgIHR5cGU6IFBvcnRhbCxcbiAgICBwcm9wcyxcbiAgICBrZXk6IGVuc3VyZUtleU9yVW5kZWZpbmVkKGVsLmtleSksXG4gICAgcmVmOiBlbC5yZWYgfHwgbnVsbCxcbiAgICBpbnN0YW5jZTogbnVsbCxcbiAgICByZW5kZXJlZDogZWxlbWVudFRvVHJlZShlbC5jaGlsZHJlbiksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRvVHJlZSh2bm9kZSkge1xuICBpZiAodm5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIFRPRE8obG1yKTogSSdtIG5vdCByZWFsbHkgc3VyZSBJIHVuZGVyc3RhbmQgd2hldGhlciBvciBub3QgdGhpcyBpcyB3aGF0XG4gIC8vIGkgc2hvdWxkIGJlIGRvaW5nLCBvciBpZiB0aGlzIGlzIGEgaGFjayBmb3Igc29tZXRoaW5nIGknbSBkb2luZyB3cm9uZ1xuICAvLyBzb21ld2hlcmUgZWxzZS4gU2hvdWxkIHRhbGsgdG8gc2ViYXN0aWFuIGFib3V0IHRoaXMgcGVyaGFwc1xuICBjb25zdCBub2RlID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgodm5vZGUpO1xuICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgY2FzZSBGaWJlclRhZ3MuSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gY2hpbGRyZW5Ub1RyZWUobm9kZS5jaGlsZCk7XG4gICAgY2FzZSBGaWJlclRhZ3MuSG9zdFBvcnRhbDoge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdGF0ZU5vZGU6IHsgY29udGFpbmVySW5mbyB9LFxuICAgICAgICBtZW1vaXplZFByb3BzOiBjaGlsZHJlbixcbiAgICAgIH0gPSBub2RlO1xuICAgICAgY29uc3QgcHJvcHMgPSB7IGNvbnRhaW5lckluZm8sIGNoaWxkcmVuIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZTogJ3BvcnRhbCcsXG4gICAgICAgIHR5cGU6IFBvcnRhbCxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGtleTogZW5zdXJlS2V5T3JVbmRlZmluZWQobm9kZS5rZXkpLFxuICAgICAgICByZWY6IG5vZGUucmVmLFxuICAgICAgICBpbnN0YW5jZTogbnVsbCxcbiAgICAgICAgcmVuZGVyZWQ6IGNoaWxkcmVuVG9UcmVlKG5vZGUuY2hpbGQpLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSBGaWJlclRhZ3MuQ2xhc3NDb21wb25lbnQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZTogJ2NsYXNzJyxcbiAgICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgICBwcm9wczogeyAuLi5ub2RlLm1lbW9pemVkUHJvcHMgfSxcbiAgICAgICAga2V5OiBlbnN1cmVLZXlPclVuZGVmaW5lZChub2RlLmtleSksXG4gICAgICAgIHJlZjogbm9kZS5yZWYsXG4gICAgICAgIGluc3RhbmNlOiBub2RlLnN0YXRlTm9kZSxcbiAgICAgICAgcmVuZGVyZWQ6IGNoaWxkcmVuVG9UcmVlKG5vZGUuY2hpbGQpLFxuICAgICAgfTtcbiAgICBjYXNlIEZpYmVyVGFncy5GdW5jdGlvbmFsQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZVR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgcHJvcHM6IHsgLi4ubm9kZS5tZW1vaXplZFByb3BzIH0sXG4gICAgICAgIGtleTogZW5zdXJlS2V5T3JVbmRlZmluZWQobm9kZS5rZXkpLFxuICAgICAgICByZWY6IG5vZGUucmVmLFxuICAgICAgICBpbnN0YW5jZTogbnVsbCxcbiAgICAgICAgcmVuZGVyZWQ6IGNoaWxkcmVuVG9UcmVlKG5vZGUuY2hpbGQpLFxuICAgICAgfTtcbiAgICBjYXNlIEZpYmVyVGFncy5NZW1vQ2xhc3M6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZTogJ2NsYXNzJyxcbiAgICAgICAgdHlwZTogbm9kZS5lbGVtZW50VHlwZS50eXBlLFxuICAgICAgICBwcm9wczogeyAuLi5ub2RlLm1lbW9pemVkUHJvcHMgfSxcbiAgICAgICAga2V5OiBlbnN1cmVLZXlPclVuZGVmaW5lZChub2RlLmtleSksXG4gICAgICAgIHJlZjogbm9kZS5yZWYsXG4gICAgICAgIGluc3RhbmNlOiBub2RlLnN0YX