From 731caac04da66297334cfc50612d337c70bad39b Mon Sep 17 00:00:00 2001 From: himself65 Date: Mon, 7 Nov 2022 09:45:55 -0600 Subject: [PATCH 1/2] feat: support `props.onCopy` --- src/components/DataKeyPair.tsx | 7 +- src/hooks/useCopyToClipboard.ts | 55 +++++++++--- src/index.tsx | 1 + src/stores/JsonViewerStore.ts | 9 +- src/type.ts | 27 ++++-- yarn.lock | 144 ++++++++++---------------------- 6 files changed, 118 insertions(+), 125 deletions(-) diff --git a/src/components/DataKeyPair.tsx b/src/components/DataKeyPair.tsx index d38b678b..34606415 100644 --- a/src/components/DataKeyPair.tsx +++ b/src/components/DataKeyPair.tsx @@ -113,11 +113,8 @@ export const DataKeyPair: React.FC = (props) => { event.preventDefault() try { copy( - JSON.stringify( - typeof value === 'function' ? value.toString() : value, - null, - ' ' - ) + path, + value ) } catch (e) { // in some case, this will throw error diff --git a/src/hooks/useCopyToClipboard.ts b/src/hooks/useCopyToClipboard.ts index 9bff7cf3..e72f1616 100644 --- a/src/hooks/useCopyToClipboard.ts +++ b/src/hooks/useCopyToClipboard.ts @@ -1,6 +1,9 @@ import copyToClipboard from 'copy-to-clipboard' import { useCallback, useRef, useState } from 'react' +import { useJsonViewerStore } from '../stores/JsonViewerStore' +import type { JsonViewerOnCopy } from '../type' + /** * useClipboard hook accepts one argument options in which copied status timeout duration is defined (defaults to 2000). Hook returns object with properties: * - copy – function to copy value to clipboard @@ -19,19 +22,51 @@ export function useClipboard ({ timeout = 2000 } = {}) { copyTimeout.current = window.setTimeout(() => setCopied(false), timeout) setCopied(value) }, [timeout]) + const onCopy = useJsonViewerStore(store => store.onCopy) - const copy = useCallback((valueToCopy: string) => { - if ('clipboard' in navigator) { - navigator.clipboard - .writeText(valueToCopy) - .then(() => handleCopyResult(true)) - // When navigator.clipboard throws an error, fallback to copy-to-clipboard package - .catch(() => copyToClipboard(valueToCopy)) + const copy = useCallback((path, value: unknown) => { + if (typeof onCopy === 'function') { + try { + const result = onCopy(path, value) + if (result instanceof Promise) { + result.then(() => { + handleCopyResult(true) + }).catch((error) => { + console.error( + `error when copy ${path.length === 0 + ? 'src' + : `src[${path.join( + '.')}` + }]`, error) + }) + } else { + handleCopyResult(true) + } + } catch (error) { + console.error( + `error when copy ${path.length === 0 + ? 'src' + : `src[${path.join( + '.')}` + }]`, error) + } } else { - // fallback to copy-to-clipboard when navigator.clipboard is not available - copyToClipboard(valueToCopy) + const valueToCopy = JSON.stringify( + typeof value === 'function' ? value.toString() : value, + null, + ' ' + ) + if ('clipboard' in navigator) { + navigator.clipboard.writeText(valueToCopy) + .then(() => handleCopyResult(true)) + // When navigator.clipboard throws an error, fallback to copy-to-clipboard package + .catch(() => copyToClipboard(valueToCopy)) + } else { + // fallback to copy-to-clipboard when navigator.clipboard is not available + copyToClipboard(valueToCopy) + } } - }, [handleCopyResult]) + }, [handleCopyResult, onCopy]) const reset = useCallback(() => { setCopied(false) diff --git a/src/index.tsx b/src/index.tsx index af0b581e..84800160 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -56,6 +56,7 @@ const JsonViewerInner: React.FC = (props) => { useSetIfNotUndefinedEffect('rootName', props.rootName) useSetIfNotUndefinedEffect('displayDataTypes', props.displayDataTypes) useSetIfNotUndefinedEffect('displayObjectSize', props.displayObjectSize) + useSetIfNotUndefinedEffect('onCopy', props.onCopy) useEffect(() => { if (props.theme === 'light') { api.setState({ diff --git a/src/stores/JsonViewerStore.ts b/src/stores/JsonViewerStore.ts index 7f22a009..08167113 100644 --- a/src/stores/JsonViewerStore.ts +++ b/src/stores/JsonViewerStore.ts @@ -3,7 +3,12 @@ import create from 'zustand' import createContext from 'zustand/context' import { combine } from 'zustand/middleware' -import type { JsonViewerOnChange, JsonViewerProps, Path } from '..' +import type { + JsonViewerOnChange, + JsonViewerOnCopy, + JsonViewerProps, + Path +} from '..' import type { Colorspace } from '../theme/base16' import { lightColorspace } from '../theme/base16' import type { JsonViewerKeyRenderer } from '../type' @@ -28,6 +33,7 @@ export type JsonViewerState = { rootName: false | string value: T onChange: JsonViewerOnChange + onCopy: JsonViewerOnCopy | undefined keyRenderer: JsonViewerKeyRenderer displayObjectSize: boolean } @@ -54,6 +60,7 @@ export const createJsonViewerStore = (props: JsonViewerProps) = maxDisplayLength: props.maxDisplayLength ?? 30, rootName: props.rootName ?? 'root', onChange: props.onChange ?? (() => {}), + onCopy: props.onCopy ?? undefined, keyRenderer: props.keyRenderer ?? DefaultKeyRenderer, editable: props.editable ?? false, defaultInspectDepth: props.defaultInspectDepth ?? 5, diff --git a/src/type.ts b/src/type.ts index af4d3fe4..5b868e88 100644 --- a/src/type.ts +++ b/src/type.ts @@ -5,10 +5,24 @@ import type { Colorspace } from './theme/base16' export type Path = (string | number)[] +/** + * @param path path to the target value + * @param oldValue + * @param newValue + */ export type JsonViewerOnChange = ( - path: (string | number)[], oldValue: U, + path: Path, oldValue: U, newValue: U /*, type: ChangeType */) => void +/** + * @param path path to the target value + * @param value + */ +export type JsonViewerOnCopy = ( + path: Path, + value: U +) => unknown | Promise + export interface DataItemProps { inspect: boolean setInspect: Dispatch> @@ -33,7 +47,7 @@ export type DataType = { } export interface JsonViewerKeyRenderer extends React.FC { - when(props: DataItemProps): boolean + when (props: DataItemProps): boolean } export type JsonViewerTheme = 'light' | 'dark' | 'auto' | Colorspace @@ -59,13 +73,8 @@ export type JsonViewerProps = { */ keyRenderer?: JsonViewerKeyRenderer valueTypes?: DataType[] - /** - * - * @param path path to the target value - * @param oldValue - * @param newValue - */ - onChange?: (path: Path, oldValue: U, newValue: U) => void + onChange?: JsonViewerOnChange + onCopy?: JsonViewerOnCopy /** * Whether enable clipboard feature. * diff --git a/yarn.lock b/yarn.lock index 0e731b26..955771d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1620,137 +1620,95 @@ __metadata: languageName: node linkType: hard -"@swc/core-android-arm-eabi@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-android-arm-eabi@npm:1.3.6" - dependencies: - "@swc/wasm": 1.2.122 - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@swc/core-android-arm64@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-android-arm64@npm:1.3.6" - dependencies: - "@swc/wasm": 1.2.130 - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@swc/core-darwin-arm64@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-darwin-arm64@npm:1.3.6" +"@swc/core-darwin-arm64@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-darwin-arm64@npm:1.3.14" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-darwin-x64@npm:1.3.6" +"@swc/core-darwin-x64@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-darwin-x64@npm:1.3.14" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-freebsd-x64@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-freebsd-x64@npm:1.3.6" - dependencies: - "@swc/wasm": 1.2.130 - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@swc/core-linux-arm-gnueabihf@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.6" - dependencies: - "@swc/wasm": 1.2.130 +"@swc/core-linux-arm-gnueabihf@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.14" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.6" +"@swc/core-linux-arm64-gnu@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.14" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.6" +"@swc/core-linux-arm64-musl@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.14" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.6" +"@swc/core-linux-x64-gnu@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.14" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-linux-x64-musl@npm:1.3.6" +"@swc/core-linux-x64-musl@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-x64-musl@npm:1.3.14" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.6" - dependencies: - "@swc/wasm": 1.2.130 +"@swc/core-win32-arm64-msvc@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.14" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.6" - dependencies: - "@swc/wasm": 1.2.130 +"@swc/core-win32-ia32-msvc@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.14" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.6": - version: 1.3.6 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.6" +"@swc/core-win32-x64-msvc@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.14" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.6": - version: 1.3.6 - resolution: "@swc/core@npm:1.3.6" - dependencies: - "@swc/core-android-arm-eabi": 1.3.6 - "@swc/core-android-arm64": 1.3.6 - "@swc/core-darwin-arm64": 1.3.6 - "@swc/core-darwin-x64": 1.3.6 - "@swc/core-freebsd-x64": 1.3.6 - "@swc/core-linux-arm-gnueabihf": 1.3.6 - "@swc/core-linux-arm64-gnu": 1.3.6 - "@swc/core-linux-arm64-musl": 1.3.6 - "@swc/core-linux-x64-gnu": 1.3.6 - "@swc/core-linux-x64-musl": 1.3.6 - "@swc/core-win32-arm64-msvc": 1.3.6 - "@swc/core-win32-ia32-msvc": 1.3.6 - "@swc/core-win32-x64-msvc": 1.3.6 + version: 1.3.14 + resolution: "@swc/core@npm:1.3.14" + dependencies: + "@swc/core-darwin-arm64": 1.3.14 + "@swc/core-darwin-x64": 1.3.14 + "@swc/core-linux-arm-gnueabihf": 1.3.14 + "@swc/core-linux-arm64-gnu": 1.3.14 + "@swc/core-linux-arm64-musl": 1.3.14 + "@swc/core-linux-x64-gnu": 1.3.14 + "@swc/core-linux-x64-musl": 1.3.14 + "@swc/core-win32-arm64-msvc": 1.3.14 + "@swc/core-win32-ia32-msvc": 1.3.14 + "@swc/core-win32-x64-msvc": 1.3.14 dependenciesMeta: - "@swc/core-android-arm-eabi": - optional: true - "@swc/core-android-arm64": - optional: true "@swc/core-darwin-arm64": optional: true "@swc/core-darwin-x64": optional: true - "@swc/core-freebsd-x64": - optional: true "@swc/core-linux-arm-gnueabihf": optional: true "@swc/core-linux-arm64-gnu": @@ -1769,7 +1727,7 @@ __metadata: optional: true bin: swcx: run_swcx.js - checksum: be35bdb0f723863c7bc88138e1e850b4711a4c67307186f8b06a5defb24710f16eb552eda698441b82022f30cbe076ea47f4308f66f1e6dd98ff44d2e6047929 + checksum: 79e9857ee3d5af22d9a6e644d7608594fa8ccd9102dbc088addc0f6ee9e1e8e3fc8835545730707395aa47197ab119fa323aedf4184cf51892379b307aedddc0 languageName: node linkType: hard @@ -1782,20 +1740,6 @@ __metadata: languageName: node linkType: hard -"@swc/wasm@npm:1.2.122": - version: 1.2.122 - resolution: "@swc/wasm@npm:1.2.122" - checksum: 563345370c5ad18373d3b403590ab880fe52dcd8fc8c8601be263fcd9886520b28a7f4e46236cf49ca2b136c79d4ef50c960bc34b7cdc2068118b0d84dfca1f4 - languageName: node - linkType: hard - -"@swc/wasm@npm:1.2.130": - version: 1.2.130 - resolution: "@swc/wasm@npm:1.2.130" - checksum: 02203bfef3e382c64cbbd63c138c8fdf61865e74d923b317e9d9e9f33f5a3f0a9533b5fdbc9505e76d78e864be04a82fc847eb987a1e47ccac5850146c858292 - languageName: node - linkType: hard - "@testing-library/dom@npm:^8.5.0": version: 8.18.1 resolution: "@testing-library/dom@npm:8.18.1" From 00973dd3a0e8ef6f84c5b087fcb94d7afd9aa22a Mon Sep 17 00:00:00 2001 From: himself65 Date: Mon, 7 Nov 2022 09:47:15 -0600 Subject: [PATCH 2/2] fix: revert `yarn.lock` --- yarn.lock | 144 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 100 insertions(+), 44 deletions(-) diff --git a/yarn.lock b/yarn.lock index 955771d7..0e731b26 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1620,95 +1620,137 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.14": - version: 1.3.14 - resolution: "@swc/core-darwin-arm64@npm:1.3.14" +"@swc/core-android-arm-eabi@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-android-arm-eabi@npm:1.3.6" + dependencies: + "@swc/wasm": 1.2.122 + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@swc/core-android-arm64@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-android-arm64@npm:1.3.6" + dependencies: + "@swc/wasm": 1.2.130 + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-darwin-arm64@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-darwin-arm64@npm:1.3.6" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.14": - version: 1.3.14 - resolution: "@swc/core-darwin-x64@npm:1.3.14" +"@swc/core-darwin-x64@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-darwin-x64@npm:1.3.6" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.14": - version: 1.3.14 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.14" +"@swc/core-freebsd-x64@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-freebsd-x64@npm:1.3.6" + dependencies: + "@swc/wasm": 1.2.130 + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-linux-arm-gnueabihf@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.6" + dependencies: + "@swc/wasm": 1.2.130 conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.14": - version: 1.3.14 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.14" +"@swc/core-linux-arm64-gnu@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.6" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.14": - version: 1.3.14 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.14" +"@swc/core-linux-arm64-musl@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.6" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.14": - version: 1.3.14 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.14" +"@swc/core-linux-x64-gnu@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.6" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.14": - version: 1.3.14 - resolution: "@swc/core-linux-x64-musl@npm:1.3.14" +"@swc/core-linux-x64-musl@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-linux-x64-musl@npm:1.3.6" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.14": - version: 1.3.14 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.14" +"@swc/core-win32-arm64-msvc@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.6" + dependencies: + "@swc/wasm": 1.2.130 conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.14": - version: 1.3.14 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.14" +"@swc/core-win32-ia32-msvc@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.6" + dependencies: + "@swc/wasm": 1.2.130 conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.14": - version: 1.3.14 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.14" +"@swc/core-win32-x64-msvc@npm:1.3.6": + version: 1.3.6 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.6" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.6": - version: 1.3.14 - resolution: "@swc/core@npm:1.3.14" - dependencies: - "@swc/core-darwin-arm64": 1.3.14 - "@swc/core-darwin-x64": 1.3.14 - "@swc/core-linux-arm-gnueabihf": 1.3.14 - "@swc/core-linux-arm64-gnu": 1.3.14 - "@swc/core-linux-arm64-musl": 1.3.14 - "@swc/core-linux-x64-gnu": 1.3.14 - "@swc/core-linux-x64-musl": 1.3.14 - "@swc/core-win32-arm64-msvc": 1.3.14 - "@swc/core-win32-ia32-msvc": 1.3.14 - "@swc/core-win32-x64-msvc": 1.3.14 + version: 1.3.6 + resolution: "@swc/core@npm:1.3.6" + dependencies: + "@swc/core-android-arm-eabi": 1.3.6 + "@swc/core-android-arm64": 1.3.6 + "@swc/core-darwin-arm64": 1.3.6 + "@swc/core-darwin-x64": 1.3.6 + "@swc/core-freebsd-x64": 1.3.6 + "@swc/core-linux-arm-gnueabihf": 1.3.6 + "@swc/core-linux-arm64-gnu": 1.3.6 + "@swc/core-linux-arm64-musl": 1.3.6 + "@swc/core-linux-x64-gnu": 1.3.6 + "@swc/core-linux-x64-musl": 1.3.6 + "@swc/core-win32-arm64-msvc": 1.3.6 + "@swc/core-win32-ia32-msvc": 1.3.6 + "@swc/core-win32-x64-msvc": 1.3.6 dependenciesMeta: + "@swc/core-android-arm-eabi": + optional: true + "@swc/core-android-arm64": + optional: true "@swc/core-darwin-arm64": optional: true "@swc/core-darwin-x64": optional: true + "@swc/core-freebsd-x64": + optional: true "@swc/core-linux-arm-gnueabihf": optional: true "@swc/core-linux-arm64-gnu": @@ -1727,7 +1769,7 @@ __metadata: optional: true bin: swcx: run_swcx.js - checksum: 79e9857ee3d5af22d9a6e644d7608594fa8ccd9102dbc088addc0f6ee9e1e8e3fc8835545730707395aa47197ab119fa323aedf4184cf51892379b307aedddc0 + checksum: be35bdb0f723863c7bc88138e1e850b4711a4c67307186f8b06a5defb24710f16eb552eda698441b82022f30cbe076ea47f4308f66f1e6dd98ff44d2e6047929 languageName: node linkType: hard @@ -1740,6 +1782,20 @@ __metadata: languageName: node linkType: hard +"@swc/wasm@npm:1.2.122": + version: 1.2.122 + resolution: "@swc/wasm@npm:1.2.122" + checksum: 563345370c5ad18373d3b403590ab880fe52dcd8fc8c8601be263fcd9886520b28a7f4e46236cf49ca2b136c79d4ef50c960bc34b7cdc2068118b0d84dfca1f4 + languageName: node + linkType: hard + +"@swc/wasm@npm:1.2.130": + version: 1.2.130 + resolution: "@swc/wasm@npm:1.2.130" + checksum: 02203bfef3e382c64cbbd63c138c8fdf61865e74d923b317e9d9e9f33f5a3f0a9533b5fdbc9505e76d78e864be04a82fc847eb987a1e47ccac5850146c858292 + languageName: node + linkType: hard + "@testing-library/dom@npm:^8.5.0": version: 8.18.1 resolution: "@testing-library/dom@npm:8.18.1"