From 9acf631fc145f3a57c7bad2456168cd70ac37286 Mon Sep 17 00:00:00 2001 From: Cody Olsen Date: Wed, 30 Oct 2024 17:35:15 +0100 Subject: [PATCH] feat: use react-compiler to optimise render --- .github/eslint-compact.json | 18 + .github/workflows/check-react-compiler.yml | 55 ++ apps/playground/.gitignore | 1 + apps/playground/package.json | 8 + apps/playground/vite.config.ts | 6 +- packages/editor/.gitignore | 1 + .../e2e-tests/web-server/vite.config.js | 6 +- packages/editor/package.config.ts | 2 + packages/editor/package.json | 10 +- packages/editor/src/editor/Editable.tsx | 180 ++--- .../editor/src/editor/PortableTextEditor.tsx | 1 + .../src/editor/components/DraggableBlock.tsx | 2 + .../editor/src/editor/components/Element.tsx | 2 + .../editor/src/editor/components/Leaf.tsx | 3 + .../src/editor/components/SlateContainer.tsx | 10 +- .../src/editor/components/Synchronizer.tsx | 33 +- .../src/editor/nodes/DefaultAnnotation.tsx | 2 + .../editor/src/editor/nodes/DefaultObject.tsx | 2 + .../src/editor/withSyncRangeDecorations.tsx | 20 + packages/editor/vitest.workspace.ts | 24 +- pnpm-lock.yaml | 705 ++++++++++++++++-- 21 files changed, 922 insertions(+), 169 deletions(-) create mode 100644 .github/eslint-compact.json create mode 100644 .github/workflows/check-react-compiler.yml create mode 100644 packages/editor/src/editor/withSyncRangeDecorations.tsx diff --git a/.github/eslint-compact.json b/.github/eslint-compact.json new file mode 100644 index 000000000..c45497feb --- /dev/null +++ b/.github/eslint-compact.json @@ -0,0 +1,18 @@ +{ + "problemMatcher": [ + { + "owner": "eslint-compact", + "pattern": [ + { + "regexp": "^(.+):\\sline\\s(\\d+),\\scol\\s(\\d+),\\s(Error|Warning|Info)\\s-\\s(.+)\\s\\((.+)\\)\\.?$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5, + "code": 6 + } + ] + } + ] +} diff --git a/.github/workflows/check-react-compiler.yml b/.github/workflows/check-react-compiler.yml new file mode 100644 index 000000000..27b0bea1a --- /dev/null +++ b/.github/workflows/check-react-compiler.yml @@ -0,0 +1,55 @@ +name: check-react-compiler + +on: + # Build on pushes branches that have a PR (including drafts) + pull_request: + # Build on commits pushed to branches without a PR if it's in the allowlist + push: + branches: [main] + +jobs: + check-lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + name: Install pnpm + id: pnpm-install + with: + run_install: false + + - name: Get pnpm store directory + id: pnpm-cache + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - name: Cache node modules + id: cache-node-modules + uses: actions/cache@v4 + env: + cache-name: cache-node-modules + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + v1-${{ runner.os }}-pnpm-store-${{ env.cache-name }}- + v1-${{ runner.os }}-pnpm-store- + v1-${{ runner.os }}- + + - name: Install project dependencies + run: pnpm install + + - name: Register Problem Matcher for ESLint that handles -f compact and shows warnings inline on PRs + run: echo "::add-matcher::.github/eslint-compact.json" + + - name: Check react compiler on editor + working-directory: packages/editor + run: pnpm check:react-compiler -f compact + + - name: Check react compiler on playground + working-directory: apps/playground + run: pnpm check:react-compiler -f compact diff --git a/apps/playground/.gitignore b/apps/playground/.gitignore index a547bf36d..4b437db91 100644 --- a/apps/playground/.gitignore +++ b/apps/playground/.gitignore @@ -22,3 +22,4 @@ dist-ssr *.njsproj *.sln *.sw? +.eslintcache diff --git a/apps/playground/package.json b/apps/playground/package.json index 9e280d815..666bc2722 100644 --- a/apps/playground/package.json +++ b/apps/playground/package.json @@ -7,6 +7,7 @@ "build": "tsc -b && vite build", "check:lint": "biome lint .", "check:types": "tsc --noEmit --pretty", + "check:react-compiler": "eslint --cache --no-inline-config --no-eslintrc --ext .cjs,.mjs,.js,.jsx,.ts,.tsx --parser @typescript-eslint/parser --plugin react-compiler --plugin react-hooks --rule 'react-compiler/react-compiler: [warn]' --rule 'react-hooks/rules-of-hooks: [error]' --rule 'react-hooks/exhaustive-deps: [error]' src", "clean": "del .turbo && del dist && del node_modules", "dev": "vite", "lint:fix": "biome lint --write .", @@ -23,6 +24,7 @@ "prettier": "^3.3.2", "react": "^18.3.1", "react-aria-components": "^1.2.1", + "react-compiler-runtime": "19.0.0-beta-6fc168f-20241025", "react-dom": "^18.3.1", "react-is": "^18.3.1", "remeda": "^2.2.2", @@ -40,8 +42,14 @@ "@types/react-dom": "^18.3.1", "@types/react-is": "^18.3.0", "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^8.12.2", + "@typescript-eslint/parser": "^8.12.2", "@vitejs/plugin-react": "^4.3.3", "autoprefixer": "^10.4.20", + "babel-plugin-react-compiler": "beta", + "eslint": "8", + "eslint-plugin-react-compiler": "beta", + "eslint-plugin-react-hooks": "^5.0.0", "postcss": "^8.4.47", "tailwind-merge": "^2.5.4", "tailwind-variants": "^0.2.1", diff --git a/apps/playground/vite.config.ts b/apps/playground/vite.config.ts index ca64e1959..03947c0f6 100644 --- a/apps/playground/vite.config.ts +++ b/apps/playground/vite.config.ts @@ -3,5 +3,9 @@ import {defineConfig} from 'vite' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [ + react({ + babel: {plugins: [['babel-plugin-react-compiler', {target: '18'}]]}, + }), + ], }) diff --git a/packages/editor/.gitignore b/packages/editor/.gitignore index 626befc94..de9c7338c 100644 --- a/packages/editor/.gitignore +++ b/packages/editor/.gitignore @@ -11,3 +11,4 @@ # Compiled code /lib /dist +.eslintcache diff --git a/packages/editor/e2e-tests/web-server/vite.config.js b/packages/editor/e2e-tests/web-server/vite.config.js index f03fecd26..319e93266 100644 --- a/packages/editor/e2e-tests/web-server/vite.config.js +++ b/packages/editor/e2e-tests/web-server/vite.config.js @@ -3,7 +3,11 @@ import {defineConfig} from 'vite' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [viteReact()], + plugins: [ + viteReact({ + babel: {plugins: [['babel-plugin-react-compiler', {target: '18'}]]}, + }), + ], build: { minify: false, }, diff --git a/packages/editor/package.config.ts b/packages/editor/package.config.ts index fcb06e595..6eb6a7a88 100644 --- a/packages/editor/package.config.ts +++ b/packages/editor/package.config.ts @@ -32,4 +32,6 @@ export default defineConfig({ noImplicitBrowsersList: 'off', noImplicitSideEffects: 'error', }, + babel: {reactCompiler: true}, + reactCompilerOptions: {target: '18'}, }) diff --git a/packages/editor/package.json b/packages/editor/package.json index f34550101..a54e64147 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,6 +1,6 @@ { "name": "@portabletext/editor", - "version": "1.1.11", + "version": "1.1.12-canary.1", "description": "Portable Text Editor made in React", "keywords": [ "sanity", @@ -45,6 +45,7 @@ "build": "pkg-utils build --strict --check --clean", "check:lint": "biome lint .", "check:types": "tsc", + "check:react-compiler": "eslint --cache --no-inline-config --no-eslintrc --ext .cjs,.mjs,.js,.jsx,.ts,.tsx --parser @typescript-eslint/parser --plugin react-compiler --plugin react-hooks --rule 'react-compiler/react-compiler: [warn]' --rule 'react-hooks/rules-of-hooks: [error]' --rule 'react-hooks/exhaustive-deps: [error]' src", "clean": "del .turbo && del lib && del node_modules", "dev": "pkg-utils watch", "lint:fix": "biome lint --write .", @@ -59,6 +60,7 @@ "debug": "^4.3.4", "is-hotkey-esm": "^1.0.0", "lodash": "^4.17.21", + "react-compiler-runtime": "19.0.0-beta-6fc168f-20241025", "slate": "0.110.2", "slate-react": "0.110.3", "xstate": "^5.18.2" @@ -91,10 +93,16 @@ "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@types/ws": "~8.5.12", + "@typescript-eslint/eslint-plugin": "^8.12.2", + "@typescript-eslint/parser": "^8.12.2", "@vitejs/plugin-react": "^4.3.3", "@vitest/browser": "^2.1.4", "@xstate/react": "^4.1.3", + "babel-plugin-react-compiler": "beta", "dotenv": "^16.4.5", + "eslint": "8", + "eslint-plugin-react-compiler": "beta", + "eslint-plugin-react-hooks": "^5.0.0", "express": "^4.21.1", "express-ws": "^5.0.2", "jest": "^29.7.0", diff --git a/packages/editor/src/editor/Editable.tsx b/packages/editor/src/editor/Editable.tsx index 892d1c9b3..b241b0e46 100644 --- a/packages/editor/src/editor/Editable.tsx +++ b/packages/editor/src/editor/Editable.tsx @@ -22,6 +22,7 @@ import { Path, Range as SlateRange, Transforms, + type BaseEditor, type BaseRange, type NodeEntry, type Operation, @@ -38,6 +39,7 @@ import type { EditorSelection, OnCopyFn, OnPasteFn, + PortableTextSlateEditor, RangeDecoration, RenderAnnotationFunction, RenderBlockFunction, @@ -69,6 +71,7 @@ import {usePortableTextEditor} from './hooks/usePortableTextEditor' import {usePortableTextEditorReadOnlyStatus} from './hooks/usePortableTextReadOnly' import {createWithHotkeys, createWithInsertData} from './plugins' import {PortableTextEditor} from './PortableTextEditor' +import {withSyncRangeDecorations} from './withSyncRangeDecorations' const debug = debugWithName('component:Editable') @@ -163,27 +166,29 @@ export const PortableTextEditable = forwardRef< const blockTypeName = schemaTypes.block.name - // React/UI-specific plugins - const withInsertData = useMemo( - () => createWithInsertData(editorActor, schemaTypes), - [editorActor, schemaTypes], - ) - const withHotKeys = useMemo( - () => createWithHotkeys(portableTextEditor, hotkeys), - [hotkeys, portableTextEditor], - ) - // Output a minimal React editor inside Editable when in readOnly mode. // NOTE: make sure all the plugins used here can be safely run over again at any point. // There will be a problem if they redefine editor methods and then calling the original method within themselves. useMemo(() => { + // React/UI-specific plugins + const withInsertData = createWithInsertData(editorActor, schemaTypes) + if (readOnly) { debug('Editable is in read only mode') return withInsertData(slateEditor) } + const withHotKeys = createWithHotkeys(portableTextEditor, hotkeys) + debug('Editable is in edit mode') return withInsertData(withHotKeys(slateEditor)) - }, [readOnly, slateEditor, withHotKeys, withInsertData]) + }, [ + editorActor, + hotkeys, + portableTextEditor, + readOnly, + slateEditor, + schemaTypes, + ]) const renderElement = useCallback( (eProps: RenderElementProps) => ( @@ -250,6 +255,7 @@ export const PortableTextEditable = forwardRef< return lProps.children }, [ + editorActor, readOnly, renderAnnotation, renderChild, @@ -285,7 +291,7 @@ export const PortableTextEditable = forwardRef< } } } - }, [editorActor, propsSelection, slateEditor]) + }, [editorActor, blockTypeName, propsSelection, slateEditor]) const syncRangeDecorations = useCallback( (operation?: Operation) => { @@ -346,7 +352,13 @@ export const PortableTextEditable = forwardRef< setRangeDecorationsState([]) } }, - [portableTextEditor, rangeDecorations, schemaTypes, slateEditor], + [ + portableTextEditor, + rangeDecorations, + rangeDecorationState.length, + schemaTypes, + slateEditor, + ], ) // Restore selection from props when the editor has been initialized properly with it's value @@ -375,9 +387,6 @@ export const PortableTextEditable = forwardRef< } }, [hasInvalidValue, propsSelection, restoreSelectionFromProps]) - // Store reference to original apply function (see below for usage in useEffect) - const originalApply = useMemo(() => slateEditor.apply, [slateEditor]) - const [syncedRangeDecorations, setSyncedRangeDecorations] = useState(false) useEffect(() => { if (!syncedRangeDecorations) { @@ -396,16 +405,9 @@ export const PortableTextEditable = forwardRef< // Sync range decorations after an operation is applied useEffect(() => { - slateEditor.apply = (op: Operation) => { - originalApply(op) - if (op.type !== 'set_selection') { - syncRangeDecorations(op) - } - } - return () => { - slateEditor.apply = originalApply - } - }, [originalApply, slateEditor, syncRangeDecorations]) + const teardown = withSyncRangeDecorations(slateEditor, syncRangeDecorations) + return () => teardown() + }, [slateEditor, syncRangeDecorations]) // Handle from props onCopy function const handleCopy = useCallback( @@ -477,7 +479,7 @@ export const PortableTextEditable = forwardRef< }) } }, - [onPaste, portableTextEditor, schemaTypes, slateEditor], + [editorActor, onPaste, portableTextEditor, schemaTypes, slateEditor], ) const handleOnFocus: FocusEventHandler = useCallback( @@ -554,64 +556,7 @@ export const PortableTextEditable = forwardRef< [onBeforeInput], ) - // This function will handle unexpected DOM changes inside the Editable rendering, - // and make sure that we can maintain a stable slateEditor.selection when that happens. - // - // For example, if this Editable is rendered inside something that might re-render - // this component (hidden contexts) while the user is still actively changing the - // contentEditable, this could interfere with the intermediate DOM selection, - // which again could be picked up by ReactEditor's event listeners. - // If that range is invalid at that point, the slate.editorSelection could be - // set either wrong, or invalid, to which slateEditor will throw exceptions - // that are impossible to recover properly from or result in a wrong selection. - // - // Also the other way around, when the ReactEditor will try to create a DOM Range - // from the current slateEditor.selection, it may throw unrecoverable errors - // if the current editor.selection is invalid according to the DOM. - // If this is the case, default to selecting the top of the document, if the - // user already had a selection. - const validateSelection = useCallback(() => { - if (!slateEditor.selection) { - return - } - const root = ReactEditor.findDocumentOrShadowRoot(slateEditor) - const {activeElement} = root - // Return if the editor isn't the active element - if (ref.current !== activeElement) { - return - } - const window = ReactEditor.getWindow(slateEditor) - const domSelection = window.getSelection() - if (!domSelection || domSelection.rangeCount === 0) { - return - } - const existingDOMRange = domSelection.getRangeAt(0) - try { - const newDOMRange = ReactEditor.toDOMRange( - slateEditor, - slateEditor.selection, - ) - if ( - newDOMRange.startOffset !== existingDOMRange.startOffset || - newDOMRange.endOffset !== existingDOMRange.endOffset - ) { - debug('DOM range out of sync, validating selection') - // Remove all ranges temporary - domSelection?.removeAllRanges() - // Set the correct range - domSelection.addRange(newDOMRange) - } - } catch { - debug(`Could not resolve selection, selecting top document`) - // Deselect the editor - Transforms.deselect(slateEditor) - // Select top document if there is a top block to select - if (slateEditor.children.length > 0) { - Transforms.select(slateEditor, [0, 0]) - } - slateEditor.onChange() - } - }, [ref, slateEditor]) + const validateSelection = useValidateSelection(ref, slateEditor) // Observe mutations (child list and subtree) to this component's DOM, // and make sure the editor selection is valid when that happens. @@ -745,3 +690,68 @@ export const PortableTextEditable = forwardRef< /> ) }) +PortableTextEditable.displayName = 'ForwardRef(PortableTextEditable)' + +function useValidateSelection( + ref: MutableRefObject, + slateEditor: BaseEditor & ReactEditor & PortableTextSlateEditor, +) { + // This function will handle unexpected DOM changes inside the Editable rendering, + // and make sure that we can maintain a stable slateEditor.selection when that happens. + // + // For example, if this Editable is rendered inside something that might re-render + // this component (hidden contexts) while the user is still actively changing the + // contentEditable, this could interfere with the intermediate DOM selection, + // which again could be picked up by ReactEditor's event listeners. + // If that range is invalid at that point, the slate.editorSelection could be + // set either wrong, or invalid, to which slateEditor will throw exceptions + // that are impossible to recover properly from or result in a wrong selection. + // + // Also the other way around, when the ReactEditor will try to create a DOM Range + // from the current slateEditor.selection, it may throw unrecoverable errors + // if the current editor.selection is invalid according to the DOM. + // If this is the case, default to selecting the top of the document, if the + // user already had a selection. + return useCallback(() => { + if (!slateEditor.selection) { + return + } + const root = ReactEditor.findDocumentOrShadowRoot(slateEditor) + const {activeElement} = root + // Return if the editor isn't the active element + if (ref.current !== activeElement) { + return + } + const window = ReactEditor.getWindow(slateEditor) + const domSelection = window.getSelection() + if (!domSelection || domSelection.rangeCount === 0) { + return + } + const existingDOMRange = domSelection.getRangeAt(0) + try { + const newDOMRange = ReactEditor.toDOMRange( + slateEditor, + slateEditor.selection, + ) + if ( + newDOMRange.startOffset !== existingDOMRange.startOffset || + newDOMRange.endOffset !== existingDOMRange.endOffset + ) { + debug('DOM range out of sync, validating selection') + // Remove all ranges temporary + domSelection?.removeAllRanges() + // Set the correct range + domSelection.addRange(newDOMRange) + } + } catch { + debug(`Could not resolve selection, selecting top document`) + // Deselect the editor + Transforms.deselect(slateEditor) + // Select top document if there is a top block to select + if (slateEditor.children.length > 0) { + Transforms.select(slateEditor, [0, 0]) + } + slateEditor.onChange() + } + }, [ref, slateEditor]) +} diff --git a/packages/editor/src/editor/PortableTextEditor.tsx b/packages/editor/src/editor/PortableTextEditor.tsx index 499929e4e..75f04bf09 100644 --- a/packages/editor/src/editor/PortableTextEditor.tsx +++ b/packages/editor/src/editor/PortableTextEditor.tsx @@ -93,6 +93,7 @@ export type PortableTextEditorProps = PropsWithChildren<{ * @public */ export class PortableTextEditor extends Component { + public static displayName = 'PortableTextEditor' /** * An observable of all the editor changes. */ diff --git a/packages/editor/src/editor/components/DraggableBlock.tsx b/packages/editor/src/editor/components/DraggableBlock.tsx index 197f9aa7f..9822d2a39 100644 --- a/packages/editor/src/editor/components/DraggableBlock.tsx +++ b/packages/editor/src/editor/components/DraggableBlock.tsx @@ -308,3 +308,5 @@ export const DraggableBlock = ({ ) } + +DraggableBlock.displayName = 'DraggableBlock' diff --git a/packages/editor/src/editor/components/Element.tsx b/packages/editor/src/editor/components/Element.tsx index fa5c93b1c..384fcc4e9 100644 --- a/packages/editor/src/editor/components/Element.tsx +++ b/packages/editor/src/editor/components/Element.tsx @@ -317,3 +317,5 @@ export const Element: FunctionComponent = ({ ) } + +Element.displayName = 'Element' diff --git a/packages/editor/src/editor/components/Leaf.tsx b/packages/editor/src/editor/components/Leaf.tsx index d05f78322..7187a1137 100644 --- a/packages/editor/src/editor/components/Leaf.tsx +++ b/packages/editor/src/editor/components/Leaf.tsx @@ -181,6 +181,7 @@ export const Leaf = (props: LeafProps) => { onSelection.unsubscribe() } }, [ + editorActor, path, portableTextEditor, setSelectedFromRange, @@ -329,3 +330,5 @@ export const Leaf = (props: LeafProps) => { [leaf, attributes, content], ) } + +Leaf.displayName = 'Leaf' diff --git a/packages/editor/src/editor/components/SlateContainer.tsx b/packages/editor/src/editor/components/SlateContainer.tsx index 77fa72ab1..0eaf2077a 100644 --- a/packages/editor/src/editor/components/SlateContainer.tsx +++ b/packages/editor/src/editor/components/SlateContainer.tsx @@ -60,7 +60,14 @@ export function SlateContainer(props: SlateContainerProps) { portableTextEditor, readOnly, }) - }, [portableTextEditor, maxBlocks, readOnly, patches$, slateEditor]) + }, [ + editorActor, + portableTextEditor, + maxBlocks, + readOnly, + patches$, + slateEditor, + ]) const initialValue = useMemo(() => { return [slateEditor.pteCreateTextBlock({decorators: []})] @@ -79,3 +86,4 @@ export function SlateContainer(props: SlateContainerProps) { ) } +SlateContainer.displayName = 'SlateContainer' diff --git a/packages/editor/src/editor/components/Synchronizer.tsx b/packages/editor/src/editor/components/Synchronizer.tsx index 901182ea7..b95492727 100644 --- a/packages/editor/src/editor/components/Synchronizer.tsx +++ b/packages/editor/src/editor/components/Synchronizer.tsx @@ -1,7 +1,7 @@ import type {Patch} from '@portabletext/patches' import type {PortableTextBlock} from '@sanity/types' import {throttle} from 'lodash' -import {useCallback, useEffect, useMemo, useRef} from 'react' +import {useCallback, useEffect, useRef} from 'react' import {Editor} from 'slate' import {useSlate} from 'slate-react' import type {EditorChange} from '../../types/editor' @@ -68,8 +68,18 @@ export function Synchronizer(props: SynchronizerProps) { IS_PROCESSING_LOCAL_CHANGES.set(slateEditor, false) }, [editorActor, slateEditor, getValue]) - const onFlushPendingPatchesThrottled = useMemo(() => { - return throttle( + // Flush pending patches immediately on unmount + useEffect(() => { + return () => { + onFlushPendingPatches() + } + }, [onFlushPendingPatches]) + + // Subscribe to, and handle changes from the editor + useEffect(() => { + debug('Subscribing to editor changes') + + const onFlushPendingPatchesThrottled = throttle( () => { // If the editor is normalizing (each operation) it means that it's not in the middle of a bigger transform, // and we can flush these changes immediately. @@ -86,18 +96,7 @@ export function Synchronizer(props: SynchronizerProps) { trailing: true, }, ) - }, [onFlushPendingPatches, slateEditor]) - // Flush pending patches immediately on unmount - useEffect(() => { - return () => { - onFlushPendingPatches() - } - }, [onFlushPendingPatches]) - - // Subscribe to, and handle changes from the editor - useEffect(() => { - debug('Subscribing to editor changes') const sub = editorActor.on('*', (event) => { switch (event.type) { case 'patch': @@ -149,7 +148,7 @@ export function Synchronizer(props: SynchronizerProps) { debug('Unsubscribing to changes') sub.unsubscribe() } - }, [editorActor, onFlushPendingPatchesThrottled, slateEditor]) + }, [editorActor, onChange, onFlushPendingPatches, slateEditor]) // Sync the value when going online const handleOnline = useCallback(() => { @@ -168,7 +167,7 @@ export function Synchronizer(props: SynchronizerProps) { return () => { subscription.unsubscribe() } - }, [editorActor]) + }, [editorActor, handleOnline, portableTextEditor.props.patches$]) // This hook must be set up after setting up the subscription above, or it will not pick up validation errors from the useSyncValue hook. // This will cause the editor to not be able to signal a validation error and offer invalid value resolution of the initial value. @@ -185,3 +184,5 @@ export function Synchronizer(props: SynchronizerProps) { return null } + +Synchronizer.displayName = 'Synchronizer' diff --git a/packages/editor/src/editor/nodes/DefaultAnnotation.tsx b/packages/editor/src/editor/nodes/DefaultAnnotation.tsx index 67f6ac33d..5eedaaa08 100644 --- a/packages/editor/src/editor/nodes/DefaultAnnotation.tsx +++ b/packages/editor/src/editor/nodes/DefaultAnnotation.tsx @@ -16,3 +16,5 @@ export function DefaultAnnotation(props: Props) { ) } + +DefaultAnnotation.displayName = 'DefaultAnnotation' diff --git a/packages/editor/src/editor/nodes/DefaultObject.tsx b/packages/editor/src/editor/nodes/DefaultObject.tsx index 1ab87a7db..90fea1cb0 100644 --- a/packages/editor/src/editor/nodes/DefaultObject.tsx +++ b/packages/editor/src/editor/nodes/DefaultObject.tsx @@ -12,4 +12,6 @@ const DefaultObject = (props: Props): JSX.Element => { ) } +DefaultObject.displayName = 'DefaultObject' + export default DefaultObject diff --git a/packages/editor/src/editor/withSyncRangeDecorations.tsx b/packages/editor/src/editor/withSyncRangeDecorations.tsx new file mode 100644 index 000000000..a11736002 --- /dev/null +++ b/packages/editor/src/editor/withSyncRangeDecorations.tsx @@ -0,0 +1,20 @@ +import type {BaseEditor, Operation} from 'slate' +import type {ReactEditor} from 'slate-react' +import type {PortableTextSlateEditor} from '../types/editor' + +// React Compiler considers `slateEditor` as immutable, and opts-out if we do this inline in a useEffect, doing it in a function moves it out of the scope, and opts-in again for the rest of the component. +export function withSyncRangeDecorations( + slateEditor: BaseEditor & ReactEditor & PortableTextSlateEditor, + syncRangeDecorations: (operation?: Operation) => void, +) { + const originalApply = slateEditor.apply + slateEditor.apply = (op: Operation) => { + originalApply(op) + if (op.type !== 'set_selection') { + syncRangeDecorations(op) + } + } + return () => { + slateEditor.apply = originalApply + } +} diff --git a/packages/editor/vitest.workspace.ts b/packages/editor/vitest.workspace.ts index 6a04d348d..fa158583c 100644 --- a/packages/editor/vitest.workspace.ts +++ b/packages/editor/vitest.workspace.ts @@ -4,7 +4,11 @@ import {defineWorkspace} from 'vitest/config' export default defineWorkspace([ { - plugins: [react()], + plugins: [ + react({ + babel: {plugins: [['babel-plugin-react-compiler', {target: '18'}]]}, + }), + ], test: { name: 'chromium', include: ['gherkin-tests/**/*.test.ts'], @@ -18,7 +22,11 @@ export default defineWorkspace([ }, }, { - plugins: [react()], + plugins: [ + react({ + babel: {plugins: [['babel-plugin-react-compiler', {target: '18'}]]}, + }), + ], test: { name: 'firefox', include: ['gherkin-tests/**/*.test.ts'], @@ -32,7 +40,11 @@ export default defineWorkspace([ }, }, { - plugins: [react()], + plugins: [ + react({ + babel: {plugins: [['babel-plugin-react-compiler', {target: '18'}]]}, + }), + ], test: { name: 'webkit', include: ['gherkin-tests/**/*.test.ts'], @@ -46,7 +58,11 @@ export default defineWorkspace([ }, }, { - plugins: [react()], + plugins: [ + react({ + babel: {plugins: [['babel-plugin-react-compiler', {target: '18'}]]}, + }), + ], test: { name: 'unit', exclude: ['node_modules', 'e2e-tests', 'gherkin-tests'], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8d93936b..ecc4ebfd4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,6 +78,9 @@ importers: react-aria-components: specifier: ^1.2.1 version: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-compiler-runtime: + specifier: 19.0.0-beta-6fc168f-20241025 + version: 19.0.0-beta-6fc168f-20241025(react@18.3.1) react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) @@ -124,12 +127,30 @@ importers: '@types/uuid': specifier: ^10.0.0 version: 10.0.0 + '@typescript-eslint/eslint-plugin': + specifier: ^8.12.2 + version: 8.12.2(@typescript-eslint/parser@8.12.2(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/parser': + specifier: ^8.12.2 + version: 8.12.2(eslint@8.57.1)(typescript@5.6.3) '@vitejs/plugin-react': specifier: ^4.3.3 version: 4.3.3(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0)) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.47) + babel-plugin-react-compiler: + specifier: beta + version: 19.0.0-beta-6fc168f-20241025 + eslint: + specifier: '8' + version: 8.57.1 + eslint-plugin-react-compiler: + specifier: beta + version: 19.0.0-beta-6fc168f-20241025(eslint@8.57.1) + eslint-plugin-react-hooks: + specifier: ^5.0.0 + version: 5.0.0(eslint@8.57.1) postcss: specifier: ^8.4.47 version: 8.4.47 @@ -166,6 +187,9 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.21 + react-compiler-runtime: + specifier: 19.0.0-beta-6fc168f-20241025 + version: 19.0.0-beta-6fc168f-20241025(react@18.3.1) slate: specifier: 0.110.2 version: 0.110.2 @@ -205,7 +229,7 @@ importers: version: link:../gherkin-driver '@sanity/pkg-utils': specifier: ^6.11.7 - version: 6.11.7(@types/babel__core@7.20.5)(@types/node@18.19.59)(debug@4.3.7)(typescript@5.6.3) + version: 6.11.7(@types/babel__core@7.20.5)(@types/node@18.19.59)(babel-plugin-react-compiler@19.0.0-beta-6fc168f-20241025)(debug@4.3.7)(typescript@5.6.3) '@sanity/schema': specifier: ^3.62.3 version: 3.62.3(debug@4.3.7) @@ -257,6 +281,12 @@ importers: '@types/ws': specifier: ~8.5.12 version: 8.5.12 + '@typescript-eslint/eslint-plugin': + specifier: ^8.12.2 + version: 8.12.2(@typescript-eslint/parser@8.12.2(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/parser': + specifier: ^8.12.2 + version: 8.12.2(eslint@8.57.1)(typescript@5.6.3) '@vitejs/plugin-react': specifier: ^4.3.3 version: 4.3.3(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0)) @@ -266,9 +296,21 @@ importers: '@xstate/react': specifier: ^4.1.3 version: 4.1.3(@types/react@18.3.12)(react@18.3.1)(xstate@5.18.2) + babel-plugin-react-compiler: + specifier: beta + version: 19.0.0-beta-6fc168f-20241025 dotenv: specifier: ^16.4.5 version: 16.4.5 + eslint: + specifier: '8' + version: 8.57.1 + eslint-plugin-react-compiler: + specifier: beta + version: 19.0.0-beta-6fc168f-20241025(eslint@8.57.1) + eslint-plugin-react-hooks: + specifier: ^5.0.0 + version: 5.0.0(eslint@8.57.1) express: specifier: ^4.21.1 version: 4.21.1 @@ -337,7 +379,7 @@ importers: version: 29.7.0 '@sanity/pkg-utils': specifier: ^6.11.7 - version: 6.11.7(@types/babel__core@7.20.5)(@types/node@18.19.59)(debug@4.3.7)(typescript@5.6.3) + version: 6.11.7(@types/babel__core@7.20.5)(@types/node@18.19.59)(babel-plugin-react-compiler@19.0.0-beta-6fc168f-20241025)(debug@4.3.7)(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -356,7 +398,7 @@ importers: devDependencies: '@sanity/pkg-utils': specifier: ^6.11.7 - version: 6.11.7(@types/babel__core@7.20.5)(typescript@5.6.3) + version: 6.11.7(@types/babel__core@7.20.5)(@types/node@18.19.59)(babel-plugin-react-compiler@19.0.0-beta-6fc168f-20241025)(debug@4.3.7)(typescript@5.6.3) '@types/lodash': specifier: ^4.17.12 version: 4.17.12 @@ -519,6 +561,13 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/plugin-proposal-private-methods@7.18.6': + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} @@ -1390,6 +1439,24 @@ packages: cpu: [x64] os: [win32] + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@floating-ui/core@1.6.8': resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} @@ -1426,6 +1493,19 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + '@ianvs/prettier-plugin-sort-imports@4.3.1': resolution: {integrity: sha512-ZHwbyjkANZOjaBm3ZosADD2OUYGFzQGxfy67HmGZU94mHqe7g1LCMA7YYKB1Cq+UTPCBqlAYapY0KXAjKEw8Sg==} peerDependencies: @@ -2698,6 +2778,63 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@typescript-eslint/eslint-plugin@8.12.2': + resolution: {integrity: sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.12.2': + resolution: {integrity: sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.12.2': + resolution: {integrity: sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.12.2': + resolution: {integrity: sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.12.2': + resolution: {integrity: sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.12.2': + resolution: {integrity: sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.12.2': + resolution: {integrity: sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/visitor-keys@8.12.2': + resolution: {integrity: sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -2764,12 +2901,17 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.4: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.13.0: - resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -2793,6 +2935,9 @@ packages: ajv: optional: true + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} @@ -2843,6 +2988,9 @@ packages: argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -2911,6 +3059,9 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-react-compiler@19.0.0-beta-6fc168f-20241025: + resolution: {integrity: sha512-wFVeXhF0hkiRe4bEM0jzeTFMlMbcKNTwhXcFvqUIVB6WXf+3vdwOWGWnw7jwvDb2mzvsIZOFt/96itOFt1rwjw==} + babel-preset-current-node-syntax@1.1.0: resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: @@ -3235,6 +3386,9 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -3305,6 +3459,10 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -3400,11 +3558,57 @@ packages: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-compiler@19.0.0-beta-6fc168f-20241025: + resolution: {integrity: sha512-mHn5tYt9dT4GiXHF5muiz6p+4Lirgi0Oc87N2KrbB/ciSkT+VZ8iJA+6bbS4//ljYzYbxBbPMHWS/dZWhQrbpQ==} + engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} + peerDependencies: + eslint: '>=7' + + eslint-plugin-react-hooks@5.0.0: + resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -3477,6 +3681,9 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -3491,6 +3698,10 @@ packages: picomatch: optional: true + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3527,6 +3738,13 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} @@ -3688,6 +3906,10 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -3709,6 +3931,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphql@16.9.0: resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} @@ -3751,6 +3976,12 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + hermes-estree@0.20.1: + resolution: {integrity: sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==} + + hermes-parser@0.20.1: + resolution: {integrity: sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==} + homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} @@ -3808,6 +4039,10 @@ packages: immer@10.1.1: resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} @@ -3909,6 +4144,10 @@ packages: resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + is-path-inside@4.0.0: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} @@ -4133,6 +4372,10 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + jsdom@25.0.1: resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} engines: {node: '>=18'} @@ -4147,12 +4390,21 @@ packages: engines: {node: '>=6'} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -4164,6 +4416,9 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -4172,6 +4427,10 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -4207,6 +4466,9 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -4471,6 +4733,10 @@ packages: oniguruma-to-js@0.4.3: resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + os-homedir@1.0.2: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} @@ -4512,6 +4778,10 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} @@ -4679,6 +4949,10 @@ packages: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + prettier-plugin-gherkin@3.1.0: resolution: {integrity: sha512-3YXeJI2cEbVPOrLvjVgFACqmZ1d2gpTkyTn74OTAUXAH8F6E8v6SFSXFGiurWlW4hwbGBINKGNUbU3iDiIuT4g==} @@ -4798,6 +5072,11 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-compiler-runtime@19.0.0-beta-6fc168f-20241025: + resolution: {integrity: sha512-XY5p6GUVaz8P0c/B/2ebqz/xdp0YOtidtOSuiYyQB05fMws0Qys+zubDH7IKQBEtw4AKoCzrJ6ReeTtFLOKniw==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -4922,6 +5201,10 @@ packages: resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} engines: {node: '>=0.10.0'} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -4948,6 +5231,11 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + rimraf@4.4.1: resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} engines: {node: '>=14'} @@ -5267,6 +5555,9 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -5349,6 +5640,12 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -5409,10 +5706,18 @@ packages: resolution: {integrity: sha512-5lDvSqIxCYJ/BAd6rQGK/AzFRhBkbu4JHVMLmGh/hCb7U3CqSnr5Tjwfy9vc+/5wG2DJ6wttgAaA7MoCgvBKZQ==} hasBin: true + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -5684,6 +5989,10 @@ packages: engines: {node: '>=8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -6013,6 +6322,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6862,6 +7179,29 @@ snapshots: '@esbuild/win32-x64@0.24.0': optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.7 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + '@floating-ui/core@1.6.8': dependencies: '@floating-ui/utils': 0.2.8 @@ -6910,6 +7250,18 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + '@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3)': dependencies: '@babel/core': 7.26.0 @@ -8460,57 +8812,7 @@ snapshots: dependencies: react: 18.3.1 - '@sanity/pkg-utils@6.11.7(@types/babel__core@7.20.5)(@types/node@18.19.59)(debug@4.3.7)(typescript@5.6.3)': - dependencies: - '@babel/core': 7.26.0 - '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) - '@babel/types': 7.26.0 - '@microsoft/api-extractor': 7.47.11(@types/node@18.19.59) - '@microsoft/tsdoc-config': 0.17.0 - '@optimize-lodash/rollup-plugin': 5.0.0(rollup@4.24.2) - '@rollup/plugin-alias': 5.1.1(rollup@4.24.2) - '@rollup/plugin-babel': 6.0.4(@babel/core@7.26.0)(@types/babel__core@7.20.5)(rollup@4.24.2) - '@rollup/plugin-commonjs': 28.0.1(rollup@4.24.2) - '@rollup/plugin-json': 6.1.0(rollup@4.24.2) - '@rollup/plugin-node-resolve': 15.3.0(rollup@4.24.2) - '@rollup/plugin-replace': 6.0.1(rollup@4.24.2) - '@rollup/plugin-terser': 0.4.4(rollup@4.24.2) - '@sanity/browserslist-config': 1.0.3 - browserslist: 4.24.2 - cac: 6.7.14 - chalk: 4.1.2 - chokidar: 4.0.1 - esbuild: 0.24.0 - esbuild-register: 3.6.0(esbuild@0.24.0) - find-config: 1.0.0 - get-latest-version: 5.1.0(debug@4.3.7) - git-url-parse: 15.0.0 - globby: 11.1.0 - jsonc-parser: 3.3.1 - mkdirp: 3.0.1 - outdent: 0.8.0 - parse-git-config: 3.0.0 - pkg-up: 3.1.0 - prettier: 3.3.3 - pretty-bytes: 5.6.0 - prompts: 2.4.2 - recast: 0.23.9 - rimraf: 4.4.1 - rollup: 4.24.2 - rollup-plugin-esbuild: 6.1.1(esbuild@0.24.0)(rollup@4.24.2) - rxjs: 7.8.1 - treeify: 1.1.0 - typescript: 5.6.3 - uuid: 10.0.0 - zod: 3.23.8 - zod-validation-error: 3.4.0(zod@3.23.8) - transitivePeerDependencies: - - '@types/babel__core' - - '@types/node' - - debug - - supports-color - - '@sanity/pkg-utils@6.11.7(@types/babel__core@7.20.5)(typescript@5.6.3)': + '@sanity/pkg-utils@6.11.7(@types/babel__core@7.20.5)(@types/node@18.19.59)(babel-plugin-react-compiler@19.0.0-beta-6fc168f-20241025)(debug@4.3.7)(typescript@5.6.3)': dependencies: '@babel/core': 7.26.0 '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) @@ -8554,6 +8856,8 @@ snapshots: uuid: 10.0.0 zod: 3.23.8 zod-validation-error: 3.4.0(zod@3.23.8) + optionalDependencies: + babel-plugin-react-compiler: 19.0.0-beta-6fc168f-20241025 transitivePeerDependencies: - '@types/babel__core' - '@types/node' @@ -8891,6 +9195,87 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 + '@typescript-eslint/eslint-plugin@8.12.2(@typescript-eslint/parser@8.12.2(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.12.2(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/type-utils': 8.12.2(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/utils': 8.12.2(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.12.2 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.12.2(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.12.2 + debug: 4.3.7 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.12.2': + dependencies: + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/visitor-keys': 8.12.2 + + '@typescript-eslint/type-utils@8.12.2(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3) + '@typescript-eslint/utils': 8.12.2(eslint@8.57.1)(typescript@5.6.3) + debug: 4.3.7 + ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - eslint + - supports-color + + '@typescript-eslint/types@8.12.2': {} + + '@typescript-eslint/typescript-estree@8.12.2(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/visitor-keys': 8.12.2 + debug: 4.3.7 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.12.2(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@8.12.2': + dependencies: + '@typescript-eslint/types': 8.12.2 + eslint-visitor-keys: 3.4.3 + '@ungap/structured-clone@1.2.0': {} '@vitejs/plugin-react@4.3.3(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))': @@ -8981,11 +9366,15 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn-walk@8.3.4: dependencies: - acorn: 8.13.0 + acorn: 8.14.0 - acorn@8.13.0: {} + acorn@8.14.0: {} agent-base@7.1.1: dependencies: @@ -9001,6 +9390,13 @@ snapshots: optionalDependencies: ajv: 8.13.0 + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 @@ -9050,6 +9446,8 @@ snapshots: dependencies: sprintf-js: 1.0.3 + argparse@2.0.1: {} + aria-query@5.3.0: dependencies: dequal: 2.0.3 @@ -9142,6 +9540,10 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-react-compiler@19.0.0-beta-6fc168f-20241025: + dependencies: + '@babel/types': 7.26.0 + babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0): dependencies: '@babel/core': 7.26.0 @@ -9447,6 +9849,8 @@ snapshots: deep-extend@0.6.0: {} + deep-is@0.1.4: {} + deepmerge@4.3.1: {} define-data-property@1.1.4: @@ -9501,6 +9905,10 @@ snapshots: dlv@1.1.3: {} + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -9611,8 +10019,92 @@ snapshots: escape-string-regexp@2.0.0: {} + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-compiler@19.0.0-beta-6fc168f-20241025(eslint@8.57.1): + dependencies: + '@babel/core': 7.26.0 + '@babel/parser': 7.26.1 + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.0) + eslint: 8.57.1 + hermes-parser: 0.20.1 + zod: 3.23.8 + zod-validation-error: 3.4.0(zod@3.23.8) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-hooks@5.0.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.7 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -9727,6 +10219,8 @@ snapshots: fast-json-stable-stringify@2.1.0: {} + fast-levenshtein@2.0.6: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -9739,6 +10233,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -9790,6 +10288,14 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: debug: 4.3.7 @@ -9957,6 +10463,10 @@ snapshots: globals@11.12.0: {} + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -9991,6 +10501,8 @@ snapshots: graceful-fs@4.2.11: {} + graphemer@1.4.0: {} + graphql@16.9.0: {} groq-js@1.13.0: @@ -10043,6 +10555,12 @@ snapshots: headers-polyfill@4.0.3: {} + hermes-estree@0.20.1: {} + + hermes-parser@0.20.1: + dependencies: + hermes-estree: 0.20.1 + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 @@ -10097,6 +10615,11 @@ snapshots: immer@10.1.1: {} + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + import-lazy@4.0.0: {} import-local@3.2.0: @@ -10175,6 +10698,8 @@ snapshots: is-path-cwd@3.0.0: {} + is-path-inside@3.0.3: {} + is-path-inside@4.0.0: {} is-plain-obj@4.1.0: {} @@ -10593,6 +11118,10 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + jsdom@25.0.1: dependencies: cssstyle: 4.1.0 @@ -10623,10 +11152,16 @@ snapshots: jsesc@3.0.2: {} + json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} jsonc-parser@3.3.1: {} @@ -10635,10 +11170,19 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kleur@3.0.3: {} leven@3.1.0: {} + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + lilconfig@2.1.0: {} lilconfig@3.1.2: {} @@ -10684,6 +11228,8 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.merge@4.6.2: {} + lodash.startcase@4.4.0: {} lodash@4.17.21: {} @@ -10920,6 +11466,15 @@ snapshots: dependencies: regex: 4.3.3 + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + os-homedir@1.0.2: {} outdent@0.8.0: {} @@ -10952,6 +11507,10 @@ snapshots: package-json-from-dist@1.0.1: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + parse-entities@2.0.0: dependencies: character-entities: 1.2.4 @@ -11092,6 +11651,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prelude-ls@1.2.1: {} + prettier-plugin-gherkin@3.1.0: dependencies: '@cucumber/gherkin': 27.0.0 @@ -11279,6 +11840,10 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-compiler-runtime@19.0.0-beta-6fc168f-20241025(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -11435,6 +12000,8 @@ snapshots: expand-tilde: 1.2.2 global-modules: 0.2.3 + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -11456,6 +12023,10 @@ snapshots: rfdc@1.4.1: {} + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + rimraf@4.4.1: dependencies: glob: 9.3.5 @@ -11840,7 +12411,7 @@ snapshots: terser@5.36.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.13.0 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -11850,6 +12421,8 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + text-table@0.2.0: {} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -11916,6 +12489,10 @@ snapshots: trim-lines@3.0.1: {} + ts-api-utils@1.3.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + ts-interface-checker@0.1.13: {} ts-node@10.9.2(@types/node@18.19.59)(typescript@5.6.3): @@ -11926,7 +12503,7 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 18.19.59 - acorn: 8.13.0 + acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -11971,8 +12548,14 @@ snapshots: turbo-windows-64: 2.2.3 turbo-windows-arm64: 2.2.3 + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + type-detect@4.0.8: {} + type-fest@0.20.2: {} + type-fest@0.21.3: {} type-fest@4.26.1: {} @@ -12222,6 +12805,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + word-wrap@1.2.5: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0