diff --git a/packages/editor/e2e-tests/e2e.config.ts b/packages/editor/e2e-tests/e2e.config.ts index 7599b8d0..21c48a80 100644 --- a/packages/editor/e2e-tests/e2e.config.ts +++ b/packages/editor/e2e-tests/e2e.config.ts @@ -1,14 +1,58 @@ +import path from 'node:path' import type {Config} from '@jest/types' -import {createJestConfig} from '../test-config/create-jest-config' -const config: Config.InitialOptions = createJestConfig({ +const config: Config.InitialOptions = { + globals: {}, globalSetup: './setup/globalSetup.ts', globalTeardown: './setup/globalTeardown.ts', + moduleFileExtensions: ['feature', 'js', 'ts'], + modulePathIgnorePatterns: [ + '/bin/', + '/coverage/', + '/lib/', + ], + resolver: path.resolve(__dirname, './resolver.cjs'), + setupFiles: [path.resolve(__dirname, './setup.ts')], setupFilesAfterEnv: ['./setup/afterEnv.ts'], + snapshotFormat: { + escapeString: true, + printBasicPrototype: true, + }, + testEnvironment: path.resolve(__dirname, './jsdom.jest.env.ts'), + testEnvironmentOptions: { + url: 'http://localhost:3333', + }, + testMatch: ['/**/*.{test,spec}.{js,ts,tsx}'], + testPathIgnorePatterns: ['/node_modules/', '/.yalc/'], transform: { '\\.feature$': '/feature-file-transformer.js', + '\\.[jt]sx?$': [ + 'babel-jest', + { + // Don't look for babel.config.{ts,js,json} files or .babelrc files + configFile: false, + babelrc: false, + // The rest is only needed by Jest, if Jest is updated to no longer need babel then this can be removed as well as related dependencies + presets: [ + [ + '@babel/preset-env', + { + targets: { + node: '14', + chrome: '61', + safari: '11.3', + firefox: '60', + edge: '79', + }, + }, + ], + '@babel/preset-typescript', + ['@babel/preset-react', {runtime: 'automatic'}], + ], + }, + ], }, - moduleFileExtensions: ['feature', 'js', 'ts'], -}) + transformIgnorePatterns: ['/node_modules/(?!(get-random-values-esm)/)'], +} export default config diff --git a/packages/editor/test-config/jsdom.jest.env.ts b/packages/editor/e2e-tests/jsdom.jest.env.ts similarity index 100% rename from packages/editor/test-config/jsdom.jest.env.ts rename to packages/editor/e2e-tests/jsdom.jest.env.ts diff --git a/packages/editor/test-config/resolver.cjs b/packages/editor/e2e-tests/resolver.cjs similarity index 100% rename from packages/editor/test-config/resolver.cjs rename to packages/editor/e2e-tests/resolver.cjs diff --git a/packages/editor/test-config/setup.ts b/packages/editor/e2e-tests/setup.ts similarity index 100% rename from packages/editor/test-config/setup.ts rename to packages/editor/e2e-tests/setup.ts diff --git a/packages/editor/jest.config.ts b/packages/editor/jest.config.ts deleted file mode 100644 index 5e6c8246..00000000 --- a/packages/editor/jest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import * as packageJson from './package.json' -import {createJestConfig} from './test-config/create-jest-config' - -const config = createJestConfig({ - displayName: packageJson.name, - modulePathIgnorePatterns: ['/e2e-tests'], -}) - -export default config diff --git a/packages/editor/package.json b/packages/editor/package.json index 954527e0..5d0ae50c 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -50,10 +50,10 @@ "dev:e2e-server": "cd ./e2e-tests/ && tsx serve", "lint:fix": "biome lint --write .", "prepublishOnly": "turbo run build", - "test": "jest", + "test": "vitest --run", + "test:watch": "vitest", "test:e2e": "jest --config=e2e-tests/e2e.config.ts", - "test:e2e:watch": "jest --config=e2e-tests/e2e.config.ts --watch", - "test:watch": "jest --watch" + "test:e2e:watch": "jest --config=e2e-tests/e2e.config.ts --watch" }, "dependencies": { "@portabletext/patches": "1.1.0", @@ -78,6 +78,7 @@ "@sanity/ui": "^2.8.9", "@sanity/util": "^3.55.0", "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^16.0.1", "@types/debug": "^4.1.5", "@types/express": "^4.17.21", @@ -96,6 +97,7 @@ "jest-dev-server": "^10.1.1", "jest-environment-jsdom": "^29.7.0", "jest-environment-node": "^29.7.0", + "jsdom": "^25.0.1", "node-ipc": "npm:@node-ipc/compat@9.2.5", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -104,7 +106,8 @@ "ts-node": "^10.9.2", "tsx": "^4.17.0", "typescript": "5.6.2", - "vite": "^5.4.2" + "vite": "^5.4.2", + "vitest": "^2.1.1" }, "peerDependencies": { "@sanity/block-tools": "^3.47.1", diff --git a/packages/editor/src/editor/__tests__/PortableTextEditor.test.tsx b/packages/editor/src/editor/__tests__/PortableTextEditor.test.tsx index e36c2a4c..df9cddf3 100644 --- a/packages/editor/src/editor/__tests__/PortableTextEditor.test.tsx +++ b/packages/editor/src/editor/__tests__/PortableTextEditor.test.tsx @@ -1,7 +1,7 @@ -import {describe, expect, it, jest} from '@jest/globals' import type {PortableTextBlock} from '@sanity/types' import {render, waitFor} from '@testing-library/react' import {createRef, type RefObject} from 'react' +import {describe, expect, it, vi} from 'vitest' import type {EditorSelection} from '../..' import {PortableTextEditor} from '../PortableTextEditor' import {PortableTextEditorTester, schemaType} from './PortableTextEditorTester' @@ -18,7 +18,7 @@ const renderPlaceholder = () => 'Jot something down here' describe('initialization', () => { it('receives initial onChange events and has custom placeholder', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() const {container} = render( { }) it('takes value from props and confirms it by emitting value change event', async () => { const initialValue = [helloBlock] - const onChange = jest.fn() + const onChange = vi.fn() const editorRef = createRef() render( { focus: {path: [{_key: '123'}, 'children', {_key: '567'}], offset: 2}, backward: false, } - const onChange = jest.fn() + const onChange = vi.fn() render( { focus: {path: [{_key: '123'}, 'children', {_key: '567'}], offset: 3}, backward: false, } - const onChange = jest.fn() + const onChange = vi.fn() const {rerender} = render( { anchor: {path: [{_key: '123'}, 'children', {_key: '567'}], offset: 2}, focus: {path: [{_key: '123'}, 'children', {_key: '567'}], offset: 2}, } - const onChange = jest.fn() + const onChange = vi.fn() render( { anchor: {path: [{_key: '123'}, 'children', {_key: '567'}], offset: 2}, focus: {path: [{_key: '123'}, 'children', {_key: '567'}], offset: 2}, } - const onChange = jest.fn() + const onChange = vi.fn() let _rerender: any await waitFor(() => { render( @@ -300,7 +300,7 @@ describe('initialization', () => { expect(onChange).toHaveBeenCalledWith({type: 'value', value}) }) value = [{_type: 'banana', _key: '123'}] - const newOnChange = jest.fn() + const newOnChange = vi.fn() _rerender( { anchor: {path: [{_key: '123'}, 'children', {_key: '567'}], offset: 2}, focus: {path: [{_key: '123'}, 'children', {_key: '567'}], offset: 2}, } - const onChange = jest.fn() + const onChange = vi.fn() render( props.onChange || jest.fn(), - [props.onChange], - ) + const onChange = useMemo(() => props.onChange || vi.fn(), [props.onChange]) return ( { describe('RangeDecorations', () => { it('only render range decorations as necessary', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() const value = [helloBlock] let rangeDecorations: RangeDecoration[] = [ { diff --git a/packages/editor/src/editor/__tests__/handleClick.test.tsx b/packages/editor/src/editor/__tests__/handleClick.test.tsx index 6b39e8e1..7163a05f 100644 --- a/packages/editor/src/editor/__tests__/handleClick.test.tsx +++ b/packages/editor/src/editor/__tests__/handleClick.test.tsx @@ -1,6 +1,6 @@ -import {describe, expect, it, jest} from '@jest/globals' import {fireEvent, render, waitFor} from '@testing-library/react' import {createRef, type RefObject} from 'react' +import {describe, expect, it, vi} from 'vitest' import {PortableTextEditor} from '../PortableTextEditor' import {PortableTextEditorTester, schemaType} from './PortableTextEditorTester' import {getEditableElement} from './utils' @@ -34,7 +34,7 @@ describe('adds empty text block if its needed', () => { } const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() const component = render( { } const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() const component = render( { } const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() const component = render( { } const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() const component = render( { style: 'normal', } const initialValue: Array = [emptyTextBlock] - const onChange: (change: EditorChange) => void = jest.fn() + const onChange: (change: EditorChange) => void = vi.fn() render( { style: 'normal', } const initialValue: Array = [nonEmptyTextBlock] - const onChange: (change: EditorChange) => void = jest.fn() + const onChange: (change: EditorChange) => void = vi.fn() render( { _type: 'image', } const initialValue: Array = [emptyTextBlock, imageBlock] - const onChange: (change: EditorChange) => void = jest.fn() + const onChange: (change: EditorChange) => void = vi.fn() render( { }, ] - const onChange = jest.fn() + const onChange = vi.fn() render( { }, ] - const onChange = jest.fn() + const onChange = vi.fn() render( { }, ] - const onChange = jest.fn() + const onChange = vi.fn() render( { }, ] - const onChange = jest.fn() + const onChange = vi.fn() render( { }, ] - const onChange = jest.fn() + const onChange = vi.fn() render( { const editorRef: RefObject = createRef() const initialValue = [] as PortableTextBlock[] - const onChange = jest.fn() + const onChange = vi.fn() render( { it('updates span text', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() const syncedValue = [ { _key: '77071c3af231', @@ -70,7 +70,7 @@ describe('useSyncValue', () => { }) it('replaces span nodes with different keys inside the same children array', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() const syncedValue = [ { _key: '77071c3af231', @@ -107,19 +107,19 @@ describe('useSyncValue', () => { if (editorRef.current) { expect(PortableTextEditor.getValue(editorRef.current)) .toMatchInlineSnapshot(` - Array [ - Object { + [ + { "_key": "77071c3af231", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "c001f0e92c1f0__NEW_KEY_YA!", "_type": "span", - "marks": Array [], + "marks": [], "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ", }, ], - "markDefs": Array [], + "markDefs": [], "style": "normal", }, ] diff --git a/packages/editor/src/editor/plugins/__tests__/createWithInsertData.test.tsx b/packages/editor/src/editor/plugins/__tests__/createWithInsertData.test.tsx index b5b37607..63dcb417 100644 --- a/packages/editor/src/editor/plugins/__tests__/createWithInsertData.test.tsx +++ b/packages/editor/src/editor/plugins/__tests__/createWithInsertData.test.tsx @@ -1,6 +1,6 @@ -import {describe, expect, it} from '@jest/globals' import {isPortableTextSpan, isPortableTextTextBlock} from '@sanity/types' import type {Descendant} from 'slate' +import {describe, expect, it} from 'vitest' import {exportedForTesting} from '../createWithInsertData' const initialValue = [ diff --git a/packages/editor/src/editor/plugins/__tests__/withEditableAPIDelete.test.tsx b/packages/editor/src/editor/plugins/__tests__/withEditableAPIDelete.test.tsx index d7dbef88..65c79409 100644 --- a/packages/editor/src/editor/plugins/__tests__/withEditableAPIDelete.test.tsx +++ b/packages/editor/src/editor/plugins/__tests__/withEditableAPIDelete.test.tsx @@ -1,6 +1,6 @@ -import {describe, expect, it, jest} from '@jest/globals' import {render, waitFor} from '@testing-library/react' import {createRef, type RefObject} from 'react' +import {describe, expect, it, vi} from 'vitest' import { PortableTextEditorTester, schemaType, @@ -46,7 +46,7 @@ const initialSelection = { describe('plugin:withEditableAPI: .delete()', () => { it('deletes block', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { ) expect(PortableTextEditor.getValue(editorRef.current)) .toMatchInlineSnapshot(` - Array [ - Object { + [ + { "_key": "a", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "a1", "_type": "span", - "marks": Array [], + "marks": [], "text": "Block A", }, ], - "markDefs": Array [], + "markDefs": [], "style": "normal", }, ] @@ -100,7 +100,7 @@ describe('plugin:withEditableAPI: .delete()', () => { it('deletes all the blocks, but leaves a placeholder block', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { // New keys here confirms that a placeholder block has been created expect(PortableTextEditor.getValue(editorRef.current)) .toMatchInlineSnapshot(` - Array [ - Object { + [ + { "_key": "1", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "2", "_type": "span", - "marks": Array [], + "marks": [], "text": "", }, ], - "markDefs": Array [], + "markDefs": [], "style": "normal", }, ] @@ -158,7 +158,7 @@ describe('plugin:withEditableAPI: .delete()', () => { it('deletes children', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { if (editorRef.current) { expect(PortableTextEditor.getValue(editorRef.current)) .toMatchInlineSnapshot(` - Array [ - Object { + [ + { "_key": "a", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "a1", "_type": "span", - "marks": Array [], + "marks": [], "text": "Block A", }, ], - "markDefs": Array [], + "markDefs": [], "style": "normal", }, - Object { + { "_key": "b", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "1", "_type": "span", - "marks": Array [], + "marks": [], "text": "", }, ], - "markDefs": Array [], + "markDefs": [], "style": "normal", }, ] @@ -239,7 +239,7 @@ describe('plugin:withEditableAPI: .delete()', () => { it('deletes selected', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { it('can get a Portable Text fragment of the current selection in a single block', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { it('can get a Portable Text fragment of the current selection in multiple blocks', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { PortableTextEditor.select(editorRef.current, initialSelection) const fragment = PortableTextEditor.getFragment(editorRef.current) expect(fragment).toMatchInlineSnapshot(` - Array [ - Object { + [ + { "_key": "a", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "a1", "_type": "span", - "marks": Array [], + "marks": [], "text": "A", }, ], - "markDefs": Array [], + "markDefs": [], "style": "normal", }, - Object { + { "_key": "b", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "b1", "_type": "span", - "marks": Array [], + "marks": [], "text": "Block B ", }, - Object { + { "_key": "b2", "_type": "someObject", }, - Object { + { "_key": "b3", "_type": "span", - "marks": Array [], + "marks": [], "text": " contains", }, ], - "markDefs": Array [], + "markDefs": [], "style": "normal", }, ] diff --git a/packages/editor/src/editor/plugins/__tests__/withEditableAPIInsert.test.tsx b/packages/editor/src/editor/plugins/__tests__/withEditableAPIInsert.test.tsx index 8456e50c..5ba1c837 100644 --- a/packages/editor/src/editor/plugins/__tests__/withEditableAPIInsert.test.tsx +++ b/packages/editor/src/editor/plugins/__tests__/withEditableAPIInsert.test.tsx @@ -1,6 +1,6 @@ -import {describe, expect, it, jest} from '@jest/globals' import {render, waitFor} from '@testing-library/react' import {createRef, type RefObject} from 'react' +import {describe, expect, it, vi} from 'vitest' import { PortableTextEditorTester, schemaType, @@ -58,7 +58,7 @@ const emptyBlockSelection = { describe('plugin:withEditableAPI: .insertChild()', () => { it('inserts child nodes correctly', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { style: 'normal', }, ] - const onChange = jest.fn() + const onChange = vi.fn() render( { it('should not add empty blank blocks: non-empty block', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { it('should be inserted before if focus is on start of block', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { ...initialValue, {_key: 'b', _type: 'someObject', color: 'red'}, ] - const onChange = jest.fn() + const onChange = vi.fn() render( { ...initialValue, {_key: 'b', _type: 'someObject', color: 'red'}, ] - const onChange = jest.fn() + const onChange = vi.fn() render( { it('should not add empty blank blocks: in new empty text block', async () => { const editorRef: RefObject = createRef() const value = [...initialValue, ...emptyTextBlock] - const onChange = jest.fn() + const onChange = vi.fn() render( { it('returns true if the selections are partially overlapping', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { it('returns true if the selections are fully overlapping', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { it('return true if selection is fully inside another selection', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { it('returns false if the selections are not overlapping', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { style: 'normal', }, ] - const onChange = jest.fn() + const onChange = vi.fn() await waitFor(() => { render( { style: 'normal', }, ] - const onChange = jest.fn() + const onChange = vi.fn() await waitFor(() => { render( { }) PortableTextEditor.toggleMark(editor, 'strong') expect(PortableTextEditor.getValue(editor)).toMatchInlineSnapshot(` - Array [ - Object { + [ + { "_key": "a", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "a1", "_type": "span", - "marks": Array [ + "marks": [ "strong", ], "text": "1234", }, ], - "markDefs": Array [], + "markDefs": [], "style": "normal", }, ] @@ -79,35 +79,35 @@ describe('plugin:withPortableTextMarksModel', () => { PortableTextEditor.toggleMark(editorRef.current, 'strong') expect(PortableTextEditor.getValue(editorRef.current)) .toMatchInlineSnapshot(` - Array [ - Object { + [ + { "_key": "a", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "a1", "_type": "span", - "marks": Array [ + "marks": [ "strong", ], "text": "1", }, - Object { + { "_key": "2", "_type": "span", - "marks": Array [], + "marks": [], "text": "23", }, - Object { + { "_key": "1", "_type": "span", - "marks": Array [ + "marks": [ "strong", ], "text": "4", }, ], - "markDefs": Array [], + "markDefs": [], "style": "normal", }, ] @@ -122,21 +122,21 @@ describe('plugin:withPortableTextMarksModel', () => { }) PortableTextEditor.toggleMark(editor, 'strong') expect(PortableTextEditor.getValue(editor)).toMatchInlineSnapshot(` -Array [ - Object { +[ + { "_key": "a", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "a1", "_type": "span", - "marks": Array [ + "marks": [ "strong", ], "text": "1234", }, ], - "markDefs": Array [], + "markDefs": [], "style": "normal", }, ] @@ -175,7 +175,7 @@ Array [ style: 'normal', }, ] - const onChange = jest.fn() + const onChange = vi.fn() render( { render( { render( { render( { render( { render( { it('will report that a selection is made backward', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { anchor: {path: [{_key: 'b'}, 'children', {_key: 'b1'}], offset: 9}, focus: {path: [{_key: 'a'}, 'children', {_key: 'a1'}], offset: 7}, } + + await waitFor(() => { + if (editorRef.current) { + expect(onChange).toHaveBeenCalledWith({ + type: 'value', + value: initialValue, + }) + expect(onChange).toHaveBeenCalledWith({type: 'ready'}) + } + }) + await waitFor(() => { if (editorRef.current) { PortableTextEditor.focus(editorRef.current) PortableTextEditor.select(editorRef.current, initialSelection) expect(PortableTextEditor.getSelection(editorRef.current)) .toMatchInlineSnapshot(` - Object { - "anchor": Object { + { + "anchor": { "offset": 9, - "path": Array [ - Object { + "path": [ + { "_key": "b", }, "children", - Object { + { "_key": "b1", }, ], }, "backward": true, - "focus": Object { + "focus": { "offset": 7, - "path": Array [ - Object { + "path": [ + { "_key": "a", }, "children", - Object { + { "_key": "a1", }, ], diff --git a/packages/editor/src/editor/plugins/__tests__/withUndoRedo.test.tsx b/packages/editor/src/editor/plugins/__tests__/withUndoRedo.test.tsx index 9203a8d9..a2941153 100644 --- a/packages/editor/src/editor/plugins/__tests__/withUndoRedo.test.tsx +++ b/packages/editor/src/editor/plugins/__tests__/withUndoRedo.test.tsx @@ -1,6 +1,6 @@ -import {describe, expect, it, jest} from '@jest/globals' import {render, waitFor} from '@testing-library/react' import {createRef, type RefObject} from 'react' +import {describe, expect, it, vi} from 'vitest' import { PortableTextEditorTester, schemaType, @@ -46,7 +46,7 @@ const initialSelection = { describe('plugin:withUndoRedo', () => { it('preserves the keys when undoing ', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { ) expect(PortableTextEditor.getValue(editorRef.current)) .toMatchInlineSnapshot(` - Array [ - Object { + [ + { "_key": "a", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "a1", "_type": "span", - "marks": Array [], + "marks": [], "text": "Block A", }, ], - "markDefs": Array [], + "markDefs": [], "style": "normal", }, ] @@ -103,7 +103,7 @@ describe('plugin:withUndoRedo', () => { }) it('preserves the keys when redoing ', async () => { const editorRef: RefObject = createRef() - const onChange = jest.fn() + const onChange = vi.fn() render( { createDefaultValue(), ), ).toMatchInlineSnapshot(` - Array [ - Object { - "items": Array [ - Object { + [ + { + "items": [ + { "_key": "773866318fa8", "_type": "someObject", "title": "The Object", }, ], - "path": Array [ - Object { + "path": [ + { "_key": "1f2e64b47787", }, "children", - Object { + { "_key": "c130395c640c", }, ], "position": "after", "type": "insert", }, - Object { - "path": Array [ - Object { + { + "path": [ + { "_key": "1f2e64b47787", }, "children", - Object { + { "_key": "c130395c640c", }, "text", @@ -118,17 +118,17 @@ describe('operationToPatches', () => { createDefaultValue(), ), ).toMatchInlineSnapshot(` - Array [ - Object { - "items": Array [ - Object { + [ + { + "items": [ + { "_key": "c130395c640c", "_type": "someObject", "title": "The Object", }, ], - "path": Array [ - Object { + "path": [ + { "_key": "1f2e64b47787", }, ], @@ -160,20 +160,20 @@ describe('operationToPatches', () => { [], ), ).toMatchInlineSnapshot(` - Array [ - Object { - "path": Array [], + [ + { + "path": [], "type": "setIfMissing", - "value": Array [], + "value": [], }, - Object { - "items": Array [ - Object { + { + "items": [ + { "_key": "c130395c640c", "_type": "someObject", }, ], - "path": Array [ + "path": [ 0, ], "position": "before", @@ -202,21 +202,21 @@ describe('operationToPatches', () => { createDefaultValue(), ), ).toMatchInlineSnapshot(` - Array [ - Object { - "items": Array [ - Object { + [ + { + "items": [ + { "_key": "c130395c640c", "_type": "someObject", "title": "The Object", }, ], - "path": Array [ - Object { + "path": [ + { "_key": "1f2e64b47787", }, "children", - Object { + { "_key": "fd9b4a4e6c0b", }, ], @@ -243,14 +243,14 @@ describe('operationToPatches', () => { createDefaultValue(), ), ).toMatchInlineSnapshot(` - Array [ - Object { - "path": Array [ - Object { + [ + { + "path": [ + { "_key": "1f2e64b47787", }, "children", - Object { + { "_key": "fd9b4a4e6c0b", }, "text", @@ -280,14 +280,14 @@ describe('operationToPatches', () => { before, ), ).toMatchInlineSnapshot(` - Array [ - Object { - "path": Array [ - Object { + [ + { + "path": [ + { "_key": "1f2e64b47787", }, "children", - Object { + { "_key": "fd9b4a4e6c0b", }, "text", @@ -320,14 +320,14 @@ describe('operationToPatches', () => { createDefaultValue(), ), ).toMatchInlineSnapshot(` - Array [ - Object { - "path": Array [ - Object { + [ + { + "path": [ + { "_key": "1f2e64b47787", }, "children", - Object { + { "_key": "773866318fa8", }, ], @@ -351,10 +351,10 @@ describe('operationToPatches', () => { val, ), ).toMatchInlineSnapshot(` - Array [ - Object { - "path": Array [ - Object { + [ + { + "path": [ + { "_key": "1f2e64b47787", }, ], @@ -389,14 +389,14 @@ describe('operationToPatches', () => { val, ), ).toMatchInlineSnapshot(` - Array [ - Object { - "path": Array [ - Object { + [ + { + "path": [ + { "_key": "1f2e64b47787", }, "children", - Object { + { "_key": "fd9b4a4e6c0b", }, "text", @@ -404,13 +404,13 @@ describe('operationToPatches', () => { "type": "set", "value": "1234", }, - Object { - "path": Array [ - Object { + { + "path": [ + { "_key": "1f2e64b47787", }, "children", - Object { + { "_key": "r4wr323432", }, ], diff --git a/packages/editor/src/utils/__tests__/patchToOperations.test.ts b/packages/editor/src/utils/__tests__/patchToOperations.test.ts index 936144de..21f18cf7 100644 --- a/packages/editor/src/utils/__tests__/patchToOperations.test.ts +++ b/packages/editor/src/utils/__tests__/patchToOperations.test.ts @@ -1,7 +1,7 @@ -import {beforeEach, describe, expect, it} from '@jest/globals' import type {Patch} from '@portabletext/patches' import {noop} from 'lodash' import {createEditor, type Descendant} from 'slate' +import {beforeEach, describe, expect, it} from 'vitest' import {keyGenerator, PortableTextEditor} from '../..' import {schemaType} from '../../editor/__tests__/PortableTextEditorTester' import {withPlugins} from '../../editor/plugins' @@ -70,21 +70,21 @@ describe('operationToPatches', () => { patchToOperations(editor, p) }) expect(editor.children).toMatchInlineSnapshot(` - Array [ - Object { + [ + { "__inline": false, "_key": "c01739b0d03b", "_type": "image", - "children": Array [ - Object { + "children": [ + { "_key": "${VOID_CHILD_KEY}", "_type": "span", - "marks": Array [], + "marks": [], "text": "", }, ], - "value": Object { - "asset": Object { + "value": { + "asset": { "_ref": "image-f52f71bc1df46e080dabe43a8effe8ccfb5f21de-4032x3024-png", "_type": "reference", }, @@ -93,7 +93,7 @@ describe('operationToPatches', () => { ] `) }) - it('will not create operations for insertion inside object blocks', () => { + it('will not create operations for insertion inside blocks', () => { editor.children = [ { _type: 'someType', @@ -127,31 +127,31 @@ describe('operationToPatches', () => { patchToOperations(editor, p) }) expect(editor.children).toMatchInlineSnapshot(` - Array [ - Object { + [ + { "__inline": false, "_key": "c01739b0d03b", "_type": "someType", - "children": Array [ - Object { + "children": [ + { "_key": "${VOID_CHILD_KEY}", "_type": "span", - "marks": Array [], + "marks": [], "text": "", }, ], - "value": Object { - "asset": Object { + "value": { + "asset": { "_ref": "image-f52f71bc1df46e080dabe43a8effe8ccfb5f21de-4032x3024-png", "_type": "reference", }, - "nestedArray": Array [], + "nestedArray": [], }, }, ] `) }) - it('will not create operations for removal inside object blocks', () => { + it('will not create operations for removal inside blocks', () => { editor.children = [ { _type: 'someType', @@ -190,26 +190,26 @@ describe('operationToPatches', () => { patchToOperations(editor, p) }) expect(editor.children).toMatchInlineSnapshot(` - Array [ - Object { + [ + { "__inline": false, "_key": "c01739b0d03b", "_type": "someType", - "children": Array [ - Object { + "children": [ + { "_key": "${VOID_CHILD_KEY}", "_type": "span", - "marks": Array [], + "marks": [], "text": "", }, ], - "value": Object { - "asset": Object { + "value": { + "asset": { "_ref": "image-f52f71bc1df46e080dabe43a8effe8ccfb5f21de-4032x3024-png", "_type": "reference", }, - "nestedArray": Array [ - Object { + "nestedArray": [ + { "_key": "foo", "_type": "nestedValue", }, @@ -219,7 +219,7 @@ describe('operationToPatches', () => { ] `) }) - it('will not create operations for setting data inside object blocks', () => { + it('will not create operations for setting data inside blocks', () => { editor.children = [ { _key: '1335959d4d03', @@ -265,34 +265,34 @@ describe('operationToPatches', () => { patchToOperations(editor, p) }) expect(editor.children).toMatchInlineSnapshot(` - Array [ - Object { + [ + { "_key": "1335959d4d03", "_type": "block", - "children": Array [ - Object { + "children": [ + { "_key": "9bd868adcd6b", "_type": "span", - "marks": Array [], + "marks": [], "text": "1 ", }, - Object { + { "_key": "6f75d593f3fc", "_type": "span", - "marks": Array [ + "marks": [ "11de7fcea659", ], "text": "2", }, - Object { + { "_key": "033618a7f081", "_type": "span", - "marks": Array [], + "marks": [], "text": " 3", }, ], - "markDefs": Array [ - Object { + "markDefs": [ + { "_key": "11de7fcea659", "_type": "link", }, diff --git a/packages/editor/src/utils/__tests__/ranges.test.ts b/packages/editor/src/utils/__tests__/ranges.test.ts index 2ca0a9a9..3d6a3d9b 100644 --- a/packages/editor/src/utils/__tests__/ranges.test.ts +++ b/packages/editor/src/utils/__tests__/ranges.test.ts @@ -1,5 +1,5 @@ -import {describe, expect, it} from '@jest/globals' import type {InsertTextOperation, Range} from 'slate' +import {describe, expect, it} from 'vitest' import {moveRangeByOperation} from '../ranges' describe('moveRangeByOperation', () => { diff --git a/packages/editor/src/utils/__tests__/valueNormalization.test.tsx b/packages/editor/src/utils/__tests__/valueNormalization.test.tsx index 63dfd51e..7935bd1a 100644 --- a/packages/editor/src/utils/__tests__/valueNormalization.test.tsx +++ b/packages/editor/src/utils/__tests__/valueNormalization.test.tsx @@ -1,6 +1,7 @@ -import {describe, expect, it, jest} from '@jest/globals' import {render, waitFor} from '@testing-library/react' import {createRef, type RefObject} from 'react' +import * as React from 'react' +import {describe, expect, it, vi} from 'vitest' import { PortableTextEditorTester, schemaType, @@ -25,7 +26,7 @@ describe('values: normalization', () => { markDefs: [], }, ] - const onChange = jest.fn() + const onChange = vi.fn() render( { value={initialValue} />, ) + + await waitFor(() => { + if (editorRef.current) { + expect(onChange).toHaveBeenCalledWith({ + type: 'value', + value: initialValue, + }) + expect(onChange).toHaveBeenCalledWith({type: 'ready'}) + } + }) + await waitFor(() => { if (editorRef.current) { PortableTextEditor.focus(editorRef.current) diff --git a/packages/editor/src/utils/__tests__/values.test.ts b/packages/editor/src/utils/__tests__/values.test.ts index 17d958ea..05791366 100644 --- a/packages/editor/src/utils/__tests__/values.test.ts +++ b/packages/editor/src/utils/__tests__/values.test.ts @@ -1,4 +1,4 @@ -import {describe, expect, it} from '@jest/globals' +import {describe, expect, it} from 'vitest' import {schemaType} from '../../editor/__tests__/PortableTextEditorTester' import {getPortableTextMemberSchemaTypes} from '../getPortableTextMemberSchemaTypes' import {fromSlateValue, toSlateValue} from '../values' @@ -59,12 +59,12 @@ describe('toSlateValue', () => { {schemaTypes}, ) expect(result).toMatchInlineSnapshot(` -Array [ - Object { +[ + { "_key": "123", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "1231", "_type": "span", "text": "123", @@ -76,7 +76,7 @@ Array [ `) }) - it('given type is block and has custom object in children', () => { + it('given type is block and has custom in children', () => { const result = toSlateValue( [ { @@ -102,30 +102,30 @@ Array [ ) expect(result).toMatchInlineSnapshot(` -Array [ - Object { +[ + { "_key": "123", "_type": "myTestBlockType", - "children": Array [ - Object { + "children": [ + { "_key": "1231", "_type": "span", "text": "123", }, - Object { + { "__inline": true, "_key": "1232", "_type": "image", - "children": Array [ - Object { + "children": [ + { "_key": "void-child", "_type": "span", - "marks": Array [], + "marks": [], "text": "", }, ], - "value": Object { - "asset": Object { + "value": { + "asset": { "_ref": "ref-123", }, }, @@ -213,7 +213,7 @@ describe('fromSlateValue', () => { ]) }) - it('has object equality', () => { + it('has equality', () => { const keyMap = {} const value = [ { diff --git a/packages/editor/test-config/create-jest-config.ts b/packages/editor/test-config/create-jest-config.ts deleted file mode 100644 index fd9bf641..00000000 --- a/packages/editor/test-config/create-jest-config.ts +++ /dev/null @@ -1,66 +0,0 @@ -import path from 'node:path' -import type {Config} from '@jest/types' - -export function createJestConfig(config: Config.InitialOptions = {}) { - const { - testMatch = [], - setupFiles = [], - globals = {}, - moduleNameMapper = {}, - modulePathIgnorePatterns = [], - transform = {}, - ...restOfInputConfig - } = config - - return { - globals, - modulePathIgnorePatterns: [ - ...modulePathIgnorePatterns, - '/bin/', - '/coverage/', - '/lib/', - ], - resolver: path.resolve(__dirname, './resolver.cjs'), - testEnvironment: path.resolve(__dirname, './jsdom.jest.env.ts'), - setupFiles: [...setupFiles, path.resolve(__dirname, './setup.ts')], - testEnvironmentOptions: { - url: 'http://localhost:3333', - }, - testMatch: [...testMatch, '/**/*.{test,spec}.{js,ts,tsx}'], - transformIgnorePatterns: ['/node_modules/(?!(get-random-values-esm)/)'], - testPathIgnorePatterns: ['/node_modules/', '/.yalc/'], - transform: { - ...transform, - '\\.[jt]sx?$': [ - 'babel-jest', - { - // Don't look for babel.config.{ts,js,json} files or .babelrc files - configFile: false, - babelrc: false, - // The rest is only needed by Jest, if Jest is updated to no longer need babel then this can be removed as well as related dependencies - presets: [ - [ - '@babel/preset-env', - { - targets: { - node: '14', - chrome: '61', - safari: '11.3', - firefox: '60', - edge: '79', - }, - }, - ], - '@babel/preset-typescript', - ['@babel/preset-react', {runtime: 'automatic'}], - ], - }, - ], - }, - snapshotFormat: { - escapeString: true, - printBasicPrototype: true, - }, - ...restOfInputConfig, - } satisfies Config.InitialOptions -} diff --git a/packages/editor/vitest.config.ts b/packages/editor/vitest.config.ts new file mode 100644 index 00000000..710d2f99 --- /dev/null +++ b/packages/editor/vitest.config.ts @@ -0,0 +1,12 @@ +/// +import react from '@vitejs/plugin-react' +import {defineConfig} from 'vite' + +export default defineConfig({ + plugins: [react()], + test: { + exclude: ['e2e-tests'], + environment: 'jsdom', + setupFiles: ['./vitest.setup.ts'], + }, +}) diff --git a/packages/editor/vitest.setup.ts b/packages/editor/vitest.setup.ts new file mode 100644 index 00000000..1252b34d --- /dev/null +++ b/packages/editor/vitest.setup.ts @@ -0,0 +1,7 @@ +import '@testing-library/jest-dom/vitest' +import {cleanup} from '@testing-library/react' +import {afterEach} from 'vitest' + +afterEach(() => { + cleanup() +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 750fb204..9d41e673 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -228,7 +228,7 @@ importers: version: link:../../packages/patches '@sanity/vision': specifier: ^3.52.2 - version: 3.55.0(@babel/runtime@7.25.0)(@codemirror/lint@6.8.1)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.1)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc-fb9a90fa48-20240614)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 3.55.0(@babel/runtime@7.25.0)(@codemirror/lint@6.8.1)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.1)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) react: specifier: ^18.2.0 version: 18.3.1 @@ -318,6 +318,9 @@ importers: '@testing-library/dom': specifier: ^10.4.0 version: 10.4.0 + '@testing-library/jest-dom': + specifier: ^6.5.0 + version: 6.5.0 '@testing-library/react': specifier: ^16.0.1 version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -372,6 +375,9 @@ importers: jest-environment-node: specifier: ^29.7.0 version: 29.7.0 + jsdom: + specifier: ^25.0.1 + version: 25.0.1 node-ipc: specifier: npm:@node-ipc/compat@9.2.5 version: '@node-ipc/compat@9.2.5' @@ -399,6 +405,9 @@ importers: vite: specifier: ^5.4.2 version: 5.4.2(@types/node@18.19.45)(terser@5.31.6) + vitest: + specifier: ^2.1.1 + version: 2.1.1(@types/node@18.19.45)(jsdom@25.0.1)(terser@5.31.6) packages/gherkin-driver: devDependencies: @@ -442,6 +451,9 @@ importers: packages: + '@adobe/css-tools@4.4.0': + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -3120,6 +3132,10 @@ packages: resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} + '@testing-library/jest-dom@6.5.0': + resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + '@testing-library/react@16.0.1': resolution: {integrity: sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==} engines: {node: '>=18'} @@ -3495,6 +3511,36 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 + '@vitest/expect@2.1.1': + resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} + + '@vitest/mocker@2.1.1': + resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} + peerDependencies: + '@vitest/spy': 2.1.1 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.1': + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} + + '@vitest/runner@2.1.1': + resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} + + '@vitest/snapshot@2.1.1': + resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} + + '@vitest/spy@2.1.1': + resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} + + '@vitest/utils@2.1.1': + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + '@xstate/react@4.1.1': resolution: {integrity: sha512-pFp/Y+bnczfaZ0V8B4LOhx3d6Gd71YKAPbzerGqydC2nsYN/mp7RZu3q/w6/kvI2hwR/jeDeetM7xc3JFZH2NA==} peerDependencies: @@ -3682,6 +3728,10 @@ packages: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -3899,10 +3949,18 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -3930,6 +3988,10 @@ packages: character-reference-invalid@1.1.4: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -4164,6 +4226,9 @@ packages: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -4183,6 +4248,10 @@ packages: resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} engines: {node: '>=18'} + cssstyle@4.1.0: + resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} + engines: {node: '>=18'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -4300,6 +4369,10 @@ packages: resolution: {integrity: sha512-e7oWH1LzIdv/prMQ7pmlDlaVoL64glqzvNgkgQNgyec9ORPHrT2jaOqMtRyqJuwWjtfb6v+2rk9pmaHj+F137A==} engines: {node: '>= 16'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-equal@2.2.3: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} @@ -4414,6 +4487,9 @@ packages: dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -4650,6 +4726,9 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -4917,6 +4996,9 @@ packages: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -5738,6 +5820,15 @@ packages: canvas: optional: true + jsdom@25.0.1: + resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -5883,6 +5974,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -6406,6 +6500,13 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + peek-stream@1.1.3: resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} @@ -6992,6 +7093,9 @@ packages: rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -7119,6 +7223,9 @@ packages: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -7232,10 +7339,16 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} @@ -7485,6 +7598,31 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + tldts-core@6.1.47: + resolution: {integrity: sha512-6SWyFMnlst1fEt7GQVAAu16EGgFK0cLouH/2Mk6Ftlwhv3Ol40L0dlpGMcnnNiiOMyD2EV/aF3S+U2nKvvLvrA==} + + tldts@6.1.47: + resolution: {integrity: sha512-R/K2tZ5MiY+mVrnSkNJkwqYT2vUv1lcT6wJvd2emGaMJ7PHUGRY4e3tUsdFCXgqxi2QgbHjL3yJgXCo40v9Hxw==} + hasBin: true + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -7510,6 +7648,10 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} + tough-cookie@5.0.0: + resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==} + engines: {node: '>=16'} + tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} @@ -7871,6 +8013,11 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@2.1.1: + resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite@4.5.3: resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -7930,6 +8077,31 @@ packages: terser: optional: true + vitest@2.1.1: + resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.1 + '@vitest/ui': 2.1.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + void-elements@3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} @@ -8008,6 +8180,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -8149,6 +8326,8 @@ packages: snapshots: + '@adobe/css-tools@4.4.0': {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -11636,7 +11815,7 @@ snapshots: '@types/uuid': 8.3.4 uuid: 8.3.2 - '@sanity/vision@3.55.0(@babel/runtime@7.25.0)(@codemirror/lint@6.8.1)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.1)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc-fb9a90fa48-20240614)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@sanity/vision@3.55.0(@babel/runtime@7.25.0)(@codemirror/lint@6.8.1)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.1)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@codemirror/autocomplete': 6.18.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0)(@lezer/common@1.2.1) '@codemirror/commands': 6.6.2 @@ -11651,7 +11830,7 @@ snapshots: '@rexxars/react-split-pane': 0.1.93(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@sanity/color': 3.0.6 '@sanity/icons': 3.4.0(react@18.3.1) - '@sanity/ui': 2.8.9(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc-fb9a90fa48-20240614)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/ui': 2.8.9(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@uiw/react-codemirror': 4.23.0(@babel/runtime@7.25.0)(@codemirror/autocomplete@6.18.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0)(@lezer/common@1.2.1))(@codemirror/language@6.10.3)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.33.0)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) is-hotkey-esm: 1.0.0 json-2-csv: 5.5.5 @@ -11824,6 +12003,16 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 + '@testing-library/jest-dom@6.5.0': + dependencies: + '@adobe/css-tools': 4.4.0 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 @@ -12281,6 +12470,46 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/expect@2.1.1': + dependencies: + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.2(@types/node@18.19.45)(terser@5.31.6))': + dependencies: + '@vitest/spy': 2.1.1 + estree-walker: 3.0.3 + magic-string: 0.30.11 + optionalDependencies: + vite: 5.4.2(@types/node@18.19.45)(terser@5.31.6) + + '@vitest/pretty-format@2.1.1': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.1': + dependencies: + '@vitest/utils': 2.1.1 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.1': + dependencies: + '@vitest/pretty-format': 2.1.1 + magic-string: 0.30.11 + pathe: 1.1.2 + + '@vitest/spy@2.1.1': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.1': + dependencies: + '@vitest/pretty-format': 2.1.1 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + '@xstate/react@4.1.1(@types/react@18.3.3)(react@18.3.1)(xstate@5.17.4)': dependencies: react: 18.3.1 @@ -12498,6 +12727,8 @@ snapshots: arrify@2.0.1: {} + assertion-error@2.0.1: {} + ast-types-flow@0.0.8: {} ast-types@0.16.1: @@ -12784,12 +13015,25 @@ snapshots: ccount@2.0.1: {} + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -12809,6 +13053,8 @@ snapshots: character-reference-invalid@1.1.4: {} + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -13057,6 +13303,8 @@ snapshots: css-what@6.1.0: {} + css.escape@1.5.1: {} + cssesc@3.0.0: {} cssom@0.3.8: {} @@ -13071,6 +13319,10 @@ snapshots: dependencies: rrweb-cssom: 0.6.0 + cssstyle@4.1.0: + dependencies: + rrweb-cssom: 0.7.1 + csstype@3.1.3: {} cwd@0.10.0: @@ -13190,6 +13442,8 @@ snapshots: deeks@3.1.0: {} + deep-eql@5.0.2: {} + deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.1 @@ -13300,6 +13554,8 @@ snapshots: dom-accessibility-api@0.5.16: {} + dom-accessibility-api@0.6.3: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -13721,6 +13977,10 @@ snapshots: estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + esutils@2.0.3: {} etag@1.8.1: {} @@ -14037,6 +14297,8 @@ snapshots: get-east-asian-width@1.2.0: {} + get-func-name@2.0.2: {} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 @@ -15125,6 +15387,34 @@ snapshots: - supports-color - utf-8-validate + jsdom@25.0.1: + dependencies: + cssstyle: 4.1.0 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.12 + parse5: 7.1.2 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsesc@0.5.0: {} jsesc@2.5.2: {} @@ -15264,6 +15554,10 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -15786,6 +16080,10 @@ snapshots: path-type@4.0.0: {} + pathe@1.1.2: {} + + pathval@2.0.0: {} + peek-stream@1.1.3: dependencies: buffer-from: 1.1.2 @@ -16540,6 +16838,8 @@ snapshots: rrweb-cssom@0.6.0: {} + rrweb-cssom@0.7.1: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -16981,6 +17281,8 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -17095,8 +17397,12 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + statuses@2.0.1: {} + std-env@3.7.0: {} + stop-iteration-iterator@1.0.0: dependencies: internal-slot: 1.0.7 @@ -17435,6 +17741,22 @@ snapshots: tiny-warning@1.0.3: {} + tinybench@2.9.0: {} + + tinyexec@0.3.0: {} + + tinypool@1.0.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + tldts-core@6.1.47: {} + + tldts@6.1.47: + dependencies: + tldts-core: 6.1.47 + tmpl@1.0.5: {} to-buffer@1.1.1: {} @@ -17456,6 +17778,10 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 + tough-cookie@5.0.0: + dependencies: + tldts: 6.1.47 + tr46@3.0.0: dependencies: punycode: 2.3.1 @@ -17818,6 +18144,23 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + vite-node@2.1.1(@types/node@18.19.45)(terser@5.31.6): + dependencies: + cac: 6.7.14 + debug: 4.3.6 + pathe: 1.1.2 + vite: 5.4.2(@types/node@18.19.45)(terser@5.31.6) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite@4.5.3(@types/node@18.19.45)(terser@5.31.6): dependencies: esbuild: 0.18.20 @@ -17838,6 +18181,41 @@ snapshots: fsevents: 2.3.3 terser: 5.31.6 + vitest@2.1.1(@types/node@18.19.45)(jsdom@25.0.1)(terser@5.31.6): + dependencies: + '@vitest/expect': 2.1.1 + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.2(@types/node@18.19.45)(terser@5.31.6)) + '@vitest/pretty-format': 2.1.1 + '@vitest/runner': 2.1.1 + '@vitest/snapshot': 2.1.1 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + debug: 4.3.6 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.2(@types/node@18.19.45)(terser@5.31.6) + vite-node: 2.1.1(@types/node@18.19.45)(terser@5.31.6) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 18.19.45 + jsdom: 25.0.1 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + void-elements@3.1.0: {} w3c-keyname@2.2.8: {} @@ -17938,6 +18316,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: