@testing-library/react
Advanced tools
Comparing version 13.3.0 to 13.4.0
@@ -6,5 +6,2 @@ 'use strict'; | ||
var testUtils = require('react-dom/test-utils'); | ||
var _extends = require('@babel/runtime/helpers/extends'); | ||
var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator'); | ||
var _regeneratorRuntime = require('@babel/runtime/regenerator'); | ||
var React = require('react'); | ||
@@ -36,5 +33,2 @@ var ReactDOM = require('react-dom'); | ||
var testUtils__namespace = /*#__PURE__*/_interopNamespace(testUtils); | ||
var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends); | ||
var _asyncToGenerator__default = /*#__PURE__*/_interopDefaultLegacy(_asyncToGenerator); | ||
var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultLegacy(_regeneratorRuntime); | ||
var React__namespace = /*#__PURE__*/_interopNamespace(React); | ||
@@ -44,3 +38,3 @@ var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM); | ||
var domAct = testUtils__namespace.act; | ||
const domAct = testUtils__namespace.act; | ||
@@ -85,4 +79,4 @@ function getGlobalThis() { | ||
function withGlobalActEnvironment(actImplementation) { | ||
return function (callback) { | ||
var previousActEnvironment = getIsReactActEnvironment(); | ||
return callback => { | ||
const previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(true); | ||
@@ -92,5 +86,5 @@ | ||
// The return value of `act` is always a thenable. | ||
var callbackNeedsToBeAwaited = false; | ||
var actResult = actImplementation(function () { | ||
var result = callback(); | ||
let callbackNeedsToBeAwaited = false; | ||
const actResult = actImplementation(() => { | ||
const result = callback(); | ||
@@ -105,9 +99,9 @@ if (result !== null && typeof result === 'object' && typeof result.then === 'function') { | ||
if (callbackNeedsToBeAwaited) { | ||
var thenable = actResult; | ||
const thenable = actResult; | ||
return { | ||
then: function then(resolve, reject) { | ||
thenable.then(function (returnValue) { | ||
then: (resolve, reject) => { | ||
thenable.then(returnValue => { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
resolve(returnValue); | ||
}, function (error) { | ||
}, error => { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
@@ -131,3 +125,3 @@ reject(error); | ||
var act = withGlobalActEnvironment(domAct); | ||
const act = withGlobalActEnvironment(domAct); | ||
/* eslint no-console:0 */ | ||
@@ -139,9 +133,9 @@ | ||
var fireEvent = function fireEvent() { | ||
return dom.fireEvent.apply(void 0, arguments); | ||
const fireEvent = function () { | ||
return dom.fireEvent(...arguments); | ||
}; | ||
Object.keys(dom.fireEvent).forEach(function (key) { | ||
Object.keys(dom.fireEvent).forEach(key => { | ||
fireEvent[key] = function () { | ||
return dom.fireEvent[key].apply(dom.fireEvent, arguments); | ||
return dom.fireEvent[key](...arguments); | ||
}; | ||
@@ -152,31 +146,31 @@ }); // React event system tracks native mouseOver/mouseOut events for | ||
var mouseEnter = fireEvent.mouseEnter; | ||
var mouseLeave = fireEvent.mouseLeave; | ||
const mouseEnter = fireEvent.mouseEnter; | ||
const mouseLeave = fireEvent.mouseLeave; | ||
fireEvent.mouseEnter = function () { | ||
mouseEnter.apply(void 0, arguments); | ||
return fireEvent.mouseOver.apply(fireEvent, arguments); | ||
mouseEnter(...arguments); | ||
return fireEvent.mouseOver(...arguments); | ||
}; | ||
fireEvent.mouseLeave = function () { | ||
mouseLeave.apply(void 0, arguments); | ||
return fireEvent.mouseOut.apply(fireEvent, arguments); | ||
mouseLeave(...arguments); | ||
return fireEvent.mouseOut(...arguments); | ||
}; | ||
var pointerEnter = fireEvent.pointerEnter; | ||
var pointerLeave = fireEvent.pointerLeave; | ||
const pointerEnter = fireEvent.pointerEnter; | ||
const pointerLeave = fireEvent.pointerLeave; | ||
fireEvent.pointerEnter = function () { | ||
pointerEnter.apply(void 0, arguments); | ||
return fireEvent.pointerOver.apply(fireEvent, arguments); | ||
pointerEnter(...arguments); | ||
return fireEvent.pointerOver(...arguments); | ||
}; | ||
fireEvent.pointerLeave = function () { | ||
pointerLeave.apply(void 0, arguments); | ||
return fireEvent.pointerOut.apply(fireEvent, arguments); | ||
pointerLeave(...arguments); | ||
return fireEvent.pointerOut(...arguments); | ||
}; | ||
var select = fireEvent.select; | ||
const select = fireEvent.select; | ||
fireEvent.select = function (node, init) { | ||
fireEvent.select = (node, init) => { | ||
select(node, init); // React tracks this event only on focused inputs | ||
@@ -199,17 +193,17 @@ | ||
var blur = fireEvent.blur; | ||
var focus = fireEvent.focus; | ||
const blur = fireEvent.blur; | ||
const focus = fireEvent.focus; | ||
fireEvent.blur = function () { | ||
fireEvent.focusOut.apply(fireEvent, arguments); | ||
return blur.apply(void 0, arguments); | ||
fireEvent.focusOut(...arguments); | ||
return blur(...arguments); | ||
}; | ||
fireEvent.focus = function () { | ||
fireEvent.focusIn.apply(fireEvent, arguments); | ||
return focus.apply(void 0, arguments); | ||
fireEvent.focusIn(...arguments); | ||
return focus(...arguments); | ||
}; | ||
dom.configure({ | ||
unstable_advanceTimersWrapper: function unstable_advanceTimersWrapper(cb) { | ||
unstable_advanceTimersWrapper: cb => { | ||
return act(cb); | ||
@@ -220,40 +214,15 @@ }, | ||
// Let's just hope nobody else is using it. | ||
asyncWrapper: function () { | ||
var _asyncWrapper = _asyncToGenerator__default["default"]( /*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee(cb) { | ||
var previousActEnvironment; | ||
return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(false); | ||
_context.prev = 2; | ||
_context.next = 5; | ||
return cb(); | ||
asyncWrapper: async cb => { | ||
const previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(false); | ||
case 5: | ||
return _context.abrupt("return", _context.sent); | ||
case 6: | ||
_context.prev = 6; | ||
setIsReactActEnvironment(previousActEnvironment); | ||
return _context.finish(6); | ||
case 9: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, null, [[2,, 6, 9]]); | ||
})); | ||
function asyncWrapper(_x) { | ||
return _asyncWrapper.apply(this, arguments); | ||
try { | ||
return await cb(); | ||
} finally { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
} | ||
return asyncWrapper; | ||
}(), | ||
eventWrapper: function eventWrapper(cb) { | ||
var result; | ||
act(function () { | ||
}, | ||
eventWrapper: cb => { | ||
let result; | ||
act(() => { | ||
result = cb(); | ||
@@ -270,3 +239,3 @@ }); | ||
var mountedContainers = new Set(); | ||
const mountedContainers = new Set(); | ||
/** | ||
@@ -276,12 +245,14 @@ * @type Array<{container: import('react-dom').Container, root: ReturnType<typeof createConcurrentRoot>}> | ||
var mountedRootEntries = []; | ||
const mountedRootEntries = []; | ||
function createConcurrentRoot(container, _ref) { | ||
var _hydrate = _ref.hydrate, | ||
ui = _ref.ui, | ||
WrapperComponent = _ref.wrapper; | ||
var root; | ||
let { | ||
hydrate, | ||
ui, | ||
wrapper: WrapperComponent | ||
} = _ref; | ||
let root; | ||
if (_hydrate) { | ||
act(function () { | ||
if (hydrate) { | ||
act(() => { | ||
root = ReactDOMClient__namespace.hydrateRoot(container, WrapperComponent ? /*#__PURE__*/React__namespace.createElement(WrapperComponent, null, ui) : ui); | ||
@@ -294,5 +265,5 @@ }); | ||
return { | ||
hydrate: function hydrate() { | ||
hydrate() { | ||
/* istanbul ignore if */ | ||
if (!_hydrate) { | ||
if (!hydrate) { | ||
throw new Error('Attempted to hydrate a non-hydrateable root. This is a bug in `@testing-library/react`.'); | ||
@@ -302,8 +273,11 @@ } // Nothing to do since hydration happens when creating the root object. | ||
}, | ||
render: function render(element) { | ||
render(element) { | ||
root.render(element); | ||
}, | ||
unmount: function unmount() { | ||
unmount() { | ||
root.unmount(); | ||
} | ||
}; | ||
@@ -314,11 +288,14 @@ } | ||
return { | ||
hydrate: function hydrate(element) { | ||
hydrate(element) { | ||
ReactDOM__default["default"].hydrate(element, container); | ||
}, | ||
render: function render(element) { | ||
render(element) { | ||
ReactDOM__default["default"].render(element, container); | ||
}, | ||
unmount: function unmount() { | ||
unmount() { | ||
ReactDOM__default["default"].unmountComponentAtNode(container); | ||
} | ||
}; | ||
@@ -328,14 +305,14 @@ } | ||
function renderRoot(ui, _ref2) { | ||
var baseElement = _ref2.baseElement, | ||
container = _ref2.container, | ||
hydrate = _ref2.hydrate, | ||
queries = _ref2.queries, | ||
root = _ref2.root, | ||
WrapperComponent = _ref2.wrapper; | ||
let { | ||
baseElement, | ||
container, | ||
hydrate, | ||
queries, | ||
root, | ||
wrapper: WrapperComponent | ||
} = _ref2; | ||
var wrapUiIfNeeded = function wrapUiIfNeeded(innerElement) { | ||
return WrapperComponent ? /*#__PURE__*/React__namespace.createElement(WrapperComponent, null, innerElement) : innerElement; | ||
}; | ||
const wrapUiIfNeeded = innerElement => WrapperComponent ? /*#__PURE__*/React__namespace.createElement(WrapperComponent, null, innerElement) : innerElement; | ||
act(function () { | ||
act(() => { | ||
if (hydrate) { | ||
@@ -347,6 +324,6 @@ root.hydrate(wrapUiIfNeeded(ui), container); | ||
}); | ||
return _extends__default["default"]({ | ||
container: container, | ||
baseElement: baseElement, | ||
debug: function debug(el, maxLength, options) { | ||
return { | ||
container, | ||
baseElement, | ||
debug: function (el, maxLength, options) { | ||
if (el === void 0) { | ||
@@ -357,21 +334,19 @@ el = baseElement; | ||
return Array.isArray(el) ? // eslint-disable-next-line no-console | ||
el.forEach(function (e) { | ||
return console.log(dom.prettyDOM(e, maxLength, options)); | ||
}) : // eslint-disable-next-line no-console, | ||
el.forEach(e => console.log(dom.prettyDOM(e, maxLength, options))) : // eslint-disable-next-line no-console, | ||
console.log(dom.prettyDOM(el, maxLength, options)); | ||
}, | ||
unmount: function unmount() { | ||
act(function () { | ||
unmount: () => { | ||
act(() => { | ||
root.unmount(); | ||
}); | ||
}, | ||
rerender: function rerender(rerenderUi) { | ||
rerender: rerenderUi => { | ||
renderRoot(wrapUiIfNeeded(rerenderUi), { | ||
container: container, | ||
baseElement: baseElement, | ||
root: root | ||
container, | ||
baseElement, | ||
root | ||
}); // Intentionally do not return anything to avoid unnecessarily complicating the API. | ||
// folks can use all the same utilities we return in the first place that are bound to the container | ||
}, | ||
asFragment: function asFragment() { | ||
asFragment: () => { | ||
/* istanbul ignore else (old jsdom limitation) */ | ||
@@ -381,21 +356,20 @@ if (typeof document.createRange === 'function') { | ||
} else { | ||
var template = document.createElement('template'); | ||
const template = document.createElement('template'); | ||
template.innerHTML = container.innerHTML; | ||
return template.content; | ||
} | ||
} | ||
}, dom.getQueriesForElement(baseElement, queries)); | ||
}, | ||
...dom.getQueriesForElement(baseElement, queries) | ||
}; | ||
} | ||
function render(ui, _temp) { | ||
var _ref3 = _temp === void 0 ? {} : _temp, | ||
container = _ref3.container, | ||
_ref3$baseElement = _ref3.baseElement, | ||
baseElement = _ref3$baseElement === void 0 ? container : _ref3$baseElement, | ||
_ref3$legacyRoot = _ref3.legacyRoot, | ||
legacyRoot = _ref3$legacyRoot === void 0 ? false : _ref3$legacyRoot, | ||
queries = _ref3.queries, | ||
_ref3$hydrate = _ref3.hydrate, | ||
hydrate = _ref3$hydrate === void 0 ? false : _ref3$hydrate, | ||
wrapper = _ref3.wrapper; | ||
let { | ||
container, | ||
baseElement = container, | ||
legacyRoot = false, | ||
queries, | ||
hydrate = false, | ||
wrapper | ||
} = _temp === void 0 ? {} : _temp; | ||
@@ -412,14 +386,14 @@ if (!baseElement) { | ||
var root; // eslint-disable-next-line no-negated-condition -- we want to map the evolution of this over time. The root is created first. Only later is it re-used so we don't want to read the case that happens later first. | ||
let root; // eslint-disable-next-line no-negated-condition -- we want to map the evolution of this over time. The root is created first. Only later is it re-used so we don't want to read the case that happens later first. | ||
if (!mountedContainers.has(container)) { | ||
var createRootImpl = legacyRoot ? createLegacyRoot : createConcurrentRoot; | ||
const createRootImpl = legacyRoot ? createLegacyRoot : createConcurrentRoot; | ||
root = createRootImpl(container, { | ||
hydrate: hydrate, | ||
ui: ui, | ||
wrapper: wrapper | ||
hydrate, | ||
ui, | ||
wrapper | ||
}); | ||
mountedRootEntries.push({ | ||
container: container, | ||
root: root | ||
container, | ||
root | ||
}); // we'll add it to the mounted containers regardless of whether it's actually | ||
@@ -431,3 +405,3 @@ // added to document.body so the cleanup method works regardless of whether | ||
} else { | ||
mountedRootEntries.forEach(function (rootEntry) { | ||
mountedRootEntries.forEach(rootEntry => { | ||
// Else is unreachable since `mountedContainers` has the `container`. | ||
@@ -444,8 +418,8 @@ // Only reachable if one would accidentally add the container to `mountedContainers` but not the root to `mountedRootEntries` | ||
return renderRoot(ui, { | ||
container: container, | ||
baseElement: baseElement, | ||
queries: queries, | ||
hydrate: hydrate, | ||
wrapper: wrapper, | ||
root: root | ||
container, | ||
baseElement, | ||
queries, | ||
hydrate, | ||
wrapper, | ||
root | ||
}); | ||
@@ -455,6 +429,8 @@ } | ||
function cleanup() { | ||
mountedRootEntries.forEach(function (_ref4) { | ||
var root = _ref4.root, | ||
container = _ref4.container; | ||
act(function () { | ||
mountedRootEntries.forEach(_ref3 => { | ||
let { | ||
root, | ||
container | ||
} = _ref3; | ||
act(() => { | ||
root.unmount(); | ||
@@ -476,11 +452,14 @@ }); | ||
var _options = options, | ||
initialProps = _options.initialProps, | ||
wrapper = _options.wrapper; | ||
var result = /*#__PURE__*/React__namespace.createRef(); | ||
const { | ||
initialProps, | ||
...renderOptions | ||
} = options; | ||
const result = /*#__PURE__*/React__namespace.createRef(); | ||
function TestComponent(_ref5) { | ||
var renderCallbackProps = _ref5.renderCallbackProps; | ||
var pendingResult = renderCallback(renderCallbackProps); | ||
React__namespace.useEffect(function () { | ||
function TestComponent(_ref4) { | ||
let { | ||
renderCallbackProps | ||
} = _ref4; | ||
const pendingResult = renderCallback(renderCallbackProps); | ||
React__namespace.useEffect(() => { | ||
result.current = pendingResult; | ||
@@ -491,9 +470,8 @@ }); | ||
var _render = render( /*#__PURE__*/React__namespace.createElement(TestComponent, { | ||
const { | ||
rerender: baseRerender, | ||
unmount | ||
} = render( /*#__PURE__*/React__namespace.createElement(TestComponent, { | ||
renderCallbackProps: initialProps | ||
}), { | ||
wrapper: wrapper | ||
}), | ||
baseRerender = _render.rerender, | ||
unmount = _render.unmount; | ||
}), renderOptions); | ||
@@ -507,5 +485,5 @@ function rerender(rerenderCallbackProps) { | ||
return { | ||
result: result, | ||
rerender: rerender, | ||
unmount: unmount | ||
result, | ||
rerender, | ||
unmount | ||
}; | ||
@@ -526,3 +504,3 @@ } // just re-export everything from dom-testing-library | ||
if (typeof afterEach === 'function') { | ||
afterEach(function () { | ||
afterEach(() => { | ||
cleanup(); | ||
@@ -534,3 +512,3 @@ }); | ||
// eslint-disable-next-line no-undef | ||
teardown(function () { | ||
teardown(() => { | ||
cleanup(); | ||
@@ -545,8 +523,8 @@ }); | ||
// This matches the behavior of React < 18. | ||
var previousIsReactActEnvironment = getIsReactActEnvironment(); | ||
beforeAll(function () { | ||
let previousIsReactActEnvironment = getIsReactActEnvironment(); | ||
beforeAll(() => { | ||
previousIsReactActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(true); | ||
}); | ||
afterAll(function () { | ||
afterAll(() => { | ||
setIsReactActEnvironment(previousIsReactActEnvironment); | ||
@@ -553,0 +531,0 @@ }); |
import * as testUtils from 'react-dom/test-utils'; | ||
import _extends from '@babel/runtime/helpers/esm/extends'; | ||
import _asyncToGenerator from '@babel/runtime/helpers/esm/asyncToGenerator'; | ||
import _regeneratorRuntime from '@babel/runtime/regenerator'; | ||
import * as React from 'react'; | ||
@@ -11,3 +8,3 @@ import ReactDOM from 'react-dom'; | ||
var domAct = testUtils.act; | ||
const domAct = testUtils.act; | ||
@@ -52,4 +49,4 @@ function getGlobalThis() { | ||
function withGlobalActEnvironment(actImplementation) { | ||
return function (callback) { | ||
var previousActEnvironment = getIsReactActEnvironment(); | ||
return callback => { | ||
const previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(true); | ||
@@ -59,5 +56,5 @@ | ||
// The return value of `act` is always a thenable. | ||
var callbackNeedsToBeAwaited = false; | ||
var actResult = actImplementation(function () { | ||
var result = callback(); | ||
let callbackNeedsToBeAwaited = false; | ||
const actResult = actImplementation(() => { | ||
const result = callback(); | ||
@@ -72,9 +69,9 @@ if (result !== null && typeof result === 'object' && typeof result.then === 'function') { | ||
if (callbackNeedsToBeAwaited) { | ||
var thenable = actResult; | ||
const thenable = actResult; | ||
return { | ||
then: function then(resolve, reject) { | ||
thenable.then(function (returnValue) { | ||
then: (resolve, reject) => { | ||
thenable.then(returnValue => { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
resolve(returnValue); | ||
}, function (error) { | ||
}, error => { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
@@ -98,3 +95,3 @@ reject(error); | ||
var act = withGlobalActEnvironment(domAct); | ||
const act = withGlobalActEnvironment(domAct); | ||
/* eslint no-console:0 */ | ||
@@ -106,9 +103,9 @@ | ||
var fireEvent = function fireEvent() { | ||
return fireEvent$1.apply(void 0, arguments); | ||
const fireEvent = function () { | ||
return fireEvent$1(...arguments); | ||
}; | ||
Object.keys(fireEvent$1).forEach(function (key) { | ||
Object.keys(fireEvent$1).forEach(key => { | ||
fireEvent[key] = function () { | ||
return fireEvent$1[key].apply(fireEvent$1, arguments); | ||
return fireEvent$1[key](...arguments); | ||
}; | ||
@@ -119,31 +116,31 @@ }); // React event system tracks native mouseOver/mouseOut events for | ||
var mouseEnter = fireEvent.mouseEnter; | ||
var mouseLeave = fireEvent.mouseLeave; | ||
const mouseEnter = fireEvent.mouseEnter; | ||
const mouseLeave = fireEvent.mouseLeave; | ||
fireEvent.mouseEnter = function () { | ||
mouseEnter.apply(void 0, arguments); | ||
return fireEvent.mouseOver.apply(fireEvent, arguments); | ||
mouseEnter(...arguments); | ||
return fireEvent.mouseOver(...arguments); | ||
}; | ||
fireEvent.mouseLeave = function () { | ||
mouseLeave.apply(void 0, arguments); | ||
return fireEvent.mouseOut.apply(fireEvent, arguments); | ||
mouseLeave(...arguments); | ||
return fireEvent.mouseOut(...arguments); | ||
}; | ||
var pointerEnter = fireEvent.pointerEnter; | ||
var pointerLeave = fireEvent.pointerLeave; | ||
const pointerEnter = fireEvent.pointerEnter; | ||
const pointerLeave = fireEvent.pointerLeave; | ||
fireEvent.pointerEnter = function () { | ||
pointerEnter.apply(void 0, arguments); | ||
return fireEvent.pointerOver.apply(fireEvent, arguments); | ||
pointerEnter(...arguments); | ||
return fireEvent.pointerOver(...arguments); | ||
}; | ||
fireEvent.pointerLeave = function () { | ||
pointerLeave.apply(void 0, arguments); | ||
return fireEvent.pointerOut.apply(fireEvent, arguments); | ||
pointerLeave(...arguments); | ||
return fireEvent.pointerOut(...arguments); | ||
}; | ||
var select = fireEvent.select; | ||
const select = fireEvent.select; | ||
fireEvent.select = function (node, init) { | ||
fireEvent.select = (node, init) => { | ||
select(node, init); // React tracks this event only on focused inputs | ||
@@ -166,17 +163,17 @@ | ||
var blur = fireEvent.blur; | ||
var focus = fireEvent.focus; | ||
const blur = fireEvent.blur; | ||
const focus = fireEvent.focus; | ||
fireEvent.blur = function () { | ||
fireEvent.focusOut.apply(fireEvent, arguments); | ||
return blur.apply(void 0, arguments); | ||
fireEvent.focusOut(...arguments); | ||
return blur(...arguments); | ||
}; | ||
fireEvent.focus = function () { | ||
fireEvent.focusIn.apply(fireEvent, arguments); | ||
return focus.apply(void 0, arguments); | ||
fireEvent.focusIn(...arguments); | ||
return focus(...arguments); | ||
}; | ||
configure({ | ||
unstable_advanceTimersWrapper: function unstable_advanceTimersWrapper(cb) { | ||
unstable_advanceTimersWrapper: cb => { | ||
return act(cb); | ||
@@ -187,40 +184,15 @@ }, | ||
// Let's just hope nobody else is using it. | ||
asyncWrapper: function () { | ||
var _asyncWrapper = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(cb) { | ||
var previousActEnvironment; | ||
return _regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(false); | ||
_context.prev = 2; | ||
_context.next = 5; | ||
return cb(); | ||
asyncWrapper: async cb => { | ||
const previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(false); | ||
case 5: | ||
return _context.abrupt("return", _context.sent); | ||
case 6: | ||
_context.prev = 6; | ||
setIsReactActEnvironment(previousActEnvironment); | ||
return _context.finish(6); | ||
case 9: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, null, [[2,, 6, 9]]); | ||
})); | ||
function asyncWrapper(_x) { | ||
return _asyncWrapper.apply(this, arguments); | ||
try { | ||
return await cb(); | ||
} finally { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
} | ||
return asyncWrapper; | ||
}(), | ||
eventWrapper: function eventWrapper(cb) { | ||
var result; | ||
act(function () { | ||
}, | ||
eventWrapper: cb => { | ||
let result; | ||
act(() => { | ||
result = cb(); | ||
@@ -237,3 +209,3 @@ }); | ||
var mountedContainers = new Set(); | ||
const mountedContainers = new Set(); | ||
/** | ||
@@ -243,12 +215,14 @@ * @type Array<{container: import('react-dom').Container, root: ReturnType<typeof createConcurrentRoot>}> | ||
var mountedRootEntries = []; | ||
const mountedRootEntries = []; | ||
function createConcurrentRoot(container, _ref) { | ||
var _hydrate = _ref.hydrate, | ||
ui = _ref.ui, | ||
WrapperComponent = _ref.wrapper; | ||
var root; | ||
let { | ||
hydrate, | ||
ui, | ||
wrapper: WrapperComponent | ||
} = _ref; | ||
let root; | ||
if (_hydrate) { | ||
act(function () { | ||
if (hydrate) { | ||
act(() => { | ||
root = ReactDOMClient.hydrateRoot(container, WrapperComponent ? /*#__PURE__*/React.createElement(WrapperComponent, null, ui) : ui); | ||
@@ -261,5 +235,5 @@ }); | ||
return { | ||
hydrate: function hydrate() { | ||
hydrate() { | ||
/* istanbul ignore if */ | ||
if (!_hydrate) { | ||
if (!hydrate) { | ||
throw new Error('Attempted to hydrate a non-hydrateable root. This is a bug in `@testing-library/react`.'); | ||
@@ -269,8 +243,11 @@ } // Nothing to do since hydration happens when creating the root object. | ||
}, | ||
render: function render(element) { | ||
render(element) { | ||
root.render(element); | ||
}, | ||
unmount: function unmount() { | ||
unmount() { | ||
root.unmount(); | ||
} | ||
}; | ||
@@ -281,11 +258,14 @@ } | ||
return { | ||
hydrate: function hydrate(element) { | ||
hydrate(element) { | ||
ReactDOM.hydrate(element, container); | ||
}, | ||
render: function render(element) { | ||
render(element) { | ||
ReactDOM.render(element, container); | ||
}, | ||
unmount: function unmount() { | ||
unmount() { | ||
ReactDOM.unmountComponentAtNode(container); | ||
} | ||
}; | ||
@@ -295,14 +275,14 @@ } | ||
function renderRoot(ui, _ref2) { | ||
var baseElement = _ref2.baseElement, | ||
container = _ref2.container, | ||
hydrate = _ref2.hydrate, | ||
queries = _ref2.queries, | ||
root = _ref2.root, | ||
WrapperComponent = _ref2.wrapper; | ||
let { | ||
baseElement, | ||
container, | ||
hydrate, | ||
queries, | ||
root, | ||
wrapper: WrapperComponent | ||
} = _ref2; | ||
var wrapUiIfNeeded = function wrapUiIfNeeded(innerElement) { | ||
return WrapperComponent ? /*#__PURE__*/React.createElement(WrapperComponent, null, innerElement) : innerElement; | ||
}; | ||
const wrapUiIfNeeded = innerElement => WrapperComponent ? /*#__PURE__*/React.createElement(WrapperComponent, null, innerElement) : innerElement; | ||
act(function () { | ||
act(() => { | ||
if (hydrate) { | ||
@@ -314,6 +294,6 @@ root.hydrate(wrapUiIfNeeded(ui), container); | ||
}); | ||
return _extends({ | ||
container: container, | ||
baseElement: baseElement, | ||
debug: function debug(el, maxLength, options) { | ||
return { | ||
container, | ||
baseElement, | ||
debug: function (el, maxLength, options) { | ||
if (el === void 0) { | ||
@@ -324,21 +304,19 @@ el = baseElement; | ||
return Array.isArray(el) ? // eslint-disable-next-line no-console | ||
el.forEach(function (e) { | ||
return console.log(prettyDOM(e, maxLength, options)); | ||
}) : // eslint-disable-next-line no-console, | ||
el.forEach(e => console.log(prettyDOM(e, maxLength, options))) : // eslint-disable-next-line no-console, | ||
console.log(prettyDOM(el, maxLength, options)); | ||
}, | ||
unmount: function unmount() { | ||
act(function () { | ||
unmount: () => { | ||
act(() => { | ||
root.unmount(); | ||
}); | ||
}, | ||
rerender: function rerender(rerenderUi) { | ||
rerender: rerenderUi => { | ||
renderRoot(wrapUiIfNeeded(rerenderUi), { | ||
container: container, | ||
baseElement: baseElement, | ||
root: root | ||
container, | ||
baseElement, | ||
root | ||
}); // Intentionally do not return anything to avoid unnecessarily complicating the API. | ||
// folks can use all the same utilities we return in the first place that are bound to the container | ||
}, | ||
asFragment: function asFragment() { | ||
asFragment: () => { | ||
/* istanbul ignore else (old jsdom limitation) */ | ||
@@ -348,21 +326,20 @@ if (typeof document.createRange === 'function') { | ||
} else { | ||
var template = document.createElement('template'); | ||
const template = document.createElement('template'); | ||
template.innerHTML = container.innerHTML; | ||
return template.content; | ||
} | ||
} | ||
}, getQueriesForElement(baseElement, queries)); | ||
}, | ||
...getQueriesForElement(baseElement, queries) | ||
}; | ||
} | ||
function render(ui, _temp) { | ||
var _ref3 = _temp === void 0 ? {} : _temp, | ||
container = _ref3.container, | ||
_ref3$baseElement = _ref3.baseElement, | ||
baseElement = _ref3$baseElement === void 0 ? container : _ref3$baseElement, | ||
_ref3$legacyRoot = _ref3.legacyRoot, | ||
legacyRoot = _ref3$legacyRoot === void 0 ? false : _ref3$legacyRoot, | ||
queries = _ref3.queries, | ||
_ref3$hydrate = _ref3.hydrate, | ||
hydrate = _ref3$hydrate === void 0 ? false : _ref3$hydrate, | ||
wrapper = _ref3.wrapper; | ||
let { | ||
container, | ||
baseElement = container, | ||
legacyRoot = false, | ||
queries, | ||
hydrate = false, | ||
wrapper | ||
} = _temp === void 0 ? {} : _temp; | ||
@@ -379,14 +356,14 @@ if (!baseElement) { | ||
var root; // eslint-disable-next-line no-negated-condition -- we want to map the evolution of this over time. The root is created first. Only later is it re-used so we don't want to read the case that happens later first. | ||
let root; // eslint-disable-next-line no-negated-condition -- we want to map the evolution of this over time. The root is created first. Only later is it re-used so we don't want to read the case that happens later first. | ||
if (!mountedContainers.has(container)) { | ||
var createRootImpl = legacyRoot ? createLegacyRoot : createConcurrentRoot; | ||
const createRootImpl = legacyRoot ? createLegacyRoot : createConcurrentRoot; | ||
root = createRootImpl(container, { | ||
hydrate: hydrate, | ||
ui: ui, | ||
wrapper: wrapper | ||
hydrate, | ||
ui, | ||
wrapper | ||
}); | ||
mountedRootEntries.push({ | ||
container: container, | ||
root: root | ||
container, | ||
root | ||
}); // we'll add it to the mounted containers regardless of whether it's actually | ||
@@ -398,3 +375,3 @@ // added to document.body so the cleanup method works regardless of whether | ||
} else { | ||
mountedRootEntries.forEach(function (rootEntry) { | ||
mountedRootEntries.forEach(rootEntry => { | ||
// Else is unreachable since `mountedContainers` has the `container`. | ||
@@ -411,8 +388,8 @@ // Only reachable if one would accidentally add the container to `mountedContainers` but not the root to `mountedRootEntries` | ||
return renderRoot(ui, { | ||
container: container, | ||
baseElement: baseElement, | ||
queries: queries, | ||
hydrate: hydrate, | ||
wrapper: wrapper, | ||
root: root | ||
container, | ||
baseElement, | ||
queries, | ||
hydrate, | ||
wrapper, | ||
root | ||
}); | ||
@@ -422,6 +399,8 @@ } | ||
function cleanup() { | ||
mountedRootEntries.forEach(function (_ref4) { | ||
var root = _ref4.root, | ||
container = _ref4.container; | ||
act(function () { | ||
mountedRootEntries.forEach(_ref3 => { | ||
let { | ||
root, | ||
container | ||
} = _ref3; | ||
act(() => { | ||
root.unmount(); | ||
@@ -443,11 +422,14 @@ }); | ||
var _options = options, | ||
initialProps = _options.initialProps, | ||
wrapper = _options.wrapper; | ||
var result = /*#__PURE__*/React.createRef(); | ||
const { | ||
initialProps, | ||
...renderOptions | ||
} = options; | ||
const result = /*#__PURE__*/React.createRef(); | ||
function TestComponent(_ref5) { | ||
var renderCallbackProps = _ref5.renderCallbackProps; | ||
var pendingResult = renderCallback(renderCallbackProps); | ||
React.useEffect(function () { | ||
function TestComponent(_ref4) { | ||
let { | ||
renderCallbackProps | ||
} = _ref4; | ||
const pendingResult = renderCallback(renderCallbackProps); | ||
React.useEffect(() => { | ||
result.current = pendingResult; | ||
@@ -458,9 +440,8 @@ }); | ||
var _render = render( /*#__PURE__*/React.createElement(TestComponent, { | ||
const { | ||
rerender: baseRerender, | ||
unmount | ||
} = render( /*#__PURE__*/React.createElement(TestComponent, { | ||
renderCallbackProps: initialProps | ||
}), { | ||
wrapper: wrapper | ||
}), | ||
baseRerender = _render.rerender, | ||
unmount = _render.unmount; | ||
}), renderOptions); | ||
@@ -474,5 +455,5 @@ function rerender(rerenderCallbackProps) { | ||
return { | ||
result: result, | ||
rerender: rerender, | ||
unmount: unmount | ||
result, | ||
rerender, | ||
unmount | ||
}; | ||
@@ -493,3 +474,3 @@ } // just re-export everything from dom-testing-library | ||
if (typeof afterEach === 'function') { | ||
afterEach(function () { | ||
afterEach(() => { | ||
cleanup(); | ||
@@ -501,3 +482,3 @@ }); | ||
// eslint-disable-next-line no-undef | ||
teardown(function () { | ||
teardown(() => { | ||
cleanup(); | ||
@@ -512,8 +493,8 @@ }); | ||
// This matches the behavior of React < 18. | ||
var previousIsReactActEnvironment = getIsReactActEnvironment(); | ||
beforeAll(function () { | ||
let previousIsReactActEnvironment = getIsReactActEnvironment(); | ||
beforeAll(() => { | ||
previousIsReactActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(true); | ||
}); | ||
afterAll(function () { | ||
afterAll(() => { | ||
setIsReactActEnvironment(previousIsReactActEnvironment); | ||
@@ -520,0 +501,0 @@ }); |
@@ -5,5 +5,2 @@ 'use strict'; | ||
var _extends = require('@babel/runtime/helpers/extends'); | ||
var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator'); | ||
var _regeneratorRuntime = require('@babel/runtime/regenerator'); | ||
var React = require('react'); | ||
@@ -35,5 +32,2 @@ var ReactDOM = require('react-dom'); | ||
var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends); | ||
var _asyncToGenerator__default = /*#__PURE__*/_interopDefaultLegacy(_asyncToGenerator); | ||
var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultLegacy(_regeneratorRuntime); | ||
var React__namespace = /*#__PURE__*/_interopNamespace(React); | ||
@@ -44,3 +38,3 @@ var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM); | ||
var domAct = testUtils__namespace.act; | ||
const domAct = testUtils__namespace.act; | ||
@@ -85,4 +79,4 @@ function getGlobalThis() { | ||
function withGlobalActEnvironment(actImplementation) { | ||
return function (callback) { | ||
var previousActEnvironment = getIsReactActEnvironment(); | ||
return callback => { | ||
const previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(true); | ||
@@ -92,5 +86,5 @@ | ||
// The return value of `act` is always a thenable. | ||
var callbackNeedsToBeAwaited = false; | ||
var actResult = actImplementation(function () { | ||
var result = callback(); | ||
let callbackNeedsToBeAwaited = false; | ||
const actResult = actImplementation(() => { | ||
const result = callback(); | ||
@@ -105,9 +99,9 @@ if (result !== null && typeof result === 'object' && typeof result.then === 'function') { | ||
if (callbackNeedsToBeAwaited) { | ||
var thenable = actResult; | ||
const thenable = actResult; | ||
return { | ||
then: function then(resolve, reject) { | ||
thenable.then(function (returnValue) { | ||
then: (resolve, reject) => { | ||
thenable.then(returnValue => { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
resolve(returnValue); | ||
}, function (error) { | ||
}, error => { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
@@ -131,3 +125,3 @@ reject(error); | ||
var act = withGlobalActEnvironment(domAct); | ||
const act = withGlobalActEnvironment(domAct); | ||
/* eslint no-console:0 */ | ||
@@ -139,9 +133,9 @@ | ||
var fireEvent = function fireEvent() { | ||
return dom.fireEvent.apply(void 0, arguments); | ||
const fireEvent = function () { | ||
return dom.fireEvent(...arguments); | ||
}; | ||
Object.keys(dom.fireEvent).forEach(function (key) { | ||
Object.keys(dom.fireEvent).forEach(key => { | ||
fireEvent[key] = function () { | ||
return dom.fireEvent[key].apply(dom.fireEvent, arguments); | ||
return dom.fireEvent[key](...arguments); | ||
}; | ||
@@ -152,31 +146,31 @@ }); // React event system tracks native mouseOver/mouseOut events for | ||
var mouseEnter = fireEvent.mouseEnter; | ||
var mouseLeave = fireEvent.mouseLeave; | ||
const mouseEnter = fireEvent.mouseEnter; | ||
const mouseLeave = fireEvent.mouseLeave; | ||
fireEvent.mouseEnter = function () { | ||
mouseEnter.apply(void 0, arguments); | ||
return fireEvent.mouseOver.apply(fireEvent, arguments); | ||
mouseEnter(...arguments); | ||
return fireEvent.mouseOver(...arguments); | ||
}; | ||
fireEvent.mouseLeave = function () { | ||
mouseLeave.apply(void 0, arguments); | ||
return fireEvent.mouseOut.apply(fireEvent, arguments); | ||
mouseLeave(...arguments); | ||
return fireEvent.mouseOut(...arguments); | ||
}; | ||
var pointerEnter = fireEvent.pointerEnter; | ||
var pointerLeave = fireEvent.pointerLeave; | ||
const pointerEnter = fireEvent.pointerEnter; | ||
const pointerLeave = fireEvent.pointerLeave; | ||
fireEvent.pointerEnter = function () { | ||
pointerEnter.apply(void 0, arguments); | ||
return fireEvent.pointerOver.apply(fireEvent, arguments); | ||
pointerEnter(...arguments); | ||
return fireEvent.pointerOver(...arguments); | ||
}; | ||
fireEvent.pointerLeave = function () { | ||
pointerLeave.apply(void 0, arguments); | ||
return fireEvent.pointerOut.apply(fireEvent, arguments); | ||
pointerLeave(...arguments); | ||
return fireEvent.pointerOut(...arguments); | ||
}; | ||
var select = fireEvent.select; | ||
const select = fireEvent.select; | ||
fireEvent.select = function (node, init) { | ||
fireEvent.select = (node, init) => { | ||
select(node, init); // React tracks this event only on focused inputs | ||
@@ -199,17 +193,17 @@ | ||
var blur = fireEvent.blur; | ||
var focus = fireEvent.focus; | ||
const blur = fireEvent.blur; | ||
const focus = fireEvent.focus; | ||
fireEvent.blur = function () { | ||
fireEvent.focusOut.apply(fireEvent, arguments); | ||
return blur.apply(void 0, arguments); | ||
fireEvent.focusOut(...arguments); | ||
return blur(...arguments); | ||
}; | ||
fireEvent.focus = function () { | ||
fireEvent.focusIn.apply(fireEvent, arguments); | ||
return focus.apply(void 0, arguments); | ||
fireEvent.focusIn(...arguments); | ||
return focus(...arguments); | ||
}; | ||
dom.configure({ | ||
unstable_advanceTimersWrapper: function unstable_advanceTimersWrapper(cb) { | ||
unstable_advanceTimersWrapper: cb => { | ||
return act(cb); | ||
@@ -220,40 +214,15 @@ }, | ||
// Let's just hope nobody else is using it. | ||
asyncWrapper: function () { | ||
var _asyncWrapper = _asyncToGenerator__default["default"]( /*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee(cb) { | ||
var previousActEnvironment; | ||
return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(false); | ||
_context.prev = 2; | ||
_context.next = 5; | ||
return cb(); | ||
asyncWrapper: async cb => { | ||
const previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(false); | ||
case 5: | ||
return _context.abrupt("return", _context.sent); | ||
case 6: | ||
_context.prev = 6; | ||
setIsReactActEnvironment(previousActEnvironment); | ||
return _context.finish(6); | ||
case 9: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, null, [[2,, 6, 9]]); | ||
})); | ||
function asyncWrapper(_x) { | ||
return _asyncWrapper.apply(this, arguments); | ||
try { | ||
return await cb(); | ||
} finally { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
} | ||
return asyncWrapper; | ||
}(), | ||
eventWrapper: function eventWrapper(cb) { | ||
var result; | ||
act(function () { | ||
}, | ||
eventWrapper: cb => { | ||
let result; | ||
act(() => { | ||
result = cb(); | ||
@@ -270,3 +239,3 @@ }); | ||
var mountedContainers = new Set(); | ||
const mountedContainers = new Set(); | ||
/** | ||
@@ -276,12 +245,14 @@ * @type Array<{container: import('react-dom').Container, root: ReturnType<typeof createConcurrentRoot>}> | ||
var mountedRootEntries = []; | ||
const mountedRootEntries = []; | ||
function createConcurrentRoot(container, _ref) { | ||
var _hydrate = _ref.hydrate, | ||
ui = _ref.ui, | ||
WrapperComponent = _ref.wrapper; | ||
var root; | ||
let { | ||
hydrate, | ||
ui, | ||
wrapper: WrapperComponent | ||
} = _ref; | ||
let root; | ||
if (_hydrate) { | ||
act(function () { | ||
if (hydrate) { | ||
act(() => { | ||
root = ReactDOMClient__namespace.hydrateRoot(container, WrapperComponent ? /*#__PURE__*/React__namespace.createElement(WrapperComponent, null, ui) : ui); | ||
@@ -294,5 +265,5 @@ }); | ||
return { | ||
hydrate: function hydrate() { | ||
hydrate() { | ||
/* istanbul ignore if */ | ||
if (!_hydrate) { | ||
if (!hydrate) { | ||
throw new Error('Attempted to hydrate a non-hydrateable root. This is a bug in `@testing-library/react`.'); | ||
@@ -302,8 +273,11 @@ } // Nothing to do since hydration happens when creating the root object. | ||
}, | ||
render: function render(element) { | ||
render(element) { | ||
root.render(element); | ||
}, | ||
unmount: function unmount() { | ||
unmount() { | ||
root.unmount(); | ||
} | ||
}; | ||
@@ -314,11 +288,14 @@ } | ||
return { | ||
hydrate: function hydrate(element) { | ||
hydrate(element) { | ||
ReactDOM__default["default"].hydrate(element, container); | ||
}, | ||
render: function render(element) { | ||
render(element) { | ||
ReactDOM__default["default"].render(element, container); | ||
}, | ||
unmount: function unmount() { | ||
unmount() { | ||
ReactDOM__default["default"].unmountComponentAtNode(container); | ||
} | ||
}; | ||
@@ -328,14 +305,14 @@ } | ||
function renderRoot(ui, _ref2) { | ||
var baseElement = _ref2.baseElement, | ||
container = _ref2.container, | ||
hydrate = _ref2.hydrate, | ||
queries = _ref2.queries, | ||
root = _ref2.root, | ||
WrapperComponent = _ref2.wrapper; | ||
let { | ||
baseElement, | ||
container, | ||
hydrate, | ||
queries, | ||
root, | ||
wrapper: WrapperComponent | ||
} = _ref2; | ||
var wrapUiIfNeeded = function wrapUiIfNeeded(innerElement) { | ||
return WrapperComponent ? /*#__PURE__*/React__namespace.createElement(WrapperComponent, null, innerElement) : innerElement; | ||
}; | ||
const wrapUiIfNeeded = innerElement => WrapperComponent ? /*#__PURE__*/React__namespace.createElement(WrapperComponent, null, innerElement) : innerElement; | ||
act(function () { | ||
act(() => { | ||
if (hydrate) { | ||
@@ -347,6 +324,6 @@ root.hydrate(wrapUiIfNeeded(ui), container); | ||
}); | ||
return _extends__default["default"]({ | ||
container: container, | ||
baseElement: baseElement, | ||
debug: function debug(el, maxLength, options) { | ||
return { | ||
container, | ||
baseElement, | ||
debug: function (el, maxLength, options) { | ||
if (el === void 0) { | ||
@@ -357,21 +334,19 @@ el = baseElement; | ||
return Array.isArray(el) ? // eslint-disable-next-line no-console | ||
el.forEach(function (e) { | ||
return console.log(dom.prettyDOM(e, maxLength, options)); | ||
}) : // eslint-disable-next-line no-console, | ||
el.forEach(e => console.log(dom.prettyDOM(e, maxLength, options))) : // eslint-disable-next-line no-console, | ||
console.log(dom.prettyDOM(el, maxLength, options)); | ||
}, | ||
unmount: function unmount() { | ||
act(function () { | ||
unmount: () => { | ||
act(() => { | ||
root.unmount(); | ||
}); | ||
}, | ||
rerender: function rerender(rerenderUi) { | ||
rerender: rerenderUi => { | ||
renderRoot(wrapUiIfNeeded(rerenderUi), { | ||
container: container, | ||
baseElement: baseElement, | ||
root: root | ||
container, | ||
baseElement, | ||
root | ||
}); // Intentionally do not return anything to avoid unnecessarily complicating the API. | ||
// folks can use all the same utilities we return in the first place that are bound to the container | ||
}, | ||
asFragment: function asFragment() { | ||
asFragment: () => { | ||
/* istanbul ignore else (old jsdom limitation) */ | ||
@@ -381,21 +356,20 @@ if (typeof document.createRange === 'function') { | ||
} else { | ||
var template = document.createElement('template'); | ||
const template = document.createElement('template'); | ||
template.innerHTML = container.innerHTML; | ||
return template.content; | ||
} | ||
} | ||
}, dom.getQueriesForElement(baseElement, queries)); | ||
}, | ||
...dom.getQueriesForElement(baseElement, queries) | ||
}; | ||
} | ||
function render(ui, _temp) { | ||
var _ref3 = _temp === void 0 ? {} : _temp, | ||
container = _ref3.container, | ||
_ref3$baseElement = _ref3.baseElement, | ||
baseElement = _ref3$baseElement === void 0 ? container : _ref3$baseElement, | ||
_ref3$legacyRoot = _ref3.legacyRoot, | ||
legacyRoot = _ref3$legacyRoot === void 0 ? false : _ref3$legacyRoot, | ||
queries = _ref3.queries, | ||
_ref3$hydrate = _ref3.hydrate, | ||
hydrate = _ref3$hydrate === void 0 ? false : _ref3$hydrate, | ||
wrapper = _ref3.wrapper; | ||
let { | ||
container, | ||
baseElement = container, | ||
legacyRoot = false, | ||
queries, | ||
hydrate = false, | ||
wrapper | ||
} = _temp === void 0 ? {} : _temp; | ||
@@ -412,14 +386,14 @@ if (!baseElement) { | ||
var root; // eslint-disable-next-line no-negated-condition -- we want to map the evolution of this over time. The root is created first. Only later is it re-used so we don't want to read the case that happens later first. | ||
let root; // eslint-disable-next-line no-negated-condition -- we want to map the evolution of this over time. The root is created first. Only later is it re-used so we don't want to read the case that happens later first. | ||
if (!mountedContainers.has(container)) { | ||
var createRootImpl = legacyRoot ? createLegacyRoot : createConcurrentRoot; | ||
const createRootImpl = legacyRoot ? createLegacyRoot : createConcurrentRoot; | ||
root = createRootImpl(container, { | ||
hydrate: hydrate, | ||
ui: ui, | ||
wrapper: wrapper | ||
hydrate, | ||
ui, | ||
wrapper | ||
}); | ||
mountedRootEntries.push({ | ||
container: container, | ||
root: root | ||
container, | ||
root | ||
}); // we'll add it to the mounted containers regardless of whether it's actually | ||
@@ -431,3 +405,3 @@ // added to document.body so the cleanup method works regardless of whether | ||
} else { | ||
mountedRootEntries.forEach(function (rootEntry) { | ||
mountedRootEntries.forEach(rootEntry => { | ||
// Else is unreachable since `mountedContainers` has the `container`. | ||
@@ -444,8 +418,8 @@ // Only reachable if one would accidentally add the container to `mountedContainers` but not the root to `mountedRootEntries` | ||
return renderRoot(ui, { | ||
container: container, | ||
baseElement: baseElement, | ||
queries: queries, | ||
hydrate: hydrate, | ||
wrapper: wrapper, | ||
root: root | ||
container, | ||
baseElement, | ||
queries, | ||
hydrate, | ||
wrapper, | ||
root | ||
}); | ||
@@ -455,6 +429,8 @@ } | ||
function cleanup() { | ||
mountedRootEntries.forEach(function (_ref4) { | ||
var root = _ref4.root, | ||
container = _ref4.container; | ||
act(function () { | ||
mountedRootEntries.forEach(_ref3 => { | ||
let { | ||
root, | ||
container | ||
} = _ref3; | ||
act(() => { | ||
root.unmount(); | ||
@@ -476,11 +452,14 @@ }); | ||
var _options = options, | ||
initialProps = _options.initialProps, | ||
wrapper = _options.wrapper; | ||
var result = /*#__PURE__*/React__namespace.createRef(); | ||
const { | ||
initialProps, | ||
...renderOptions | ||
} = options; | ||
const result = /*#__PURE__*/React__namespace.createRef(); | ||
function TestComponent(_ref5) { | ||
var renderCallbackProps = _ref5.renderCallbackProps; | ||
var pendingResult = renderCallback(renderCallbackProps); | ||
React__namespace.useEffect(function () { | ||
function TestComponent(_ref4) { | ||
let { | ||
renderCallbackProps | ||
} = _ref4; | ||
const pendingResult = renderCallback(renderCallbackProps); | ||
React__namespace.useEffect(() => { | ||
result.current = pendingResult; | ||
@@ -491,9 +470,8 @@ }); | ||
var _render = render( /*#__PURE__*/React__namespace.createElement(TestComponent, { | ||
const { | ||
rerender: baseRerender, | ||
unmount | ||
} = render( /*#__PURE__*/React__namespace.createElement(TestComponent, { | ||
renderCallbackProps: initialProps | ||
}), { | ||
wrapper: wrapper | ||
}), | ||
baseRerender = _render.rerender, | ||
unmount = _render.unmount; | ||
}), renderOptions); | ||
@@ -507,5 +485,5 @@ function rerender(rerenderCallbackProps) { | ||
return { | ||
result: result, | ||
rerender: rerender, | ||
unmount: unmount | ||
result, | ||
rerender, | ||
unmount | ||
}; | ||
@@ -512,0 +490,0 @@ } // just re-export everything from dom-testing-library |
@@ -1,4 +0,1 @@ | ||
import _extends from '@babel/runtime/helpers/esm/extends'; | ||
import _asyncToGenerator from '@babel/runtime/helpers/esm/asyncToGenerator'; | ||
import _regeneratorRuntime from '@babel/runtime/regenerator'; | ||
import * as React from 'react'; | ||
@@ -11,3 +8,3 @@ import ReactDOM from 'react-dom'; | ||
var domAct = testUtils.act; | ||
const domAct = testUtils.act; | ||
@@ -52,4 +49,4 @@ function getGlobalThis() { | ||
function withGlobalActEnvironment(actImplementation) { | ||
return function (callback) { | ||
var previousActEnvironment = getIsReactActEnvironment(); | ||
return callback => { | ||
const previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(true); | ||
@@ -59,5 +56,5 @@ | ||
// The return value of `act` is always a thenable. | ||
var callbackNeedsToBeAwaited = false; | ||
var actResult = actImplementation(function () { | ||
var result = callback(); | ||
let callbackNeedsToBeAwaited = false; | ||
const actResult = actImplementation(() => { | ||
const result = callback(); | ||
@@ -72,9 +69,9 @@ if (result !== null && typeof result === 'object' && typeof result.then === 'function') { | ||
if (callbackNeedsToBeAwaited) { | ||
var thenable = actResult; | ||
const thenable = actResult; | ||
return { | ||
then: function then(resolve, reject) { | ||
thenable.then(function (returnValue) { | ||
then: (resolve, reject) => { | ||
thenable.then(returnValue => { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
resolve(returnValue); | ||
}, function (error) { | ||
}, error => { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
@@ -98,3 +95,3 @@ reject(error); | ||
var act = withGlobalActEnvironment(domAct); | ||
const act = withGlobalActEnvironment(domAct); | ||
/* eslint no-console:0 */ | ||
@@ -106,9 +103,9 @@ | ||
var fireEvent = function fireEvent() { | ||
return fireEvent$1.apply(void 0, arguments); | ||
const fireEvent = function () { | ||
return fireEvent$1(...arguments); | ||
}; | ||
Object.keys(fireEvent$1).forEach(function (key) { | ||
Object.keys(fireEvent$1).forEach(key => { | ||
fireEvent[key] = function () { | ||
return fireEvent$1[key].apply(fireEvent$1, arguments); | ||
return fireEvent$1[key](...arguments); | ||
}; | ||
@@ -119,31 +116,31 @@ }); // React event system tracks native mouseOver/mouseOut events for | ||
var mouseEnter = fireEvent.mouseEnter; | ||
var mouseLeave = fireEvent.mouseLeave; | ||
const mouseEnter = fireEvent.mouseEnter; | ||
const mouseLeave = fireEvent.mouseLeave; | ||
fireEvent.mouseEnter = function () { | ||
mouseEnter.apply(void 0, arguments); | ||
return fireEvent.mouseOver.apply(fireEvent, arguments); | ||
mouseEnter(...arguments); | ||
return fireEvent.mouseOver(...arguments); | ||
}; | ||
fireEvent.mouseLeave = function () { | ||
mouseLeave.apply(void 0, arguments); | ||
return fireEvent.mouseOut.apply(fireEvent, arguments); | ||
mouseLeave(...arguments); | ||
return fireEvent.mouseOut(...arguments); | ||
}; | ||
var pointerEnter = fireEvent.pointerEnter; | ||
var pointerLeave = fireEvent.pointerLeave; | ||
const pointerEnter = fireEvent.pointerEnter; | ||
const pointerLeave = fireEvent.pointerLeave; | ||
fireEvent.pointerEnter = function () { | ||
pointerEnter.apply(void 0, arguments); | ||
return fireEvent.pointerOver.apply(fireEvent, arguments); | ||
pointerEnter(...arguments); | ||
return fireEvent.pointerOver(...arguments); | ||
}; | ||
fireEvent.pointerLeave = function () { | ||
pointerLeave.apply(void 0, arguments); | ||
return fireEvent.pointerOut.apply(fireEvent, arguments); | ||
pointerLeave(...arguments); | ||
return fireEvent.pointerOut(...arguments); | ||
}; | ||
var select = fireEvent.select; | ||
const select = fireEvent.select; | ||
fireEvent.select = function (node, init) { | ||
fireEvent.select = (node, init) => { | ||
select(node, init); // React tracks this event only on focused inputs | ||
@@ -166,17 +163,17 @@ | ||
var blur = fireEvent.blur; | ||
var focus = fireEvent.focus; | ||
const blur = fireEvent.blur; | ||
const focus = fireEvent.focus; | ||
fireEvent.blur = function () { | ||
fireEvent.focusOut.apply(fireEvent, arguments); | ||
return blur.apply(void 0, arguments); | ||
fireEvent.focusOut(...arguments); | ||
return blur(...arguments); | ||
}; | ||
fireEvent.focus = function () { | ||
fireEvent.focusIn.apply(fireEvent, arguments); | ||
return focus.apply(void 0, arguments); | ||
fireEvent.focusIn(...arguments); | ||
return focus(...arguments); | ||
}; | ||
configure({ | ||
unstable_advanceTimersWrapper: function unstable_advanceTimersWrapper(cb) { | ||
unstable_advanceTimersWrapper: cb => { | ||
return act(cb); | ||
@@ -187,40 +184,15 @@ }, | ||
// Let's just hope nobody else is using it. | ||
asyncWrapper: function () { | ||
var _asyncWrapper = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(cb) { | ||
var previousActEnvironment; | ||
return _regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(false); | ||
_context.prev = 2; | ||
_context.next = 5; | ||
return cb(); | ||
asyncWrapper: async cb => { | ||
const previousActEnvironment = getIsReactActEnvironment(); | ||
setIsReactActEnvironment(false); | ||
case 5: | ||
return _context.abrupt("return", _context.sent); | ||
case 6: | ||
_context.prev = 6; | ||
setIsReactActEnvironment(previousActEnvironment); | ||
return _context.finish(6); | ||
case 9: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, null, [[2,, 6, 9]]); | ||
})); | ||
function asyncWrapper(_x) { | ||
return _asyncWrapper.apply(this, arguments); | ||
try { | ||
return await cb(); | ||
} finally { | ||
setIsReactActEnvironment(previousActEnvironment); | ||
} | ||
return asyncWrapper; | ||
}(), | ||
eventWrapper: function eventWrapper(cb) { | ||
var result; | ||
act(function () { | ||
}, | ||
eventWrapper: cb => { | ||
let result; | ||
act(() => { | ||
result = cb(); | ||
@@ -237,3 +209,3 @@ }); | ||
var mountedContainers = new Set(); | ||
const mountedContainers = new Set(); | ||
/** | ||
@@ -243,12 +215,14 @@ * @type Array<{container: import('react-dom').Container, root: ReturnType<typeof createConcurrentRoot>}> | ||
var mountedRootEntries = []; | ||
const mountedRootEntries = []; | ||
function createConcurrentRoot(container, _ref) { | ||
var _hydrate = _ref.hydrate, | ||
ui = _ref.ui, | ||
WrapperComponent = _ref.wrapper; | ||
var root; | ||
let { | ||
hydrate, | ||
ui, | ||
wrapper: WrapperComponent | ||
} = _ref; | ||
let root; | ||
if (_hydrate) { | ||
act(function () { | ||
if (hydrate) { | ||
act(() => { | ||
root = ReactDOMClient.hydrateRoot(container, WrapperComponent ? /*#__PURE__*/React.createElement(WrapperComponent, null, ui) : ui); | ||
@@ -261,5 +235,5 @@ }); | ||
return { | ||
hydrate: function hydrate() { | ||
hydrate() { | ||
/* istanbul ignore if */ | ||
if (!_hydrate) { | ||
if (!hydrate) { | ||
throw new Error('Attempted to hydrate a non-hydrateable root. This is a bug in `@testing-library/react`.'); | ||
@@ -269,8 +243,11 @@ } // Nothing to do since hydration happens when creating the root object. | ||
}, | ||
render: function render(element) { | ||
render(element) { | ||
root.render(element); | ||
}, | ||
unmount: function unmount() { | ||
unmount() { | ||
root.unmount(); | ||
} | ||
}; | ||
@@ -281,11 +258,14 @@ } | ||
return { | ||
hydrate: function hydrate(element) { | ||
hydrate(element) { | ||
ReactDOM.hydrate(element, container); | ||
}, | ||
render: function render(element) { | ||
render(element) { | ||
ReactDOM.render(element, container); | ||
}, | ||
unmount: function unmount() { | ||
unmount() { | ||
ReactDOM.unmountComponentAtNode(container); | ||
} | ||
}; | ||
@@ -295,14 +275,14 @@ } | ||
function renderRoot(ui, _ref2) { | ||
var baseElement = _ref2.baseElement, | ||
container = _ref2.container, | ||
hydrate = _ref2.hydrate, | ||
queries = _ref2.queries, | ||
root = _ref2.root, | ||
WrapperComponent = _ref2.wrapper; | ||
let { | ||
baseElement, | ||
container, | ||
hydrate, | ||
queries, | ||
root, | ||
wrapper: WrapperComponent | ||
} = _ref2; | ||
var wrapUiIfNeeded = function wrapUiIfNeeded(innerElement) { | ||
return WrapperComponent ? /*#__PURE__*/React.createElement(WrapperComponent, null, innerElement) : innerElement; | ||
}; | ||
const wrapUiIfNeeded = innerElement => WrapperComponent ? /*#__PURE__*/React.createElement(WrapperComponent, null, innerElement) : innerElement; | ||
act(function () { | ||
act(() => { | ||
if (hydrate) { | ||
@@ -314,6 +294,6 @@ root.hydrate(wrapUiIfNeeded(ui), container); | ||
}); | ||
return _extends({ | ||
container: container, | ||
baseElement: baseElement, | ||
debug: function debug(el, maxLength, options) { | ||
return { | ||
container, | ||
baseElement, | ||
debug: function (el, maxLength, options) { | ||
if (el === void 0) { | ||
@@ -324,21 +304,19 @@ el = baseElement; | ||
return Array.isArray(el) ? // eslint-disable-next-line no-console | ||
el.forEach(function (e) { | ||
return console.log(prettyDOM(e, maxLength, options)); | ||
}) : // eslint-disable-next-line no-console, | ||
el.forEach(e => console.log(prettyDOM(e, maxLength, options))) : // eslint-disable-next-line no-console, | ||
console.log(prettyDOM(el, maxLength, options)); | ||
}, | ||
unmount: function unmount() { | ||
act(function () { | ||
unmount: () => { | ||
act(() => { | ||
root.unmount(); | ||
}); | ||
}, | ||
rerender: function rerender(rerenderUi) { | ||
rerender: rerenderUi => { | ||
renderRoot(wrapUiIfNeeded(rerenderUi), { | ||
container: container, | ||
baseElement: baseElement, | ||
root: root | ||
container, | ||
baseElement, | ||
root | ||
}); // Intentionally do not return anything to avoid unnecessarily complicating the API. | ||
// folks can use all the same utilities we return in the first place that are bound to the container | ||
}, | ||
asFragment: function asFragment() { | ||
asFragment: () => { | ||
/* istanbul ignore else (old jsdom limitation) */ | ||
@@ -348,21 +326,20 @@ if (typeof document.createRange === 'function') { | ||
} else { | ||
var template = document.createElement('template'); | ||
const template = document.createElement('template'); | ||
template.innerHTML = container.innerHTML; | ||
return template.content; | ||
} | ||
} | ||
}, getQueriesForElement(baseElement, queries)); | ||
}, | ||
...getQueriesForElement(baseElement, queries) | ||
}; | ||
} | ||
function render(ui, _temp) { | ||
var _ref3 = _temp === void 0 ? {} : _temp, | ||
container = _ref3.container, | ||
_ref3$baseElement = _ref3.baseElement, | ||
baseElement = _ref3$baseElement === void 0 ? container : _ref3$baseElement, | ||
_ref3$legacyRoot = _ref3.legacyRoot, | ||
legacyRoot = _ref3$legacyRoot === void 0 ? false : _ref3$legacyRoot, | ||
queries = _ref3.queries, | ||
_ref3$hydrate = _ref3.hydrate, | ||
hydrate = _ref3$hydrate === void 0 ? false : _ref3$hydrate, | ||
wrapper = _ref3.wrapper; | ||
let { | ||
container, | ||
baseElement = container, | ||
legacyRoot = false, | ||
queries, | ||
hydrate = false, | ||
wrapper | ||
} = _temp === void 0 ? {} : _temp; | ||
@@ -379,14 +356,14 @@ if (!baseElement) { | ||
var root; // eslint-disable-next-line no-negated-condition -- we want to map the evolution of this over time. The root is created first. Only later is it re-used so we don't want to read the case that happens later first. | ||
let root; // eslint-disable-next-line no-negated-condition -- we want to map the evolution of this over time. The root is created first. Only later is it re-used so we don't want to read the case that happens later first. | ||
if (!mountedContainers.has(container)) { | ||
var createRootImpl = legacyRoot ? createLegacyRoot : createConcurrentRoot; | ||
const createRootImpl = legacyRoot ? createLegacyRoot : createConcurrentRoot; | ||
root = createRootImpl(container, { | ||
hydrate: hydrate, | ||
ui: ui, | ||
wrapper: wrapper | ||
hydrate, | ||
ui, | ||
wrapper | ||
}); | ||
mountedRootEntries.push({ | ||
container: container, | ||
root: root | ||
container, | ||
root | ||
}); // we'll add it to the mounted containers regardless of whether it's actually | ||
@@ -398,3 +375,3 @@ // added to document.body so the cleanup method works regardless of whether | ||
} else { | ||
mountedRootEntries.forEach(function (rootEntry) { | ||
mountedRootEntries.forEach(rootEntry => { | ||
// Else is unreachable since `mountedContainers` has the `container`. | ||
@@ -411,8 +388,8 @@ // Only reachable if one would accidentally add the container to `mountedContainers` but not the root to `mountedRootEntries` | ||
return renderRoot(ui, { | ||
container: container, | ||
baseElement: baseElement, | ||
queries: queries, | ||
hydrate: hydrate, | ||
wrapper: wrapper, | ||
root: root | ||
container, | ||
baseElement, | ||
queries, | ||
hydrate, | ||
wrapper, | ||
root | ||
}); | ||
@@ -422,6 +399,8 @@ } | ||
function cleanup() { | ||
mountedRootEntries.forEach(function (_ref4) { | ||
var root = _ref4.root, | ||
container = _ref4.container; | ||
act(function () { | ||
mountedRootEntries.forEach(_ref3 => { | ||
let { | ||
root, | ||
container | ||
} = _ref3; | ||
act(() => { | ||
root.unmount(); | ||
@@ -443,11 +422,14 @@ }); | ||
var _options = options, | ||
initialProps = _options.initialProps, | ||
wrapper = _options.wrapper; | ||
var result = /*#__PURE__*/React.createRef(); | ||
const { | ||
initialProps, | ||
...renderOptions | ||
} = options; | ||
const result = /*#__PURE__*/React.createRef(); | ||
function TestComponent(_ref5) { | ||
var renderCallbackProps = _ref5.renderCallbackProps; | ||
var pendingResult = renderCallback(renderCallbackProps); | ||
React.useEffect(function () { | ||
function TestComponent(_ref4) { | ||
let { | ||
renderCallbackProps | ||
} = _ref4; | ||
const pendingResult = renderCallback(renderCallbackProps); | ||
React.useEffect(() => { | ||
result.current = pendingResult; | ||
@@ -458,9 +440,8 @@ }); | ||
var _render = render( /*#__PURE__*/React.createElement(TestComponent, { | ||
const { | ||
rerender: baseRerender, | ||
unmount | ||
} = render( /*#__PURE__*/React.createElement(TestComponent, { | ||
renderCallbackProps: initialProps | ||
}), { | ||
wrapper: wrapper | ||
}), | ||
baseRerender = _render.rerender, | ||
unmount = _render.unmount; | ||
}), renderOptions); | ||
@@ -474,5 +455,5 @@ function rerender(rerenderCallbackProps) { | ||
return { | ||
result: result, | ||
rerender: rerender, | ||
unmount: unmount | ||
result, | ||
rerender, | ||
unmount | ||
}; | ||
@@ -479,0 +460,0 @@ } // just re-export everything from dom-testing-library |
@@ -276,3 +276,3 @@ "use strict"; | ||
initialProps, | ||
wrapper | ||
...renderOptions | ||
} = options; | ||
@@ -296,5 +296,3 @@ const result = /*#__PURE__*/React.createRef(); | ||
renderCallbackProps: initialProps | ||
}), { | ||
wrapper | ||
}); | ||
}), renderOptions); | ||
@@ -301,0 +299,0 @@ function rerender(rerenderCallbackProps) { |
{ | ||
"name": "@testing-library/react", | ||
"version": "13.3.0", | ||
"version": "13.4.0", | ||
"description": "Simple and complete React DOM testing utilities that encourage good testing practices.", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
@@ -123,3 +123,8 @@ // TypeScript Version: 3.8 | ||
export interface RenderHookOptions<Props> { | ||
export interface RenderHookOptions< | ||
Props, | ||
Q extends Queries = typeof queries, | ||
Container extends Element | DocumentFragment = HTMLElement, | ||
BaseElement extends Element | DocumentFragment = Container, | ||
> extends RenderOptions<Q, Container, BaseElement> { | ||
/** | ||
@@ -130,9 +135,2 @@ * The argument passed to the renderHook callback. Can be useful if you plan | ||
initialProps?: Props | ||
/** | ||
* Pass a React Component as the wrapper option to have it rendered around the inner element. This is most useful for creating | ||
* reusable custom render functions for common data providers. See setup for examples. | ||
* | ||
* @see https://testing-library.com/docs/react-testing-library/api/#wrapper | ||
*/ | ||
wrapper?: React.JSXElementConstructor<{children: React.ReactElement}> | ||
} | ||
@@ -144,5 +142,11 @@ | ||
*/ | ||
export function renderHook<Result, Props>( | ||
export function renderHook< | ||
Result, | ||
Props, | ||
Q extends Queries = typeof queries, | ||
Container extends Element | DocumentFragment = HTMLElement, | ||
BaseElement extends Element | DocumentFragment = Container, | ||
>( | ||
render: (initialProps: Props) => Result, | ||
options?: RenderHookOptions<Props>, | ||
options?: RenderHookOptions<Props, Q, Container, BaseElement>, | ||
): RenderHookResult<Result, Props> | ||
@@ -149,0 +153,0 @@ |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses eval() which is a dangerous function. This prevents the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
674
8
4016439
26521
6