diff --git a/.changepacks/changepack_log_1X3KB51ltpzMpxIMRC5gP.json b/.changepacks/changepack_log_1X3KB51ltpzMpxIMRC5gP.json new file mode 100644 index 0000000..d47398a --- /dev/null +++ b/.changepacks/changepack_log_1X3KB51ltpzMpxIMRC5gP.json @@ -0,0 +1,5 @@ +{ + "changes": { "package.json": "Patch" }, + "note": "Fix bun issue", + "date": "2026-01-02T12:51:33.602062900Z" +} diff --git a/src/__tests__/__snapshots__/snapshot.test.tsx.snap b/src/__tests__/__snapshots__/snapshot.test.tsx.snap index 7afba47..3c12b30 100644 --- a/src/__tests__/__snapshots__/snapshot.test.tsx.snap +++ b/src/__tests__/__snapshots__/snapshot.test.tsx.snap @@ -2,13 +2,11 @@ exports[`SnapshotTest React element snapshot 1`] = ` "
+ before
- before -
- SnapshotTestInner -
- after + SnapshotTestInner
+ after
" `; diff --git a/src/__tests__/dom.test.tsx b/src/__tests__/dom.test.tsx new file mode 100644 index 0000000..8ce5d10 --- /dev/null +++ b/src/__tests__/dom.test.tsx @@ -0,0 +1,36 @@ +import { describe, expect, test } from 'bun:test' +import { createElement } from 'react' +import { render } from '../index.ts' + +function DomTestInner() { + return createElement( + 'div', + { + className: 'dom-test-inner', + }, + 'DomTestInner', + ) +} + +function DomTest() { + return createElement( + 'div', + { + className: 'dom-test', + }, + 'before', + createElement(DomTestInner), + 'after', + ) +} + +describe('SnapshotTest', () => { + test('HTML element snapshot with render', () => { + const { container } = render(createElement(DomTest)) + expect(container.children[0]).toHaveClass('dom-test') + }) + + test('HTML element snapshot with render', () => { + expect(createElement(DomTest)).toHaveClass('dom-test') + }) +}) diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts index 24df394..3b5e02a 100644 --- a/src/__tests__/index.test.ts +++ b/src/__tests__/index.test.ts @@ -9,15 +9,6 @@ describe('expect with ReactElement', () => { }) }) -describe('expect with HTMLElement', () => { - test('should format HTMLElement', () => { - const div = document.createElement('div') - div.textContent = 'Hello DOM' - // @ts-expect-error - mock transforms HTMLElement to string at runtime - expect(div).toContain('Hello DOM') - }) -}) - describe('expect with primitive value', () => { test('should pass through primitive values', () => { expect('hello').toBe('hello') diff --git a/src/index.ts b/src/index.ts index 52eac1c..e3f79e9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,15 +12,33 @@ if (!GlobalRegistrator.isRegistered) { GlobalRegistrator.register() expect.extend(matchers) + const methods = ['toMatchSnapshot', 'toMatchInlineSnapshot', 'toContain'] + const originalExpect = expect test.mock.module('bun:test', () => { const expect = (value: unknown) => { - if (isReactElement(value)) { - const { container } = render(value as ReactElement) - return originalExpect(formatHTMLElement(container)) - } - if (value instanceof HTMLElement) { - return originalExpect(formatHTMLElement(value)) + if (value instanceof HTMLElement || isReactElement(value)) { + const element = + value instanceof HTMLElement + ? value + : (render(value as ReactElement).container + .children[0] as HTMLElement) + const stringRet = originalExpect(formatHTMLElement(element)) + const jsonRet = originalExpect(element) + for (const method of methods) { + ;(jsonRet as unknown as Record)[method] = ( + ...args: unknown[] + ) => { + return ( + stringRet as unknown as Record< + string, + (...args: unknown[]) => unknown + > + )[method]?.(...(args as [object, string])) + } + } + + return jsonRet } return originalExpect(value) }