@testing-library/react-native 14.0.0-rc.2 → 14.0.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"fire-event.js","names":["_act","require","_eventBuilder","_eventHandler","_componentTree","_hostComponentNames","_pointerEvents","_textInput","_nativeState","isTouchResponder","instance","Boolean","props","onStartShouldSetResponder","isHostTextInput","eventsAffectedByPointerEventsProp","Set","textInputEventsIgnoringEditableProp","isEventEnabled","eventName","nearestTouchResponder","isEditableTextInput","has","isPointerEventEnabled","touchStart","touchMove","onMoveShouldSetResponder","undefined","findEventHandler","touchResponder","handler","getEventHandlerFromProps","loose","findEventHandlerFromFiber","unstable_fiber","parent","fiber","memoizedProps","return","type","fireEvent","data","isInstanceMounted","setNativeStateIfNeeded","returnValue","act","changeText","text","press","eventProps","event","buildTouchEvent","mergeEventProps","scroll","buildScrollEvent","scrollEventNames","value","nativeState","valueForInstance","set","isHostScrollView","contentOffset","tryGetContentOffset","contentOffsetForInstance","nativeEvent","x","y","Number","isFinite","target","source","key","Object","keys","sourceValue","targetValue","Array","isArray"],"sources":["../src/fire-event.ts"],"sourcesContent":["import type {\n PressableProps,\n ScrollViewProps,\n TextInputProps,\n TextProps,\n ViewProps,\n} from 'react-native';\nimport type { Fiber, TestInstance } from 'test-renderer';\n\nimport { act } from './act';\nimport { buildScrollEvent, buildTouchEvent } from './event-builder';\nimport type { EventHandler } from './event-handler';\nimport { getEventHandlerFromProps } from './event-handler';\nimport { isInstanceMounted } from './helpers/component-tree';\nimport { isHostScrollView, isHostTextInput } from './helpers/host-component-names';\nimport { isPointerEventEnabled } from './helpers/pointer-events';\nimport { isEditableTextInput } from './helpers/text-input';\nimport { nativeState } from './native-state';\nimport type { Point, StringWithAutocomplete } from './types';\n\nfunction isTouchResponder(instance: TestInstance) {\n return Boolean(instance.props.onStartShouldSetResponder) || isHostTextInput(instance);\n}\n\n/**\n * List of events affected by `pointerEvents` prop.\n *\n * Note: `fireEvent` is accepting both `press` and `onPress` for event names,\n * so we need cover both forms.\n */\nconst eventsAffectedByPointerEventsProp = new Set(['press', 'onPress']);\n\n/**\n * List of `TextInput` events not affected by `editable` prop.\n *\n * Note: `fireEvent` is accepting both `press` and `onPress` for event names,\n * so we need cover both forms.\n */\nconst textInputEventsIgnoringEditableProp = new Set([\n 'contentSizeChange',\n 'onContentSizeChange',\n 'layout',\n 'onLayout',\n 'scroll',\n 'onScroll',\n]);\n\nfunction isEventEnabled(\n instance: TestInstance,\n eventName: string,\n nearestTouchResponder?: TestInstance,\n) {\n if (nearestTouchResponder != null && isHostTextInput(nearestTouchResponder)) {\n return (\n isEditableTextInput(nearestTouchResponder) ||\n textInputEventsIgnoringEditableProp.has(eventName)\n );\n }\n\n if (eventsAffectedByPointerEventsProp.has(eventName) && !isPointerEventEnabled(instance)) {\n return false;\n }\n\n const touchStart = nearestTouchResponder?.props.onStartShouldSetResponder?.();\n const touchMove = nearestTouchResponder?.props.onMoveShouldSetResponder?.();\n if (touchStart || touchMove) {\n return true;\n }\n\n return touchStart === undefined && touchMove === undefined;\n}\n\nfunction findEventHandler(\n instance: TestInstance,\n eventName: string,\n nearestTouchResponder?: TestInstance,\n): EventHandler | null {\n const touchResponder = isTouchResponder(instance) ? instance : nearestTouchResponder;\n\n const handler =\n getEventHandlerFromProps(instance.props, eventName, { loose: true }) ??\n findEventHandlerFromFiber(instance.unstable_fiber, eventName);\n if (handler && isEventEnabled(instance, eventName, touchResponder)) {\n return handler;\n }\n\n if (instance.parent === null) {\n return null;\n }\n\n return findEventHandler(instance.parent, eventName, touchResponder);\n}\n\nfunction findEventHandlerFromFiber(fiber: Fiber | null, eventName: string): EventHandler | null {\n // Container fibers have memoizedProps set to null\n if (!fiber?.memoizedProps) {\n return null;\n }\n\n const handler = getEventHandlerFromProps(fiber.memoizedProps, eventName, { loose: true });\n if (handler) {\n return handler;\n }\n\n // No parent fiber or we reached another host element\n if (fiber.return === null || typeof fiber.return.type === 'string') {\n return null;\n }\n\n return findEventHandlerFromFiber(fiber.return, eventName);\n}\n\n// String union type of keys of T that start with on, stripped of 'on'\ntype EventNameExtractor<T> = keyof {\n [K in keyof T as K extends `on${infer Rest}` ? Uncapitalize<Rest> : never]: T[K];\n};\n\ntype EventName = StringWithAutocomplete<\n | EventNameExtractor<ViewProps>\n | EventNameExtractor<TextProps>\n | EventNameExtractor<TextInputProps>\n | EventNameExtractor<PressableProps>\n | EventNameExtractor<ScrollViewProps>\n>;\n\nasync function fireEvent(instance: TestInstance, eventName: EventName, ...data: unknown[]) {\n if (!isInstanceMounted(instance)) {\n return;\n }\n\n setNativeStateIfNeeded(instance, eventName, data[0]);\n\n const handler = findEventHandler(instance, eventName);\n if (!handler) {\n return;\n }\n\n let returnValue;\n await act(() => {\n returnValue = handler(...data);\n });\n\n return returnValue;\n}\n\ntype EventProps = Record<string, unknown>;\n\nfireEvent.changeText = async (instance: TestInstance, text: string) =>\n await fireEvent(instance, 'changeText', text);\n\nfireEvent.press = async (instance: TestInstance, eventProps?: EventProps) => {\n const event = buildTouchEvent();\n if (eventProps) {\n mergeEventProps(event, eventProps);\n }\n\n await fireEvent(instance, 'press', event);\n};\n\nfireEvent.scroll = async (instance: TestInstance, eventProps?: EventProps) => {\n const event = buildScrollEvent();\n if (eventProps) {\n mergeEventProps(event, eventProps);\n }\n\n await fireEvent(instance, 'scroll', event);\n};\n\nexport { fireEvent };\n\nconst scrollEventNames = new Set([\n 'scroll',\n 'scrollBeginDrag',\n 'scrollEndDrag',\n 'momentumScrollBegin',\n 'momentumScrollEnd',\n]);\n\nfunction setNativeStateIfNeeded(instance: TestInstance, eventName: string, value: unknown) {\n if (eventName === 'changeText' && typeof value === 'string' && isEditableTextInput(instance)) {\n nativeState.valueForInstance.set(instance, value);\n }\n\n if (scrollEventNames.has(eventName) && isHostScrollView(instance)) {\n const contentOffset = tryGetContentOffset(value);\n if (contentOffset) {\n nativeState.contentOffsetForInstance.set(instance, contentOffset);\n }\n }\n}\n\nfunction tryGetContentOffset(event: unknown): Point | null {\n try {\n // @ts-expect-error: try to extract contentOffset from the event value\n const contentOffset = event?.nativeEvent?.contentOffset;\n const x = contentOffset?.x;\n const y = contentOffset?.y;\n\n if (typeof x === 'number' || typeof y === 'number') {\n return {\n x: Number.isFinite(x) ? x : 0,\n y: Number.isFinite(y) ? y : 0,\n };\n }\n } catch {\n // Do nothing\n }\n\n return null;\n}\n\nfunction mergeEventProps(target: Record<string, unknown>, source: Record<string, unknown>) {\n for (const key of Object.keys(source)) {\n const sourceValue = source[key];\n const targetValue = target[key];\n if (\n sourceValue != null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n mergeEventProps(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n );\n } else {\n target[key] = sourceValue;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fire-event.js","names":["_act","require","_eventBuilder","_eventHandler","_componentTree","_hostComponentNames","_pointerEvents","_textInput","_nativeState","isTouchResponder","instance","Boolean","props","onStartShouldSetResponder","isHostTextInput","eventsAffectedByPointerEventsProp","Set","textInputEventsIgnoringEditableProp","isEventEnabled","eventName","nearestTouchResponder","isEditableTextInput","has","isPointerEventEnabled","touchStart","touchMove","onMoveShouldSetResponder","undefined","findEventHandler","touchResponder","handler","getEventHandlerFromProps","loose","findEventHandlerFromFiber","unstable_fiber","parent","fiber","memoizedProps","return","type","fireEvent","data","isInstanceMounted","setNativeStateIfNeeded","returnValue","act","changeText","text","press","eventProps","event","buildTouchEvent","mergeEventProps","scroll","buildScrollEvent","scrollEventNames","value","nativeState","valueForInstance","set","isHostScrollView","contentOffset","tryGetContentOffset","contentOffsetForInstance","nativeEvent","x","y","Number","isFinite","target","source","key","Object","keys","sourceValue","targetValue","Array","isArray"],"sources":["../src/fire-event.ts"],"sourcesContent":["import type {\n PressableProps,\n ScrollViewProps,\n TextInputProps,\n TextProps,\n ViewProps,\n} from 'react-native';\nimport type { Fiber, TestInstance } from 'test-renderer';\n\nimport { act } from './act';\nimport { buildScrollEvent, buildTouchEvent } from './event-builder';\nimport type { EventHandler } from './event-handler';\nimport { getEventHandlerFromProps } from './event-handler';\nimport { isInstanceMounted } from './helpers/component-tree';\nimport { isHostScrollView, isHostTextInput } from './helpers/host-component-names';\nimport { isPointerEventEnabled } from './helpers/pointer-events';\nimport { isEditableTextInput } from './helpers/text-input';\nimport { nativeState } from './native-state';\nimport type { Point, StringWithAutocomplete } from './types';\n\nfunction isTouchResponder(instance: TestInstance) {\n return Boolean(instance.props.onStartShouldSetResponder) || isHostTextInput(instance);\n}\n\n/**\n * List of events affected by `pointerEvents` prop.\n *\n * Note: `fireEvent` is accepting both `press` and `onPress` for event names,\n * so we need cover both forms.\n */\nconst eventsAffectedByPointerEventsProp = new Set(['press', 'onPress']);\n\n/**\n * List of `TextInput` events not affected by `editable` prop.\n *\n * Note: `fireEvent` is accepting both `press` and `onPress` for event names,\n * so we need cover both forms.\n */\nconst textInputEventsIgnoringEditableProp = new Set([\n 'contentSizeChange',\n 'onContentSizeChange',\n 'layout',\n 'onLayout',\n 'scroll',\n 'onScroll',\n]);\n\nfunction isEventEnabled(\n instance: TestInstance,\n eventName: string,\n nearestTouchResponder?: TestInstance,\n) {\n if (nearestTouchResponder != null && isHostTextInput(nearestTouchResponder)) {\n return (\n isEditableTextInput(nearestTouchResponder) ||\n textInputEventsIgnoringEditableProp.has(eventName)\n );\n }\n\n if (eventsAffectedByPointerEventsProp.has(eventName) && !isPointerEventEnabled(instance)) {\n return false;\n }\n\n const touchStart = nearestTouchResponder?.props.onStartShouldSetResponder?.();\n const touchMove = nearestTouchResponder?.props.onMoveShouldSetResponder?.();\n if (touchStart || touchMove) {\n return true;\n }\n\n return touchStart === undefined && touchMove === undefined;\n}\n\nfunction findEventHandler(\n instance: TestInstance,\n eventName: string,\n nearestTouchResponder?: TestInstance,\n): EventHandler | null {\n const touchResponder = isTouchResponder(instance) ? instance : nearestTouchResponder;\n\n const handler =\n getEventHandlerFromProps(instance.props, eventName, { loose: true }) ??\n findEventHandlerFromFiber(instance.unstable_fiber, eventName);\n if (handler && isEventEnabled(instance, eventName, touchResponder)) {\n return handler;\n }\n\n if (instance.parent === null) {\n return null;\n }\n\n return findEventHandler(instance.parent, eventName, touchResponder);\n}\n\nfunction findEventHandlerFromFiber(fiber: Fiber | null, eventName: string): EventHandler | null {\n // Container fibers have memoizedProps set to null\n if (!fiber?.memoizedProps) {\n return null;\n }\n\n const handler = getEventHandlerFromProps(fiber.memoizedProps, eventName, {\n loose: true,\n });\n if (handler) {\n return handler;\n }\n\n // No parent fiber or we reached another host element\n if (fiber.return === null || typeof fiber.return.type === 'string') {\n return null;\n }\n\n return findEventHandlerFromFiber(fiber.return, eventName);\n}\n\n// String union type of keys of T that start with on, stripped of 'on'\ntype EventNameExtractor<T> = keyof {\n [K in keyof T as K extends `on${infer Rest}` ? Uncapitalize<Rest> : never]: T[K];\n};\n\ntype EventName = StringWithAutocomplete<\n | EventNameExtractor<ViewProps>\n | EventNameExtractor<TextProps>\n | EventNameExtractor<TextInputProps>\n | EventNameExtractor<PressableProps>\n | EventNameExtractor<ScrollViewProps>\n>;\n\nasync function fireEvent(instance: TestInstance, eventName: EventName, ...data: unknown[]) {\n if (!isInstanceMounted(instance)) {\n return;\n }\n\n setNativeStateIfNeeded(instance, eventName, data[0]);\n\n const handler = findEventHandler(instance, eventName);\n if (!handler) {\n return;\n }\n\n let returnValue;\n await act(() => {\n returnValue = handler(...data);\n });\n\n return returnValue;\n}\n\ntype EventProps = Record<string, unknown>;\n\nfireEvent.changeText = async (instance: TestInstance, text: string) =>\n await fireEvent(instance, 'changeText', text);\n\nfireEvent.press = async (instance: TestInstance, eventProps?: EventProps) => {\n const event = buildTouchEvent();\n if (eventProps) {\n mergeEventProps(event, eventProps);\n }\n\n await fireEvent(instance, 'press', event);\n};\n\nfireEvent.scroll = async (instance: TestInstance, eventProps?: EventProps) => {\n const event = buildScrollEvent();\n if (eventProps) {\n mergeEventProps(event, eventProps);\n }\n\n await fireEvent(instance, 'scroll', event);\n};\n\nexport { fireEvent };\n\nconst scrollEventNames = new Set([\n 'scroll',\n 'scrollBeginDrag',\n 'scrollEndDrag',\n 'momentumScrollBegin',\n 'momentumScrollEnd',\n]);\n\nfunction setNativeStateIfNeeded(instance: TestInstance, eventName: string, value: unknown) {\n if (eventName === 'changeText' && typeof value === 'string' && isEditableTextInput(instance)) {\n nativeState.valueForInstance.set(instance, value);\n }\n\n if (scrollEventNames.has(eventName) && isHostScrollView(instance)) {\n const contentOffset = tryGetContentOffset(value);\n if (contentOffset) {\n nativeState.contentOffsetForInstance.set(instance, contentOffset);\n }\n }\n}\n\nfunction tryGetContentOffset(event: unknown): Point | null {\n try {\n // @ts-expect-error: try to extract contentOffset from the event value\n const contentOffset = event?.nativeEvent?.contentOffset;\n const x = contentOffset?.x;\n const y = contentOffset?.y;\n\n if (typeof x === 'number' || typeof y === 'number') {\n return {\n x: Number.isFinite(x) ? x : 0,\n y: Number.isFinite(y) ? y : 0,\n };\n }\n } catch {\n // Do nothing\n }\n\n return null;\n}\n\nfunction mergeEventProps(target: Record<string, unknown>, source: Record<string, unknown>) {\n for (const key of Object.keys(source)) {\n const sourceValue = source[key];\n const targetValue = target[key];\n if (\n sourceValue != null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n mergeEventProps(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n );\n } else {\n target[key] = sourceValue;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -255,18 +255,36 @@ function computeAccessibleName(instance, options) {
255
255
  for (const child of instance.children) {
256
256
  if (typeof child === 'string') {
257
257
  if (child) {
258
- parts.push(child);
258
+ parts.push({
259
+ text: child,
260
+ isInlineText: true
261
+ });
259
262
  }
260
263
  } else {
261
264
  const childLabel = computeAccessibleName(child, {
262
265
  root: false
263
266
  });
264
267
  if (childLabel) {
265
- parts.push(childLabel);
268
+ parts.push({
269
+ text: childLabel,
270
+ isInlineText: (0, _hostComponentNames.isHostText)(child)
271
+ });
266
272
  }
267
273
  }
268
274
  }
269
- return parts.join(' ');
275
+ return joinAccessibleNameParts(parts, {
276
+ inline: (0, _hostComponentNames.isHostText)(instance)
277
+ });
278
+ }
279
+ function joinAccessibleNameParts(parts, options) {
280
+ return parts.reduce((accessibleName, part, index) => {
281
+ if (index === 0) {
282
+ return part.text;
283
+ }
284
+ const previousPart = parts[index - 1];
285
+ const separator = options.inline && previousPart.isInlineText && part.isInlineText ? '' : ' ';
286
+ return `${accessibleName}${separator}${part.text}`;
287
+ }, '');
270
288
  }
271
289
  const rolesSupportingCheckedState = exports.rolesSupportingCheckedState = {
272
290
  checkbox: true,
@@ -1 +1 @@
1
- {"version":3,"file":"accessibility.js","names":["_reactNative","require","_componentTree","_findAll","_hostComponentNames","_textContent","_textInput","accessibilityStateKeys","exports","accessibilityValueKeys","isHiddenFromAccessibility","instance","cache","current","isCurrentSubtreeInaccessible","get","undefined","isSubtreeInaccessible","set","parent","isInaccessible","props","accessibilityElementsHidden","importantForAccessibility","flatStyle","StyleSheet","flatten","style","display","hostSiblings","getInstanceSiblings","some","sibling","computeAriaModal","isAccessibilityElement","isHostImage","alt","accessible","isHostText","isHostTextInput","isHostSwitch","getRole","explicitRole","role","accessibilityRole","normalizeRole","accessibilityViewIsModal","computeAriaLabel","labelElementIds","getAriaLabelledByIds","length","container","getContainerInstance","labelTexts","map","labelElementId","labelInstance","findAll","node","isTestInstance","nativeID","includeHiddenElements","getTextContent","filter","labelText","join","trim","replace","explicitLabel","accessibilityLabel","ariaLabelledBy","accessibilityLabelledBy","Array","isArray","computeAriaBusy","accessibilityState","busy","computeAriaChecked","value","rolesSupportingCheckedState","checked","computeAriaDisabled","isEditableTextInput","disabled","computeAriaExpanded","expanded","computeAriaSelected","selected","computeAriaValue","accessibilityValue","ariaValueMax","ariaValueMin","ariaValueNow","ariaValueText","max","min","now","text","computeAccessibleName","options","label","placeholder","root","parts","child","children","push","childLabel","checkbox","radio","switch"],"sources":["../../src/helpers/accessibility.ts"],"sourcesContent":["import type { AccessibilityRole, AccessibilityState, AccessibilityValue, Role } from 'react-native';\nimport { StyleSheet } from 'react-native';\nimport type { TestInstance } from 'test-renderer';\n\nimport { getContainerInstance, getInstanceSiblings, isTestInstance } from './component-tree';\nimport { findAll } from './find-all';\nimport { isHostImage, isHostSwitch, isHostText, isHostTextInput } from './host-component-names';\nimport { getTextContent } from './text-content';\nimport { isEditableTextInput } from './text-input';\n\ntype IsInaccessibleOptions = {\n cache?: WeakMap<TestInstance, boolean>;\n};\n\nexport const accessibilityStateKeys: (keyof AccessibilityState)[] = [\n 'disabled',\n 'selected',\n 'checked',\n 'busy',\n 'expanded',\n];\n\nexport const accessibilityValueKeys: (keyof AccessibilityValue)[] = ['min', 'max', 'now', 'text'];\n\nexport function isHiddenFromAccessibility(\n instance: TestInstance | null,\n { cache }: IsInaccessibleOptions = {},\n): boolean {\n if (instance == null) {\n return true;\n }\n\n let current: TestInstance | null = instance;\n while (current) {\n let isCurrentSubtreeInaccessible = cache?.get(current);\n\n if (isCurrentSubtreeInaccessible === undefined) {\n isCurrentSubtreeInaccessible = isSubtreeInaccessible(current);\n cache?.set(current, isCurrentSubtreeInaccessible);\n }\n\n if (isCurrentSubtreeInaccessible) {\n return true;\n }\n\n current = current.parent;\n }\n\n return false;\n}\n\n/** RTL-compatibility alias for `isHiddenFromAccessibility` */\nexport const isInaccessible = isHiddenFromAccessibility;\n\nfunction isSubtreeInaccessible(instance: TestInstance): boolean {\n // See: https://reactnative.dev/docs/accessibility#aria-hidden\n if (instance.props['aria-hidden']) {\n return true;\n }\n\n // iOS: accessibilityElementsHidden\n // See: https://reactnative.dev/docs/accessibility#accessibilityelementshidden-ios\n if (instance.props.accessibilityElementsHidden) {\n return true;\n }\n\n // Android: importantForAccessibility\n // See: https://reactnative.dev/docs/accessibility#importantforaccessibility-android\n if (instance.props.importantForAccessibility === 'no-hide-descendants') {\n return true;\n }\n\n // Note that `opacity: 0` is not treated as inaccessible on iOS\n const flatStyle = StyleSheet.flatten(instance.props.style) ?? {};\n if (flatStyle.display === 'none') return true;\n\n // iOS: accessibilityViewIsModal or aria-modal\n // See: https://reactnative.dev/docs/accessibility#accessibilityviewismodal-ios\n const hostSiblings = getInstanceSiblings(instance);\n if (hostSiblings.some((sibling) => computeAriaModal(sibling))) {\n return true;\n }\n\n return false;\n}\n\nexport function isAccessibilityElement(instance: TestInstance | null): boolean {\n if (instance == null) {\n return false;\n }\n\n // https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L172\n if (isHostImage(instance) && instance.props.alt !== undefined) {\n return true;\n }\n\n if (instance.props.accessible !== undefined) {\n return instance.props.accessible;\n }\n\n return isHostText(instance) || isHostTextInput(instance) || isHostSwitch(instance);\n}\n\n/**\n * Returns the accessibility role for given element. It will return explicit\n * role from either `role` or `accessibilityRole` props if set.\n *\n * If explicit role is not available, it would try to return default element\n * role:\n * - `text` for `Text` elements\n *\n * In all other cases this functions returns `none`.\n *\n * @param instance\n * @returns\n */\nexport function getRole(instance: TestInstance): Role | AccessibilityRole {\n const explicitRole = instance.props.role ?? instance.props.accessibilityRole;\n if (explicitRole) {\n return normalizeRole(explicitRole);\n }\n\n if (isHostText(instance)) {\n return 'text';\n }\n\n // Note: host Image elements report \"image\" role in screen reader only on Android, but not on iOS.\n // It's better to require explicit role for Image elements.\n\n return 'none';\n}\n\n/**\n * There are some duplications between (ARIA) `Role` and `AccessibilityRole` types.\n * Resolve them by using ARIA `Role` type where possible.\n *\n * @param role Role to normalize\n * @returns Normalized role\n */\nexport function normalizeRole(role: string): Role | AccessibilityRole {\n if (role === 'image') {\n return 'img';\n }\n\n return role as Role | AccessibilityRole;\n}\n\nexport function computeAriaModal(instance: TestInstance): boolean | undefined {\n return instance.props['aria-modal'] ?? instance.props.accessibilityViewIsModal;\n}\n\nexport function computeAriaLabel(instance: TestInstance): string | undefined {\n const labelElementIds = getAriaLabelledByIds(instance);\n if (labelElementIds.length > 0) {\n const container = getContainerInstance(instance);\n const labelTexts = labelElementIds\n .map((labelElementId) => {\n const labelInstance = findAll(\n container,\n (node) => isTestInstance(node) && node.props.nativeID === labelElementId,\n { includeHiddenElements: true },\n );\n\n return labelInstance.length > 0 ? getTextContent(labelInstance[0]) : undefined;\n })\n .filter((labelText): labelText is string => labelText !== undefined);\n\n if (labelTexts.length > 0) {\n return labelTexts.join(' ').trim().replace(/\\s+/g, ' ');\n }\n }\n\n const explicitLabel = instance.props['aria-label'] ?? instance.props.accessibilityLabel;\n if (explicitLabel) {\n return explicitLabel;\n }\n\n //https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L173\n if (isHostImage(instance) && instance.props.alt) {\n return instance.props.alt;\n }\n\n return undefined;\n}\n\nfunction getAriaLabelledByIds(instance: TestInstance): string[] {\n const ariaLabelledBy = instance.props['aria-labelledby'];\n if (typeof ariaLabelledBy === 'string') {\n return [ariaLabelledBy];\n }\n\n const accessibilityLabelledBy = instance.props.accessibilityLabelledBy;\n if (Array.isArray(accessibilityLabelledBy)) {\n return accessibilityLabelledBy;\n }\n\n if (typeof accessibilityLabelledBy === 'string') {\n return [accessibilityLabelledBy];\n }\n\n return [];\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#busy-state\nexport function computeAriaBusy({ props }: TestInstance): boolean {\n return props['aria-busy'] ?? props.accessibilityState?.busy ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#checked-state\nexport function computeAriaChecked(instance: TestInstance): AccessibilityState['checked'] {\n const { props } = instance;\n\n if (isHostSwitch(instance)) {\n return props.value;\n }\n\n const role = getRole(instance);\n if (!rolesSupportingCheckedState[role]) {\n return undefined;\n }\n\n return props['aria-checked'] ?? props.accessibilityState?.checked;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#disabled-state\nexport function computeAriaDisabled(instance: TestInstance): boolean {\n if (isHostTextInput(instance) && !isEditableTextInput(instance)) {\n return true;\n }\n\n const { props } = instance;\n\n if (isHostText(instance) && props.disabled) {\n return true;\n }\n\n return props['aria-disabled'] ?? props.accessibilityState?.disabled ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#expanded-state\nexport function computeAriaExpanded({ props }: TestInstance): boolean | undefined {\n return props['aria-expanded'] ?? props.accessibilityState?.expanded;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#selected-state\nexport function computeAriaSelected({ props }: TestInstance): boolean {\n return props['aria-selected'] ?? props.accessibilityState?.selected ?? false;\n}\n\nexport function computeAriaValue(instance: TestInstance): AccessibilityValue {\n const {\n accessibilityValue,\n 'aria-valuemax': ariaValueMax,\n 'aria-valuemin': ariaValueMin,\n 'aria-valuenow': ariaValueNow,\n 'aria-valuetext': ariaValueText,\n } = instance.props;\n\n return {\n max: ariaValueMax ?? accessibilityValue?.max,\n min: ariaValueMin ?? accessibilityValue?.min,\n now: ariaValueNow ?? accessibilityValue?.now,\n text: ariaValueText ?? accessibilityValue?.text,\n };\n}\n\ntype ComputeAccessibleNameOptions = {\n root?: boolean;\n};\n\nexport function computeAccessibleName(\n instance: TestInstance,\n options?: ComputeAccessibleNameOptions,\n): string | undefined {\n const label = computeAriaLabel(instance);\n if (label) {\n return label;\n }\n\n if (isHostTextInput(instance) && instance.props.placeholder && options?.root !== false) {\n return instance.props.placeholder;\n }\n\n const parts = [];\n for (const child of instance.children) {\n if (typeof child === 'string') {\n if (child) {\n parts.push(child);\n }\n } else {\n const childLabel = computeAccessibleName(child, { root: false });\n if (childLabel) {\n parts.push(childLabel);\n }\n }\n }\n\n return parts.join(' ');\n}\n\ntype RoleSupportMap = Partial<Record<Role | AccessibilityRole, true>>;\n\nexport const rolesSupportingCheckedState: RoleSupportMap = {\n checkbox: true,\n radio: true,\n switch: true,\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"accessibility.js","names":["_reactNative","require","_componentTree","_findAll","_hostComponentNames","_textContent","_textInput","accessibilityStateKeys","exports","accessibilityValueKeys","isHiddenFromAccessibility","instance","cache","current","isCurrentSubtreeInaccessible","get","undefined","isSubtreeInaccessible","set","parent","isInaccessible","props","accessibilityElementsHidden","importantForAccessibility","flatStyle","StyleSheet","flatten","style","display","hostSiblings","getInstanceSiblings","some","sibling","computeAriaModal","isAccessibilityElement","isHostImage","alt","accessible","isHostText","isHostTextInput","isHostSwitch","getRole","explicitRole","role","accessibilityRole","normalizeRole","accessibilityViewIsModal","computeAriaLabel","labelElementIds","getAriaLabelledByIds","length","container","getContainerInstance","labelTexts","map","labelElementId","labelInstance","findAll","node","isTestInstance","nativeID","includeHiddenElements","getTextContent","filter","labelText","join","trim","replace","explicitLabel","accessibilityLabel","ariaLabelledBy","accessibilityLabelledBy","Array","isArray","computeAriaBusy","accessibilityState","busy","computeAriaChecked","value","rolesSupportingCheckedState","checked","computeAriaDisabled","isEditableTextInput","disabled","computeAriaExpanded","expanded","computeAriaSelected","selected","computeAriaValue","accessibilityValue","ariaValueMax","ariaValueMin","ariaValueNow","ariaValueText","max","min","now","text","computeAccessibleName","options","label","placeholder","root","parts","child","children","push","isInlineText","childLabel","joinAccessibleNameParts","inline","reduce","accessibleName","part","index","previousPart","separator","checkbox","radio","switch"],"sources":["../../src/helpers/accessibility.ts"],"sourcesContent":["import type { AccessibilityRole, AccessibilityState, AccessibilityValue, Role } from 'react-native';\nimport { StyleSheet } from 'react-native';\nimport type { TestInstance } from 'test-renderer';\n\nimport { getContainerInstance, getInstanceSiblings, isTestInstance } from './component-tree';\nimport { findAll } from './find-all';\nimport { isHostImage, isHostSwitch, isHostText, isHostTextInput } from './host-component-names';\nimport { getTextContent } from './text-content';\nimport { isEditableTextInput } from './text-input';\n\ntype IsInaccessibleOptions = {\n cache?: WeakMap<TestInstance, boolean>;\n};\n\nexport const accessibilityStateKeys: (keyof AccessibilityState)[] = [\n 'disabled',\n 'selected',\n 'checked',\n 'busy',\n 'expanded',\n];\n\nexport const accessibilityValueKeys: (keyof AccessibilityValue)[] = ['min', 'max', 'now', 'text'];\n\nexport function isHiddenFromAccessibility(\n instance: TestInstance | null,\n { cache }: IsInaccessibleOptions = {},\n): boolean {\n if (instance == null) {\n return true;\n }\n\n let current: TestInstance | null = instance;\n while (current) {\n let isCurrentSubtreeInaccessible = cache?.get(current);\n\n if (isCurrentSubtreeInaccessible === undefined) {\n isCurrentSubtreeInaccessible = isSubtreeInaccessible(current);\n cache?.set(current, isCurrentSubtreeInaccessible);\n }\n\n if (isCurrentSubtreeInaccessible) {\n return true;\n }\n\n current = current.parent;\n }\n\n return false;\n}\n\n/** RTL-compatibility alias for `isHiddenFromAccessibility` */\nexport const isInaccessible = isHiddenFromAccessibility;\n\nfunction isSubtreeInaccessible(instance: TestInstance): boolean {\n // See: https://reactnative.dev/docs/accessibility#aria-hidden\n if (instance.props['aria-hidden']) {\n return true;\n }\n\n // iOS: accessibilityElementsHidden\n // See: https://reactnative.dev/docs/accessibility#accessibilityelementshidden-ios\n if (instance.props.accessibilityElementsHidden) {\n return true;\n }\n\n // Android: importantForAccessibility\n // See: https://reactnative.dev/docs/accessibility#importantforaccessibility-android\n if (instance.props.importantForAccessibility === 'no-hide-descendants') {\n return true;\n }\n\n // Note that `opacity: 0` is not treated as inaccessible on iOS\n const flatStyle = StyleSheet.flatten(instance.props.style) ?? {};\n if (flatStyle.display === 'none') return true;\n\n // iOS: accessibilityViewIsModal or aria-modal\n // See: https://reactnative.dev/docs/accessibility#accessibilityviewismodal-ios\n const hostSiblings = getInstanceSiblings(instance);\n if (hostSiblings.some((sibling) => computeAriaModal(sibling))) {\n return true;\n }\n\n return false;\n}\n\nexport function isAccessibilityElement(instance: TestInstance | null): boolean {\n if (instance == null) {\n return false;\n }\n\n // https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L172\n if (isHostImage(instance) && instance.props.alt !== undefined) {\n return true;\n }\n\n if (instance.props.accessible !== undefined) {\n return instance.props.accessible;\n }\n\n return isHostText(instance) || isHostTextInput(instance) || isHostSwitch(instance);\n}\n\n/**\n * Returns the accessibility role for given element. It will return explicit\n * role from either `role` or `accessibilityRole` props if set.\n *\n * If explicit role is not available, it would try to return default element\n * role:\n * - `text` for `Text` elements\n *\n * In all other cases this functions returns `none`.\n *\n * @param instance\n * @returns\n */\nexport function getRole(instance: TestInstance): Role | AccessibilityRole {\n const explicitRole = instance.props.role ?? instance.props.accessibilityRole;\n if (explicitRole) {\n return normalizeRole(explicitRole);\n }\n\n if (isHostText(instance)) {\n return 'text';\n }\n\n // Note: host Image elements report \"image\" role in screen reader only on Android, but not on iOS.\n // It's better to require explicit role for Image elements.\n\n return 'none';\n}\n\n/**\n * There are some duplications between (ARIA) `Role` and `AccessibilityRole` types.\n * Resolve them by using ARIA `Role` type where possible.\n *\n * @param role Role to normalize\n * @returns Normalized role\n */\nexport function normalizeRole(role: string): Role | AccessibilityRole {\n if (role === 'image') {\n return 'img';\n }\n\n return role as Role | AccessibilityRole;\n}\n\nexport function computeAriaModal(instance: TestInstance): boolean | undefined {\n return instance.props['aria-modal'] ?? instance.props.accessibilityViewIsModal;\n}\n\nexport function computeAriaLabel(instance: TestInstance): string | undefined {\n const labelElementIds = getAriaLabelledByIds(instance);\n if (labelElementIds.length > 0) {\n const container = getContainerInstance(instance);\n const labelTexts = labelElementIds\n .map((labelElementId) => {\n const labelInstance = findAll(\n container,\n (node) => isTestInstance(node) && node.props.nativeID === labelElementId,\n { includeHiddenElements: true },\n );\n\n return labelInstance.length > 0 ? getTextContent(labelInstance[0]) : undefined;\n })\n .filter((labelText): labelText is string => labelText !== undefined);\n\n if (labelTexts.length > 0) {\n return labelTexts.join(' ').trim().replace(/\\s+/g, ' ');\n }\n }\n\n const explicitLabel = instance.props['aria-label'] ?? instance.props.accessibilityLabel;\n if (explicitLabel) {\n return explicitLabel;\n }\n\n //https://github.com/facebook/react-native/blob/8dabed60f456e76a9e53273b601446f34de41fb5/packages/react-native/Libraries/Image/Image.ios.js#L173\n if (isHostImage(instance) && instance.props.alt) {\n return instance.props.alt;\n }\n\n return undefined;\n}\n\nfunction getAriaLabelledByIds(instance: TestInstance): string[] {\n const ariaLabelledBy = instance.props['aria-labelledby'];\n if (typeof ariaLabelledBy === 'string') {\n return [ariaLabelledBy];\n }\n\n const accessibilityLabelledBy = instance.props.accessibilityLabelledBy;\n if (Array.isArray(accessibilityLabelledBy)) {\n return accessibilityLabelledBy;\n }\n\n if (typeof accessibilityLabelledBy === 'string') {\n return [accessibilityLabelledBy];\n }\n\n return [];\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#busy-state\nexport function computeAriaBusy({ props }: TestInstance): boolean {\n return props['aria-busy'] ?? props.accessibilityState?.busy ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#checked-state\nexport function computeAriaChecked(instance: TestInstance): AccessibilityState['checked'] {\n const { props } = instance;\n\n if (isHostSwitch(instance)) {\n return props.value;\n }\n\n const role = getRole(instance);\n if (!rolesSupportingCheckedState[role]) {\n return undefined;\n }\n\n return props['aria-checked'] ?? props.accessibilityState?.checked;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#disabled-state\nexport function computeAriaDisabled(instance: TestInstance): boolean {\n if (isHostTextInput(instance) && !isEditableTextInput(instance)) {\n return true;\n }\n\n const { props } = instance;\n\n if (isHostText(instance) && props.disabled) {\n return true;\n }\n\n return props['aria-disabled'] ?? props.accessibilityState?.disabled ?? false;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#expanded-state\nexport function computeAriaExpanded({ props }: TestInstance): boolean | undefined {\n return props['aria-expanded'] ?? props.accessibilityState?.expanded;\n}\n\n// See: https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State#selected-state\nexport function computeAriaSelected({ props }: TestInstance): boolean {\n return props['aria-selected'] ?? props.accessibilityState?.selected ?? false;\n}\n\nexport function computeAriaValue(instance: TestInstance): AccessibilityValue {\n const {\n accessibilityValue,\n 'aria-valuemax': ariaValueMax,\n 'aria-valuemin': ariaValueMin,\n 'aria-valuenow': ariaValueNow,\n 'aria-valuetext': ariaValueText,\n } = instance.props;\n\n return {\n max: ariaValueMax ?? accessibilityValue?.max,\n min: ariaValueMin ?? accessibilityValue?.min,\n now: ariaValueNow ?? accessibilityValue?.now,\n text: ariaValueText ?? accessibilityValue?.text,\n };\n}\n\ntype ComputeAccessibleNameOptions = {\n root?: boolean;\n};\n\ntype AccessibleNamePart = {\n text: string;\n isInlineText: boolean;\n};\n\nexport function computeAccessibleName(\n instance: TestInstance,\n options?: ComputeAccessibleNameOptions,\n): string | undefined {\n const label = computeAriaLabel(instance);\n if (label) {\n return label;\n }\n\n if (isHostTextInput(instance) && instance.props.placeholder && options?.root !== false) {\n return instance.props.placeholder;\n }\n\n const parts: AccessibleNamePart[] = [];\n for (const child of instance.children) {\n if (typeof child === 'string') {\n if (child) {\n parts.push({ text: child, isInlineText: true });\n }\n } else {\n const childLabel = computeAccessibleName(child, { root: false });\n if (childLabel) {\n parts.push({ text: childLabel, isInlineText: isHostText(child) });\n }\n }\n }\n\n return joinAccessibleNameParts(parts, { inline: isHostText(instance) });\n}\n\nfunction joinAccessibleNameParts(\n parts: AccessibleNamePart[],\n options: { inline: boolean },\n): string {\n return parts.reduce((accessibleName, part, index) => {\n if (index === 0) {\n return part.text;\n }\n\n const previousPart = parts[index - 1];\n const separator = options.inline && previousPart.isInlineText && part.isInlineText ? '' : ' ';\n return `${accessibleName}${separator}${part.text}`;\n }, '');\n}\n\ntype RoleSupportMap = Partial<Record<Role | AccessibilityRole, true>>;\n\nexport const rolesSupportingCheckedState: RoleSupportMap = {\n checkbox: true,\n radio: true,\n switch: true,\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"to-be-on-the-screen.js","names":["_jestMatcherUtils","require","_redent","_interopRequireDefault","_componentTree","_formatElement","_screen","_utils","e","__esModule","default","toBeOnTheScreen","instance","isNot","checkHostElement","pass","screen","container","getContainerInstance","errorFound","redent","formatElement","errorNotFound","message","matcherHint","RECEIVED_COLOR","join"],"sources":["../../src/matchers/to-be-on-the-screen.ts"],"sourcesContent":["import { matcherHint, RECEIVED_COLOR } from 'jest-matcher-utils';\nimport redent from 'redent';\nimport type { TestInstance } from 'test-renderer';\n\nimport { getContainerInstance } from '../helpers/component-tree';\nimport { formatElement } from '../helpers/format-element';\nimport { screen } from '../screen';\nimport { checkHostElement } from './utils';\n\nexport function toBeOnTheScreen(this: jest.MatcherContext, instance: TestInstance) {\n if (instance !== null || !this.isNot) {\n checkHostElement(instance, toBeOnTheScreen, this);\n }\n\n const pass = instance === null ? false : screen.container === getContainerInstance(instance);\n\n const errorFound = () => {\n return `expected instance tree not to contain instance, but found\\n${redent(\n formatElement(instance),\n 2,\n )}`;\n };\n\n const errorNotFound = () => {\n return `instance could not be found in the instance tree`;\n };\n\n return {\n pass,\n message: () => {\n return [\n matcherHint(`${this.isNot ? '.not' : ''}.toBeOnTheScreen`, 'instance', ''),\n '',\n RECEIVED_COLOR(this.isNot ? errorFound() : errorNotFound()),\n ].join('\\n');\n },\n };\n}\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAC,sBAAA,CAAAF,OAAA;AAGA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAL,OAAA;AACA,IAAAM,MAAA,GAAAN,OAAA;AAA2C,SAAAE,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEpC,SAASG,eAAeA,CAA4BC,QAAsB,EAAE;EACjF,IAAIA,QAAQ,KAAK,IAAI,IAAI,CAAC,IAAI,CAACC,KAAK,EAAE;IACpC,IAAAC,uBAAgB,EAACF,QAAQ,EAAED,eAAe,EAAE,IAAI,CAAC;EACnD;EAEA,MAAMI,IAAI,GAAGH,QAAQ,KAAK,IAAI,GAAG,KAAK,GAAGI,cAAM,CAACC,SAAS,KAAK,IAAAC,mCAAoB,EAACN,QAAQ,CAAC;EAE5F,MAAMO,UAAU,GAAGA,CAAA,KAAM;IACvB,OAAO,8DAA8D,IAAAC,eAAM,EACzE,IAAAC,4BAAa,EAACT,QAAQ,CAAC,EACvB,CACF,CAAC,EAAE;EACL,CAAC;EAED,MAAMU,aAAa,GAAGA,CAAA,KAAM;IAC1B,OAAO,kDAAkD;EAC3D,CAAC;EAED,OAAO;IACLP,IAAI;IACJQ,OAAO,EAAEA,CAAA,KAAM;MACb,OAAO,CACL,IAAAC,6BAAW,EAAC,GAAG,IAAI,CAACX,KAAK,GAAG,MAAM,GAAG,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,CAAC,EAC1E,EAAE,EACF,IAAAY,gCAAc,EAAC,IAAI,CAACZ,KAAK,GAAGM,UAAU,CAAC,CAAC,GAAGG,aAAa,CAAC,CAAC,CAAC,CAC5D,CAACI,IAAI,CAAC,IAAI,CAAC;IACd;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"to-be-on-the-screen.js","names":["_jestMatcherUtils","require","_redent","_interopRequireDefault","_componentTree","_formatElement","_screen","_utils","e","__esModule","default","toBeOnTheScreen","instance","isNot","checkHostElement","pass","screen","container","getContainerInstance","errorFound","redent","formatElement","errorNotFound","message","matcherHint","RECEIVED_COLOR","join"],"sources":["../../src/matchers/to-be-on-the-screen.ts"],"sourcesContent":["import { matcherHint, RECEIVED_COLOR } from 'jest-matcher-utils';\nimport redent from 'redent';\nimport type { TestInstance } from 'test-renderer';\n\nimport { getContainerInstance } from '../helpers/component-tree';\nimport { formatElement } from '../helpers/format-element';\nimport { screen } from '../screen';\nimport { checkHostElement } from './utils';\n\nexport function toBeOnTheScreen(this: jest.MatcherContext, instance: TestInstance) {\n if (instance !== null || !this.isNot) {\n checkHostElement(instance, toBeOnTheScreen, this);\n }\n\n const pass = instance === null ? false : screen.container === getContainerInstance(instance);\n\n const errorFound = () => {\n return `expected instance tree not to contain instance, but found\\n${redent(formatElement(instance), 2)}`;\n };\n\n const errorNotFound = () => {\n return `instance could not be found in the instance tree`;\n };\n\n return {\n pass,\n message: () => {\n return [\n matcherHint(`${this.isNot ? '.not' : ''}.toBeOnTheScreen`, 'instance', ''),\n '',\n RECEIVED_COLOR(this.isNot ? errorFound() : errorNotFound()),\n ].join('\\n');\n },\n };\n}\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAC,sBAAA,CAAAF,OAAA;AAGA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAL,OAAA;AACA,IAAAM,MAAA,GAAAN,OAAA;AAA2C,SAAAE,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEpC,SAASG,eAAeA,CAA4BC,QAAsB,EAAE;EACjF,IAAIA,QAAQ,KAAK,IAAI,IAAI,CAAC,IAAI,CAACC,KAAK,EAAE;IACpC,IAAAC,uBAAgB,EAACF,QAAQ,EAAED,eAAe,EAAE,IAAI,CAAC;EACnD;EAEA,MAAMI,IAAI,GAAGH,QAAQ,KAAK,IAAI,GAAG,KAAK,GAAGI,cAAM,CAACC,SAAS,KAAK,IAAAC,mCAAoB,EAACN,QAAQ,CAAC;EAE5F,MAAMO,UAAU,GAAGA,CAAA,KAAM;IACvB,OAAO,8DAA8D,IAAAC,eAAM,EAAC,IAAAC,4BAAa,EAACT,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE;EAC3G,CAAC;EAED,MAAMU,aAAa,GAAGA,CAAA,KAAM;IAC1B,OAAO,kDAAkD;EAC3D,CAAC;EAED,OAAO;IACLP,IAAI;IACJQ,OAAO,EAAEA,CAAA,KAAM;MACb,OAAO,CACL,IAAAC,6BAAW,EAAC,GAAG,IAAI,CAACX,KAAK,GAAG,MAAM,GAAG,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,CAAC,EAC1E,EAAE,EACF,IAAAY,gCAAc,EAAC,IAAI,CAACZ,KAAK,GAAGM,UAAU,CAAC,CAAC,GAAGG,aAAa,CAAC,CAAC,CAAC,CAC5D,CAACI,IAAI,CAAC,IAAI,CAAC;IACd;EACF,CAAC;AACH","ignoreList":[]}
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.toBeVisible = toBeVisible;
7
- var _reactNative = require("react-native");
8
7
  var _jestMatcherUtils = require("jest-matcher-utils");
8
+ var _reactNative = require("react-native");
9
9
  var _redent = _interopRequireDefault(require("redent"));
10
10
  var _accessibility = require("../helpers/accessibility");
11
11
  var _formatElement = require("../helpers/format-element");
@@ -1 +1 @@
1
- {"version":3,"file":"to-be-visible.js","names":["_reactNative","require","_jestMatcherUtils","_redent","_interopRequireDefault","_accessibility","_formatElement","_hostComponentNames","_utils","e","__esModule","default","toBeVisible","instance","isNot","checkHostElement","pass","isElementVisible","message","is","matcherHint","redent","formatElement","join","accessibilityCache","cache","WeakMap","isHiddenFromAccessibility","isHiddenForStyles","isHostModal","props","visible","parent","flatStyle","StyleSheet","flatten","style","display","opacity"],"sources":["../../src/matchers/to-be-visible.ts"],"sourcesContent":["import { StyleSheet } from 'react-native';\nimport { matcherHint } from 'jest-matcher-utils';\nimport redent from 'redent';\nimport type { TestInstance } from 'test-renderer';\n\nimport { isHiddenFromAccessibility } from '../helpers/accessibility';\nimport { formatElement } from '../helpers/format-element';\nimport { isHostModal } from '../helpers/host-component-names';\nimport { checkHostElement } from './utils';\n\nexport function toBeVisible(this: jest.MatcherContext, instance: TestInstance) {\n if (instance !== null || !this.isNot) {\n checkHostElement(instance, toBeVisible, this);\n }\n\n return {\n pass: isElementVisible(instance),\n message: () => {\n const is = this.isNot ? 'is' : 'is not';\n return [\n matcherHint(`${this.isNot ? '.not' : ''}.toBeVisible`, 'instance', ''),\n '',\n `Received instance ${is} visible:`,\n redent(formatElement(instance), 2),\n ].join('\\n');\n },\n };\n}\n\nfunction isElementVisible(\n instance: TestInstance,\n accessibilityCache?: WeakMap<TestInstance, boolean>,\n): boolean {\n // Use cache to speed up repeated searches by `isHiddenFromAccessibility`.\n const cache = accessibilityCache ?? new WeakMap<TestInstance, boolean>();\n if (isHiddenFromAccessibility(instance, { cache })) {\n return false;\n }\n\n if (isHiddenForStyles(instance)) {\n return false;\n }\n\n // Note: this seems to be a bug in React Native.\n // PR with fix: https://github.com/facebook/react-native/pull/39157\n if (isHostModal(instance) && instance.props.visible === false) {\n return false;\n }\n\n const parent = instance.parent;\n if (parent === null) {\n return true;\n }\n\n return isElementVisible(parent, cache);\n}\n\nfunction isHiddenForStyles(instance: TestInstance) {\n const flatStyle = StyleSheet.flatten(instance.props.style);\n return flatStyle?.display === 'none' || flatStyle?.opacity === 0;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAC,sBAAA,CAAAH,OAAA;AAGA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,cAAA,GAAAL,OAAA;AACA,IAAAM,mBAAA,GAAAN,OAAA;AACA,IAAAO,MAAA,GAAAP,OAAA;AAA2C,SAAAG,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEpC,SAASG,WAAWA,CAA4BC,QAAsB,EAAE;EAC7E,IAAIA,QAAQ,KAAK,IAAI,IAAI,CAAC,IAAI,CAACC,KAAK,EAAE;IACpC,IAAAC,uBAAgB,EAACF,QAAQ,EAAED,WAAW,EAAE,IAAI,CAAC;EAC/C;EAEA,OAAO;IACLI,IAAI,EAAEC,gBAAgB,CAACJ,QAAQ,CAAC;IAChCK,OAAO,EAAEA,CAAA,KAAM;MACb,MAAMC,EAAE,GAAG,IAAI,CAACL,KAAK,GAAG,IAAI,GAAG,QAAQ;MACvC,OAAO,CACL,IAAAM,6BAAW,EAAC,GAAG,IAAI,CAACN,KAAK,GAAG,MAAM,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,CAAC,EACtE,EAAE,EACF,qBAAqBK,EAAE,WAAW,EAClC,IAAAE,eAAM,EAAC,IAAAC,4BAAa,EAACT,QAAQ,CAAC,EAAE,CAAC,CAAC,CACnC,CAACU,IAAI,CAAC,IAAI,CAAC;IACd;EACF,CAAC;AACH;AAEA,SAASN,gBAAgBA,CACvBJ,QAAsB,EACtBW,kBAAmD,EAC1C;EACT;EACA,MAAMC,KAAK,GAAGD,kBAAkB,IAAI,IAAIE,OAAO,CAAwB,CAAC;EACxE,IAAI,IAAAC,wCAAyB,EAACd,QAAQ,EAAE;IAAEY;EAAM,CAAC,CAAC,EAAE;IAClD,OAAO,KAAK;EACd;EAEA,IAAIG,iBAAiB,CAACf,QAAQ,CAAC,EAAE;IAC/B,OAAO,KAAK;EACd;;EAEA;EACA;EACA,IAAI,IAAAgB,+BAAW,EAAChB,QAAQ,CAAC,IAAIA,QAAQ,CAACiB,KAAK,CAACC,OAAO,KAAK,KAAK,EAAE;IAC7D,OAAO,KAAK;EACd;EAEA,MAAMC,MAAM,GAAGnB,QAAQ,CAACmB,MAAM;EAC9B,IAAIA,MAAM,KAAK,IAAI,EAAE;IACnB,OAAO,IAAI;EACb;EAEA,OAAOf,gBAAgB,CAACe,MAAM,EAAEP,KAAK,CAAC;AACxC;AAEA,SAASG,iBAAiBA,CAACf,QAAsB,EAAE;EACjD,MAAMoB,SAAS,GAAGC,uBAAU,CAACC,OAAO,CAACtB,QAAQ,CAACiB,KAAK,CAACM,KAAK,CAAC;EAC1D,OAAOH,SAAS,EAAEI,OAAO,KAAK,MAAM,IAAIJ,SAAS,EAAEK,OAAO,KAAK,CAAC;AAClE","ignoreList":[]}
1
+ {"version":3,"file":"to-be-visible.js","names":["_jestMatcherUtils","require","_reactNative","_redent","_interopRequireDefault","_accessibility","_formatElement","_hostComponentNames","_utils","e","__esModule","default","toBeVisible","instance","isNot","checkHostElement","pass","isElementVisible","message","is","matcherHint","redent","formatElement","join","accessibilityCache","cache","WeakMap","isHiddenFromAccessibility","isHiddenForStyles","isHostModal","props","visible","parent","flatStyle","StyleSheet","flatten","style","display","opacity"],"sources":["../../src/matchers/to-be-visible.ts"],"sourcesContent":["import { matcherHint } from 'jest-matcher-utils';\nimport { StyleSheet } from 'react-native';\nimport redent from 'redent';\nimport type { TestInstance } from 'test-renderer';\n\nimport { isHiddenFromAccessibility } from '../helpers/accessibility';\nimport { formatElement } from '../helpers/format-element';\nimport { isHostModal } from '../helpers/host-component-names';\nimport { checkHostElement } from './utils';\n\nexport function toBeVisible(this: jest.MatcherContext, instance: TestInstance) {\n if (instance !== null || !this.isNot) {\n checkHostElement(instance, toBeVisible, this);\n }\n\n return {\n pass: isElementVisible(instance),\n message: () => {\n const is = this.isNot ? 'is' : 'is not';\n return [\n matcherHint(`${this.isNot ? '.not' : ''}.toBeVisible`, 'instance', ''),\n '',\n `Received instance ${is} visible:`,\n redent(formatElement(instance), 2),\n ].join('\\n');\n },\n };\n}\n\nfunction isElementVisible(\n instance: TestInstance,\n accessibilityCache?: WeakMap<TestInstance, boolean>,\n): boolean {\n // Use cache to speed up repeated searches by `isHiddenFromAccessibility`.\n const cache = accessibilityCache ?? new WeakMap<TestInstance, boolean>();\n if (isHiddenFromAccessibility(instance, { cache })) {\n return false;\n }\n\n if (isHiddenForStyles(instance)) {\n return false;\n }\n\n // Note: this seems to be a bug in React Native.\n // PR with fix: https://github.com/facebook/react-native/pull/39157\n if (isHostModal(instance) && instance.props.visible === false) {\n return false;\n }\n\n const parent = instance.parent;\n if (parent === null) {\n return true;\n }\n\n return isElementVisible(parent, cache);\n}\n\nfunction isHiddenForStyles(instance: TestInstance) {\n const flatStyle = StyleSheet.flatten(instance.props.style);\n return flatStyle?.display === 'none' || flatStyle?.opacity === 0;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAC,sBAAA,CAAAH,OAAA;AAGA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,cAAA,GAAAL,OAAA;AACA,IAAAM,mBAAA,GAAAN,OAAA;AACA,IAAAO,MAAA,GAAAP,OAAA;AAA2C,SAAAG,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEpC,SAASG,WAAWA,CAA4BC,QAAsB,EAAE;EAC7E,IAAIA,QAAQ,KAAK,IAAI,IAAI,CAAC,IAAI,CAACC,KAAK,EAAE;IACpC,IAAAC,uBAAgB,EAACF,QAAQ,EAAED,WAAW,EAAE,IAAI,CAAC;EAC/C;EAEA,OAAO;IACLI,IAAI,EAAEC,gBAAgB,CAACJ,QAAQ,CAAC;IAChCK,OAAO,EAAEA,CAAA,KAAM;MACb,MAAMC,EAAE,GAAG,IAAI,CAACL,KAAK,GAAG,IAAI,GAAG,QAAQ;MACvC,OAAO,CACL,IAAAM,6BAAW,EAAC,GAAG,IAAI,CAACN,KAAK,GAAG,MAAM,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,CAAC,EACtE,EAAE,EACF,qBAAqBK,EAAE,WAAW,EAClC,IAAAE,eAAM,EAAC,IAAAC,4BAAa,EAACT,QAAQ,CAAC,EAAE,CAAC,CAAC,CACnC,CAACU,IAAI,CAAC,IAAI,CAAC;IACd;EACF,CAAC;AACH;AAEA,SAASN,gBAAgBA,CACvBJ,QAAsB,EACtBW,kBAAmD,EAC1C;EACT;EACA,MAAMC,KAAK,GAAGD,kBAAkB,IAAI,IAAIE,OAAO,CAAwB,CAAC;EACxE,IAAI,IAAAC,wCAAyB,EAACd,QAAQ,EAAE;IAAEY;EAAM,CAAC,CAAC,EAAE;IAClD,OAAO,KAAK;EACd;EAEA,IAAIG,iBAAiB,CAACf,QAAQ,CAAC,EAAE;IAC/B,OAAO,KAAK;EACd;;EAEA;EACA;EACA,IAAI,IAAAgB,+BAAW,EAAChB,QAAQ,CAAC,IAAIA,QAAQ,CAACiB,KAAK,CAACC,OAAO,KAAK,KAAK,EAAE;IAC7D,OAAO,KAAK;EACd;EAEA,MAAMC,MAAM,GAAGnB,QAAQ,CAACmB,MAAM;EAC9B,IAAIA,MAAM,KAAK,IAAI,EAAE;IACnB,OAAO,IAAI;EACb;EAEA,OAAOf,gBAAgB,CAACe,MAAM,EAAEP,KAAK,CAAC;AACxC;AAEA,SAASG,iBAAiBA,CAACf,QAAsB,EAAE;EACjD,MAAMoB,SAAS,GAAGC,uBAAU,CAACC,OAAO,CAACtB,QAAQ,CAACiB,KAAK,CAACM,KAAK,CAAC;EAC1D,OAAOH,SAAS,EAAEI,OAAO,KAAK,MAAM,IAAIJ,SAAS,EAAEK,OAAO,KAAK,CAAC;AAClE","ignoreList":[]}
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.toHaveStyle = toHaveStyle;
7
- var _reactNative = require("react-native");
8
7
  var _jestMatcherUtils = require("jest-matcher-utils");
8
+ var _reactNative = require("react-native");
9
9
  var _utils = require("./utils");
10
10
  function toHaveStyle(instance, style) {
11
11
  (0, _utils.checkHostElement)(instance, toHaveStyle, this);
@@ -1 +1 @@
1
- {"version":3,"file":"to-have-style.js","names":["_reactNative","require","_jestMatcherUtils","_utils","toHaveStyle","instance","style","checkHostElement","expected","StyleSheet","flatten","received","props","pass","Object","keys","every","key","equals","message","to","isNot","matcher","matcherHint","formatMessage","formatStyles","pickReceivedStyles","expectedDiff","join","receivedNarrow","diff","result","forEach","undefined","sort","map","prop","JSON","stringify"],"sources":["../../src/matchers/to-have-style.ts"],"sourcesContent":["import type { ImageStyle, StyleProp, TextStyle, ViewStyle } from 'react-native';\nimport { StyleSheet } from 'react-native';\nimport { diff, matcherHint } from 'jest-matcher-utils';\nimport type { TestInstance } from 'test-renderer';\n\nimport { checkHostElement, formatMessage } from './utils';\n\nexport type Style = ViewStyle | TextStyle | ImageStyle;\n\ntype StyleLike = Record<string, unknown>;\n\nexport function toHaveStyle(\n this: jest.MatcherContext,\n instance: TestInstance,\n style: StyleProp<Style>,\n) {\n checkHostElement(instance, toHaveStyle, this);\n\n const expected = (StyleSheet.flatten(style) as StyleLike) ?? {};\n const received = (StyleSheet.flatten(instance.props.style) as StyleLike) ?? {};\n\n const pass = Object.keys(expected).every((key) => this.equals(expected[key], received[key]));\n\n return {\n pass,\n message: () => {\n const to = this.isNot ? 'not to' : 'to';\n const matcher = matcherHint(`${this.isNot ? '.not' : ''}.toHaveStyle`, 'instance', '');\n\n if (pass) {\n return formatMessage(\n matcher,\n `Expected instance ${to} have style`,\n formatStyles(expected),\n 'Received',\n formatStyles(pickReceivedStyles(expected, received)),\n );\n } else {\n return [matcher, '', expectedDiff(expected, received)].join('\\n');\n }\n },\n };\n}\n\n/**\n * Generate diff between `expected` and `received` styles.\n */\nfunction expectedDiff(expected: StyleLike, received: StyleLike) {\n const receivedNarrow = pickReceivedStyles(expected, received);\n return diff(formatStyles(expected), formatStyles(receivedNarrow));\n}\n\n/**\n * Pick from `received` style only the keys present in `expected` style.\n */\nfunction pickReceivedStyles(expected: StyleLike, received: StyleLike) {\n const result: StyleLike = {};\n Object.keys(received).forEach((key) => {\n if (expected[key] !== undefined) {\n result[key] = received[key];\n }\n });\n\n return result;\n}\n\nfunction formatStyles(style: StyleLike) {\n return Object.keys(style)\n .sort()\n .map((prop) => `${prop}: ${JSON.stringify(style[prop], null, 2)};`)\n .join('\\n');\n}\n"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAGA,IAAAE,MAAA,GAAAF,OAAA;AAMO,SAASG,WAAWA,CAEzBC,QAAsB,EACtBC,KAAuB,EACvB;EACA,IAAAC,uBAAgB,EAACF,QAAQ,EAAED,WAAW,EAAE,IAAI,CAAC;EAE7C,MAAMI,QAAQ,GAAIC,uBAAU,CAACC,OAAO,CAACJ,KAAK,CAAC,IAAkB,CAAC,CAAC;EAC/D,MAAMK,QAAQ,GAAIF,uBAAU,CAACC,OAAO,CAACL,QAAQ,CAACO,KAAK,CAACN,KAAK,CAAC,IAAkB,CAAC,CAAC;EAE9E,MAAMO,IAAI,GAAGC,MAAM,CAACC,IAAI,CAACP,QAAQ,CAAC,CAACQ,KAAK,CAAEC,GAAG,IAAK,IAAI,CAACC,MAAM,CAACV,QAAQ,CAACS,GAAG,CAAC,EAAEN,QAAQ,CAACM,GAAG,CAAC,CAAC,CAAC;EAE5F,OAAO;IACLJ,IAAI;IACJM,OAAO,EAAEA,CAAA,KAAM;MACb,MAAMC,EAAE,GAAG,IAAI,CAACC,KAAK,GAAG,QAAQ,GAAG,IAAI;MACvC,MAAMC,OAAO,GAAG,IAAAC,6BAAW,EAAC,GAAG,IAAI,CAACF,KAAK,GAAG,MAAM,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,CAAC;MAEtF,IAAIR,IAAI,EAAE;QACR,OAAO,IAAAW,oBAAa,EAClBF,OAAO,EACP,qBAAqBF,EAAE,aAAa,EACpCK,YAAY,CAACjB,QAAQ,CAAC,EACtB,UAAU,EACViB,YAAY,CAACC,kBAAkB,CAAClB,QAAQ,EAAEG,QAAQ,CAAC,CACrD,CAAC;MACH,CAAC,MAAM;QACL,OAAO,CAACW,OAAO,EAAE,EAAE,EAAEK,YAAY,CAACnB,QAAQ,EAAEG,QAAQ,CAAC,CAAC,CAACiB,IAAI,CAAC,IAAI,CAAC;MACnE;IACF;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA,SAASD,YAAYA,CAACnB,QAAmB,EAAEG,QAAmB,EAAE;EAC9D,MAAMkB,cAAc,GAAGH,kBAAkB,CAAClB,QAAQ,EAAEG,QAAQ,CAAC;EAC7D,OAAO,IAAAmB,sBAAI,EAACL,YAAY,CAACjB,QAAQ,CAAC,EAAEiB,YAAY,CAACI,cAAc,CAAC,CAAC;AACnE;;AAEA;AACA;AACA;AACA,SAASH,kBAAkBA,CAAClB,QAAmB,EAAEG,QAAmB,EAAE;EACpE,MAAMoB,MAAiB,GAAG,CAAC,CAAC;EAC5BjB,MAAM,CAACC,IAAI,CAACJ,QAAQ,CAAC,CAACqB,OAAO,CAAEf,GAAG,IAAK;IACrC,IAAIT,QAAQ,CAACS,GAAG,CAAC,KAAKgB,SAAS,EAAE;MAC/BF,MAAM,CAACd,GAAG,CAAC,GAAGN,QAAQ,CAACM,GAAG,CAAC;IAC7B;EACF,CAAC,CAAC;EAEF,OAAOc,MAAM;AACf;AAEA,SAASN,YAAYA,CAACnB,KAAgB,EAAE;EACtC,OAAOQ,MAAM,CAACC,IAAI,CAACT,KAAK,CAAC,CACtB4B,IAAI,CAAC,CAAC,CACNC,GAAG,CAAEC,IAAI,IAAK,GAAGA,IAAI,KAAKC,IAAI,CAACC,SAAS,CAAChC,KAAK,CAAC8B,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAClER,IAAI,CAAC,IAAI,CAAC;AACf","ignoreList":[]}
1
+ {"version":3,"file":"to-have-style.js","names":["_jestMatcherUtils","require","_reactNative","_utils","toHaveStyle","instance","style","checkHostElement","expected","StyleSheet","flatten","received","props","pass","Object","keys","every","key","equals","message","to","isNot","matcher","matcherHint","formatMessage","formatStyles","pickReceivedStyles","expectedDiff","join","receivedNarrow","diff","result","forEach","undefined","sort","map","prop","JSON","stringify"],"sources":["../../src/matchers/to-have-style.ts"],"sourcesContent":["import { diff, matcherHint } from 'jest-matcher-utils';\nimport type { ImageStyle, StyleProp, TextStyle, ViewStyle } from 'react-native';\nimport { StyleSheet } from 'react-native';\nimport type { TestInstance } from 'test-renderer';\n\nimport { checkHostElement, formatMessage } from './utils';\n\nexport type Style = ViewStyle | TextStyle | ImageStyle;\n\ntype StyleLike = Record<string, unknown>;\n\nexport function toHaveStyle(\n this: jest.MatcherContext,\n instance: TestInstance,\n style: StyleProp<Style>,\n) {\n checkHostElement(instance, toHaveStyle, this);\n\n const expected = (StyleSheet.flatten(style) as StyleLike) ?? {};\n const received = (StyleSheet.flatten(instance.props.style) as StyleLike) ?? {};\n\n const pass = Object.keys(expected).every((key) => this.equals(expected[key], received[key]));\n\n return {\n pass,\n message: () => {\n const to = this.isNot ? 'not to' : 'to';\n const matcher = matcherHint(`${this.isNot ? '.not' : ''}.toHaveStyle`, 'instance', '');\n\n if (pass) {\n return formatMessage(\n matcher,\n `Expected instance ${to} have style`,\n formatStyles(expected),\n 'Received',\n formatStyles(pickReceivedStyles(expected, received)),\n );\n } else {\n return [matcher, '', expectedDiff(expected, received)].join('\\n');\n }\n },\n };\n}\n\n/**\n * Generate diff between `expected` and `received` styles.\n */\nfunction expectedDiff(expected: StyleLike, received: StyleLike) {\n const receivedNarrow = pickReceivedStyles(expected, received);\n return diff(formatStyles(expected), formatStyles(receivedNarrow));\n}\n\n/**\n * Pick from `received` style only the keys present in `expected` style.\n */\nfunction pickReceivedStyles(expected: StyleLike, received: StyleLike) {\n const result: StyleLike = {};\n Object.keys(received).forEach((key) => {\n if (expected[key] !== undefined) {\n result[key] = received[key];\n }\n });\n\n return result;\n}\n\nfunction formatStyles(style: StyleLike) {\n return Object.keys(style)\n .sort()\n .map((prop) => `${prop}: ${JSON.stringify(style[prop], null, 2)};`)\n .join('\\n');\n}\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAD,OAAA;AAGA,IAAAE,MAAA,GAAAF,OAAA;AAMO,SAASG,WAAWA,CAEzBC,QAAsB,EACtBC,KAAuB,EACvB;EACA,IAAAC,uBAAgB,EAACF,QAAQ,EAAED,WAAW,EAAE,IAAI,CAAC;EAE7C,MAAMI,QAAQ,GAAIC,uBAAU,CAACC,OAAO,CAACJ,KAAK,CAAC,IAAkB,CAAC,CAAC;EAC/D,MAAMK,QAAQ,GAAIF,uBAAU,CAACC,OAAO,CAACL,QAAQ,CAACO,KAAK,CAACN,KAAK,CAAC,IAAkB,CAAC,CAAC;EAE9E,MAAMO,IAAI,GAAGC,MAAM,CAACC,IAAI,CAACP,QAAQ,CAAC,CAACQ,KAAK,CAAEC,GAAG,IAAK,IAAI,CAACC,MAAM,CAACV,QAAQ,CAACS,GAAG,CAAC,EAAEN,QAAQ,CAACM,GAAG,CAAC,CAAC,CAAC;EAE5F,OAAO;IACLJ,IAAI;IACJM,OAAO,EAAEA,CAAA,KAAM;MACb,MAAMC,EAAE,GAAG,IAAI,CAACC,KAAK,GAAG,QAAQ,GAAG,IAAI;MACvC,MAAMC,OAAO,GAAG,IAAAC,6BAAW,EAAC,GAAG,IAAI,CAACF,KAAK,GAAG,MAAM,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,CAAC;MAEtF,IAAIR,IAAI,EAAE;QACR,OAAO,IAAAW,oBAAa,EAClBF,OAAO,EACP,qBAAqBF,EAAE,aAAa,EACpCK,YAAY,CAACjB,QAAQ,CAAC,EACtB,UAAU,EACViB,YAAY,CAACC,kBAAkB,CAAClB,QAAQ,EAAEG,QAAQ,CAAC,CACrD,CAAC;MACH,CAAC,MAAM;QACL,OAAO,CAACW,OAAO,EAAE,EAAE,EAAEK,YAAY,CAACnB,QAAQ,EAAEG,QAAQ,CAAC,CAAC,CAACiB,IAAI,CAAC,IAAI,CAAC;MACnE;IACF;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA,SAASD,YAAYA,CAACnB,QAAmB,EAAEG,QAAmB,EAAE;EAC9D,MAAMkB,cAAc,GAAGH,kBAAkB,CAAClB,QAAQ,EAAEG,QAAQ,CAAC;EAC7D,OAAO,IAAAmB,sBAAI,EAACL,YAAY,CAACjB,QAAQ,CAAC,EAAEiB,YAAY,CAACI,cAAc,CAAC,CAAC;AACnE;;AAEA;AACA;AACA;AACA,SAASH,kBAAkBA,CAAClB,QAAmB,EAAEG,QAAmB,EAAE;EACpE,MAAMoB,MAAiB,GAAG,CAAC,CAAC;EAC5BjB,MAAM,CAACC,IAAI,CAACJ,QAAQ,CAAC,CAACqB,OAAO,CAAEf,GAAG,IAAK;IACrC,IAAIT,QAAQ,CAACS,GAAG,CAAC,KAAKgB,SAAS,EAAE;MAC/BF,MAAM,CAACd,GAAG,CAAC,GAAGN,QAAQ,CAACM,GAAG,CAAC;IAC7B;EACF,CAAC,CAAC;EAEF,OAAOc,MAAM;AACf;AAEA,SAASN,YAAYA,CAACnB,KAAgB,EAAE;EACtC,OAAOQ,MAAM,CAACC,IAAI,CAACT,KAAK,CAAC,CACtB4B,IAAI,CAAC,CAAC,CACNC,GAAG,CAAEC,IAAI,IAAK,GAAGA,IAAI,KAAKC,IAAI,CAACC,SAAS,CAAChC,KAAK,CAAC8B,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAClER,IAAI,CAAC,IAAI,CAAC;AACf","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-to.js","names":["_jestMatcherUtils","require","_eventBuilder","_errors","_hostComponentNames","_object","_nativeState","_utils","_utils2","scrollTo","instance","options","isHostScrollView","ErrorWithStack","type","ensureScrollViewDirection","dispatchEvent","contentSize","width","height","initialOffset","nativeState","contentOffsetForInstance","get","x","y","dragSteps","createScrollSteps","linearInterpolator","emitDragScrollEvents","config","momentumStart","at","momentumSteps","momentumY","momentumX","inertialInterpolator","emitMomentumScrollEvents","finalOffset","set","scrollSteps","scrollOptions","length","wait","buildScrollEvent","i","lastStep","isVerticalScrollView","props","horizontal","hasHorizontalScrollOptions","undefined","stringify","pick","hasVerticalScrollOptions"],"sources":["../../../src/user-event/scroll/scroll-to.ts"],"sourcesContent":["import { stringify } from 'jest-matcher-utils';\nimport type { TestInstance } from 'test-renderer';\n\nimport { buildScrollEvent } from '../../event-builder';\nimport { ErrorWithStack } from '../../helpers/errors';\nimport { isHostScrollView } from '../../helpers/host-component-names';\nimport { pick } from '../../helpers/object';\nimport { nativeState } from '../../native-state';\nimport type { Point, Size } from '../../types';\nimport type { UserEventConfig, UserEventInstance } from '../setup';\nimport { dispatchEvent, wait } from '../utils';\nimport { createScrollSteps, inertialInterpolator, linearInterpolator } from './utils';\n\ninterface CommonScrollToOptions {\n contentSize?: Size;\n layoutMeasurement?: Size;\n}\n\nexport interface VerticalScrollToOptions extends CommonScrollToOptions {\n y: number;\n momentumY?: number;\n\n // Vertical scroll should not contain horizontal scroll part.\n x?: never;\n momentumX?: never;\n}\n\nexport interface HorizontalScrollToOptions extends CommonScrollToOptions {\n x: number;\n momentumX?: number;\n\n // Horizontal scroll should not contain vertical scroll part.\n y?: never;\n momentumY?: never;\n}\n\nexport type ScrollToOptions = VerticalScrollToOptions | HorizontalScrollToOptions;\n\nexport async function scrollTo(\n this: UserEventInstance,\n instance: TestInstance,\n options: ScrollToOptions,\n): Promise<void> {\n if (!isHostScrollView(instance)) {\n throw new ErrorWithStack(\n `scrollTo() works only with host \"ScrollView\" instances. Passed instance has type \"${instance.type}\".`,\n scrollTo,\n );\n }\n\n ensureScrollViewDirection(instance, options);\n\n await dispatchEvent(\n instance,\n 'contentSizeChange',\n options.contentSize?.width ?? 0,\n options.contentSize?.height ?? 0,\n );\n\n const initialOffset = nativeState.contentOffsetForInstance.get(instance) ?? { x: 0, y: 0 };\n const dragSteps = createScrollSteps(\n { y: options.y, x: options.x },\n initialOffset,\n linearInterpolator,\n );\n await emitDragScrollEvents(this.config, instance, dragSteps, options);\n\n const momentumStart = dragSteps.at(-1) ?? initialOffset;\n const momentumSteps = createScrollSteps(\n { y: options.momentumY, x: options.momentumX },\n momentumStart,\n inertialInterpolator,\n );\n await emitMomentumScrollEvents(this.config, instance, momentumSteps, options);\n\n const finalOffset = momentumSteps.at(-1) ?? dragSteps.at(-1) ?? initialOffset;\n nativeState.contentOffsetForInstance.set(instance, finalOffset);\n}\n\nasync function emitDragScrollEvents(\n config: UserEventConfig,\n instance: TestInstance,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(instance, 'scrollBeginDrag', buildScrollEvent(scrollSteps[0], scrollOptions));\n\n // Note: experimentally, in case of drag scroll the last scroll step\n // will not trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length - 1; i += 1) {\n await wait(config);\n await dispatchEvent(instance, 'scroll', buildScrollEvent(scrollSteps[i], scrollOptions));\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(instance, 'scrollEndDrag', buildScrollEvent(lastStep, scrollOptions));\n}\n\nasync function emitMomentumScrollEvents(\n config: UserEventConfig,\n instance: TestInstance,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(\n instance,\n 'momentumScrollBegin',\n buildScrollEvent(scrollSteps[0], scrollOptions),\n );\n\n // Note: experimentally, in case of momentum scroll the last scroll step\n // will trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length; i += 1) {\n await wait(config);\n await dispatchEvent(instance, 'scroll', buildScrollEvent(scrollSteps[i], scrollOptions));\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(instance, 'momentumScrollEnd', buildScrollEvent(lastStep, scrollOptions));\n}\n\nfunction ensureScrollViewDirection(instance: TestInstance, options: ScrollToOptions) {\n const isVerticalScrollView = instance.props.horizontal !== true;\n\n const hasHorizontalScrollOptions = options.x !== undefined || options.momentumX !== undefined;\n if (isVerticalScrollView && hasHorizontalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only vertical scroll options: \"y\" and \"momentumY\" for vertical \"ScrollView\" element but received ${stringify(\n pick(options, ['x', 'momentumX']),\n )}`,\n scrollTo,\n );\n }\n\n const hasVerticalScrollOptions = options.y !== undefined || options.momentumY !== undefined;\n if (!isVerticalScrollView && hasVerticalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only horizontal scroll options: \"x\" and \"momentumX\" for horizontal \"ScrollView\" element but received ${stringify(\n pick(options, ['y', 'momentumY']),\n )}`,\n scrollTo,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"scroll-to.js","names":["_jestMatcherUtils","require","_eventBuilder","_errors","_hostComponentNames","_object","_nativeState","_utils","_utils2","scrollTo","instance","options","isHostScrollView","ErrorWithStack","type","ensureScrollViewDirection","dispatchEvent","contentSize","width","height","initialOffset","nativeState","contentOffsetForInstance","get","x","y","dragSteps","createScrollSteps","linearInterpolator","emitDragScrollEvents","config","momentumStart","at","momentumSteps","momentumY","momentumX","inertialInterpolator","emitMomentumScrollEvents","finalOffset","set","scrollSteps","scrollOptions","length","wait","buildScrollEvent","i","lastStep","isVerticalScrollView","props","horizontal","hasHorizontalScrollOptions","undefined","stringify","pick","hasVerticalScrollOptions"],"sources":["../../../src/user-event/scroll/scroll-to.ts"],"sourcesContent":["import { stringify } from 'jest-matcher-utils';\nimport type { TestInstance } from 'test-renderer';\n\nimport { buildScrollEvent } from '../../event-builder';\nimport { ErrorWithStack } from '../../helpers/errors';\nimport { isHostScrollView } from '../../helpers/host-component-names';\nimport { pick } from '../../helpers/object';\nimport { nativeState } from '../../native-state';\nimport type { Point, Size } from '../../types';\nimport type { UserEventConfig, UserEventInstance } from '../setup';\nimport { dispatchEvent, wait } from '../utils';\nimport { createScrollSteps, inertialInterpolator, linearInterpolator } from './utils';\n\ninterface CommonScrollToOptions {\n contentSize?: Size;\n layoutMeasurement?: Size;\n}\n\nexport interface VerticalScrollToOptions extends CommonScrollToOptions {\n y: number;\n momentumY?: number;\n\n // Vertical scroll should not contain horizontal scroll part.\n x?: never;\n momentumX?: never;\n}\n\nexport interface HorizontalScrollToOptions extends CommonScrollToOptions {\n x: number;\n momentumX?: number;\n\n // Horizontal scroll should not contain vertical scroll part.\n y?: never;\n momentumY?: never;\n}\n\nexport type ScrollToOptions = VerticalScrollToOptions | HorizontalScrollToOptions;\n\nexport async function scrollTo(\n this: UserEventInstance,\n instance: TestInstance,\n options: ScrollToOptions,\n): Promise<void> {\n if (!isHostScrollView(instance)) {\n throw new ErrorWithStack(\n `scrollTo() works only with host \"ScrollView\" instances. Passed instance has type \"${instance.type}\".`,\n scrollTo,\n );\n }\n\n ensureScrollViewDirection(instance, options);\n\n await dispatchEvent(\n instance,\n 'contentSizeChange',\n options.contentSize?.width ?? 0,\n options.contentSize?.height ?? 0,\n );\n\n const initialOffset = nativeState.contentOffsetForInstance.get(instance) ?? {\n x: 0,\n y: 0,\n };\n const dragSteps = createScrollSteps(\n { y: options.y, x: options.x },\n initialOffset,\n linearInterpolator,\n );\n await emitDragScrollEvents(this.config, instance, dragSteps, options);\n\n const momentumStart = dragSteps.at(-1) ?? initialOffset;\n const momentumSteps = createScrollSteps(\n { y: options.momentumY, x: options.momentumX },\n momentumStart,\n inertialInterpolator,\n );\n await emitMomentumScrollEvents(this.config, instance, momentumSteps, options);\n\n const finalOffset = momentumSteps.at(-1) ?? dragSteps.at(-1) ?? initialOffset;\n nativeState.contentOffsetForInstance.set(instance, finalOffset);\n}\n\nasync function emitDragScrollEvents(\n config: UserEventConfig,\n instance: TestInstance,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(instance, 'scrollBeginDrag', buildScrollEvent(scrollSteps[0], scrollOptions));\n\n // Note: experimentally, in case of drag scroll the last scroll step\n // will not trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length - 1; i += 1) {\n await wait(config);\n await dispatchEvent(instance, 'scroll', buildScrollEvent(scrollSteps[i], scrollOptions));\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(instance, 'scrollEndDrag', buildScrollEvent(lastStep, scrollOptions));\n}\n\nasync function emitMomentumScrollEvents(\n config: UserEventConfig,\n instance: TestInstance,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(\n instance,\n 'momentumScrollBegin',\n buildScrollEvent(scrollSteps[0], scrollOptions),\n );\n\n // Note: experimentally, in case of momentum scroll the last scroll step\n // will trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length; i += 1) {\n await wait(config);\n await dispatchEvent(instance, 'scroll', buildScrollEvent(scrollSteps[i], scrollOptions));\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(instance, 'momentumScrollEnd', buildScrollEvent(lastStep, scrollOptions));\n}\n\nfunction ensureScrollViewDirection(instance: TestInstance, options: ScrollToOptions) {\n const isVerticalScrollView = instance.props.horizontal !== true;\n\n const hasHorizontalScrollOptions = options.x !== undefined || options.momentumX !== undefined;\n if (isVerticalScrollView && hasHorizontalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only vertical scroll options: \"y\" and \"momentumY\" for vertical \"ScrollView\" element but received ${stringify(\n pick(options, ['x', 'momentumX']),\n )}`,\n scrollTo,\n );\n }\n\n const hasVerticalScrollOptions = options.y !== undefined || options.momentumY !== undefined;\n if (!isVerticalScrollView && hasVerticalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only horizontal scroll options: \"x\" and \"momentumX\" for horizontal \"ScrollView\" element but received ${stringify(\n pick(options, ['y', 'momentumY']),\n )}`,\n scrollTo,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -400,7 +400,9 @@ expect(
400
400
 
401
401
  // Include hidden elements
402
402
  expect(
403
- screen.getByText('Hidden from accessibility', { includeHiddenElements: true }),
403
+ screen.getByText('Hidden from accessibility', {
404
+ includeHiddenElements: true,
405
+ }),
404
406
  ).toBeOnTheScreen();
405
407
  ```
406
408
 
@@ -121,7 +121,10 @@ You can also transform prop values so that they are more readable (e.g., flatten
121
121
  import { StyleSheet } from 'react-native';
122
122
 
123
123
  screen.debug({
124
- mapProps: ({ style, ...props }) => ({ style: StyleSheet.flatten(style), ...props }),
124
+ mapProps: ({ style, ...props }) => ({
125
+ style: StyleSheet.flatten(style),
126
+ ...props,
127
+ }),
125
128
  });
126
129
  ```
127
130
 
@@ -8,10 +8,10 @@ Open a Terminal in your project's folder and run:
8
8
 
9
9
  <PackageManagerTabs
10
10
  command={{
11
- npm: 'npm install -D @testing-library/react-native',
12
- yarn: 'yarn add -D @testing-library/react-native',
13
- pnpm: 'pnpm add -D @testing-library/react-native',
14
- bun: 'bun add -D @testing-library/react-native',
11
+ npm: 'npm install -D @testing-library/react-native@next',
12
+ yarn: 'yarn add -D @testing-library/react-native@next',
13
+ pnpm: 'pnpm add -D @testing-library/react-native@next',
14
+ bun: 'bun add -D @testing-library/react-native@next',
15
15
  }}
16
16
  />
17
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testing-library/react-native",
3
- "version": "14.0.0-rc.2",
3
+ "version": "14.0.0-rc.3",
4
4
  "description": "Simple and complete React Native testing utilities that encourage good testing practices.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -33,12 +33,12 @@
33
33
  "typecheck": "tsc",
34
34
  "typecheck:react-19_2": "tsc -p tsconfig.react-19_2.json",
35
35
  "lint": "eslint src --cache",
36
- "prettier": "prettier --check .",
37
- "prettier:fix": "prettier --write .",
38
- "validate": "yarn typecheck && yarn test && yarn lint && yarn prettier",
36
+ "format:check": "oxfmt --check .",
37
+ "format:fix": "oxfmt --write .",
38
+ "validate": "yarn typecheck && yarn test && yarn lint && yarn format:check",
39
39
  "validate:examples": "yarn --cwd examples/basic validate && yarn --cwd examples/cookbook validate",
40
40
  "validate:all": "yarn validate && yarn validate:examples && yarn docs:check && yarn --cwd website validate && yarn --cwd experiments-app validate",
41
- "validate:fix": "yarn prettier:fix && yarn lint --fix && yarn typecheck && yarn test -u && docs:generate",
41
+ "validate:fix": "yarn format:fix && yarn lint --fix && yarn typecheck && yarn test -u && yarn docs:generate",
42
42
  "build:js": "babel src --out-dir dist --extensions \".js,.ts,.jsx,.tsx\" --source-maps --ignore \"**/__tests__/**\"",
43
43
  "build:ts": "tsc --build tsconfig.release.json",
44
44
  "build": "yarn clean && yarn build:js && yarn build:ts",
@@ -56,9 +56,9 @@
56
56
  "docs/"
57
57
  ],
58
58
  "dependencies": {
59
- "jest-matcher-utils": "^30.3.0",
59
+ "jest-matcher-utils": "^30.4.1",
60
60
  "picocolors": "^1.1.1",
61
- "pretty-format": "^30.3.0",
61
+ "pretty-format": "^30.4.1",
62
62
  "redent": "^3.0.0"
63
63
  },
64
64
  "peerDependencies": {
@@ -73,42 +73,42 @@
73
73
  }
74
74
  },
75
75
  "devDependencies": {
76
- "@babel/cli": "^7.28.6",
77
- "@babel/core": "^7.29.0",
78
- "@babel/plugin-transform-strict-mode": "^7.27.1",
79
- "@babel/preset-env": "^7.29.2",
80
- "@babel/preset-react": "^7.28.5",
81
- "@babel/preset-typescript": "^7.28.5",
76
+ "@babel/cli": "^7.29.7",
77
+ "@babel/core": "^7.29.7",
78
+ "@babel/plugin-transform-strict-mode": "^7.29.7",
79
+ "@babel/preset-env": "^7.29.7",
80
+ "@babel/preset-react": "^7.29.7",
81
+ "@babel/preset-typescript": "^7.29.7",
82
82
  "@callstack/eslint-config": "^15.0.0",
83
- "@eslint/compat": "^2.0.5",
83
+ "@eslint/compat": "^2.1.0",
84
84
  "@eslint/js": "^10.0.1",
85
- "@react-native/babel-preset": "0.85.0",
86
- "@react-native/jest-preset": "0.85.0",
87
- "@release-it/conventional-changelog": "^10.0.6",
85
+ "@react-native/babel-preset": "0.85.3",
86
+ "@react-native/jest-preset": "0.85.3",
87
+ "@release-it/conventional-changelog": "^11.0.0",
88
88
  "@relmify/jest-serializer-strip-ansi": "^1.0.2",
89
89
  "@types/jest": "^30.0.0",
90
- "@types/node": "^24.12.2",
91
- "@types/react": "^19.2.14",
92
- "babel-jest": "^30.3.0",
90
+ "@types/node": "^24.12.4",
91
+ "@types/react": "^19.2.15",
92
+ "babel-jest": "^30.4.1",
93
93
  "babel-plugin-module-resolver": "^5.0.3",
94
94
  "del-cli": "^7.0.0",
95
- "eslint": "^10.2.0",
96
- "eslint-plugin-simple-import-sort": "^12.1.1",
97
- "jest": "^30.3.0",
98
- "prettier": "^3.8.2",
95
+ "eslint": "^10.4.0",
96
+ "jest": "^30.4.2",
97
+ "oxfmt": "^0.52.0",
99
98
  "react": "19.2.3",
100
- "react-native": "0.85.0",
101
- "release-it": "^19.2.4",
99
+ "react-native": "0.85.3",
100
+ "release-it": "^20.0.1",
102
101
  "test-renderer": "1.2.0",
103
- "tsx": "^4.21.0",
104
- "typescript": "^6.0.2",
105
- "typescript-eslint": "^8.58.1"
102
+ "tsx": "^4.22.3",
103
+ "typescript": "^6.0.3",
104
+ "typescript-eslint": "^8.60.0"
106
105
  },
107
106
  "publishConfig": {
108
107
  "registry": "https://registry.npmjs.org"
109
108
  },
110
109
  "resolutions": {
111
- "@eslint/compat": "^2.0.5"
110
+ "@eslint/compat": "^2.1.0",
111
+ "jest-environment-node": "30.4.1"
112
112
  },
113
113
  "packageManager": "yarn@4.11.0",
114
114
  "engines": {