diff --git a/.eslintignore.react-compiler b/.eslintignore.react-compiler index a8c40445500..90aa9428070 100644 --- a/.eslintignore.react-compiler +++ b/.eslintignore.react-compiler @@ -6,6 +6,7 @@ **/static/* **/coverage/* **/lib/* +**/__tests__/* **/node_modules/* **/dist/* *.json @@ -28,3 +29,4 @@ scripts/* test/* **/__workshop__/* packages/sanity/playwright-ct/** +**/@sanity/cli/templates/** diff --git a/.eslintrc.cjs b/.eslintrc.cjs index ae46d4acec1..c290ee7d569 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -37,9 +37,9 @@ const sanityNoRestrictedImportsPaths = [ }, { name: 'react', - importNames: ['default', 'createContext'], + importNames: ['default', 'createContext', 'createElement'], message: - 'Please use named imports, e.g. `import {useEffect, useMemo, type ComponentType} from "react"` instead.\nPlease place "context" in _singletons', + 'Please use named imports, e.g. `import {useEffect, useMemo, type ComponentType} from "react"` instead.\nPlease place "context" in _singletons\nPlease use JSX instead of createElement, for example `createElement(Icon)` should be ``', }, ] diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 73a7e64b5ee..1e4076c79be 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -64,7 +64,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/ms-playwright - key: playwright-browsers-${{ vars.PLAYWRIGHT_VERSION }} + key: playwright-browsers-${{ env.PLAYWRIGHT_VERSION }} - name: Install Playwright Browsers if: steps.cache-playwright-browsers.outputs.cache-hit != 'true' diff --git a/.gitignore b/.gitignore index e3295cb0bb3..e3f3696999f 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,6 @@ yalc.lock ## Documentation Report scripts/docs-report.md +# Temporary data collected by Million Lint +**/.million/store.json +dev/test-studio/.react-compiler-bailout-report.json diff --git a/.npmrc b/.npmrc index 880ed8cd149..042e9950a39 100644 --- a/.npmrc +++ b/.npmrc @@ -13,3 +13,6 @@ public-hoist-pattern[]=prettier-plugin-packagejson prefer-workspace-packages = true link-workspace-packages = deep + +; Used so that the Million Lint instrumentation to `packages/sanity` and ``packages/sanity/vision` done in the test studio works, without having to add the dependency everywhere +public-hoist-pattern[]=@million/lint diff --git a/dev/depcheck-test/package.json b/dev/depcheck-test/package.json index b942dc18422..9a25915d416 100644 --- a/dev/depcheck-test/package.json +++ b/dev/depcheck-test/package.json @@ -1,6 +1,6 @@ { "name": "depcheck-test", - "version": "3.67.1", + "version": "3.68.1", "private": true, "license": "MIT", "author": "Sanity.io " diff --git a/dev/design-studio/package.json b/dev/design-studio/package.json index d8a2b4bb216..191ef5809ed 100644 --- a/dev/design-studio/package.json +++ b/dev/design-studio/package.json @@ -1,6 +1,6 @@ { "name": "design-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "Sanity Design Studio", "keywords": [ @@ -31,8 +31,8 @@ "start": "../.bin/sanity start --port 4000" }, "dependencies": { - "@sanity/icons": "^3.5.2", - "@sanity/ui": "^2.10.9", + "@sanity/icons": "^3.5.5", + "@sanity/ui": "^2.10.12", "react": "^18.3.1", "react-dom": "^18.3.1", "sanity": "workspace:*", diff --git a/dev/embedded-studio/package.json b/dev/embedded-studio/package.json index effd0eb95f9..e494707dbc4 100644 --- a/dev/embedded-studio/package.json +++ b/dev/embedded-studio/package.json @@ -1,6 +1,6 @@ { "name": "embedded-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "scripts": { "build": "tsc && vite build && sanity manifest extract", @@ -8,15 +8,15 @@ "preview": "vite preview" }, "dependencies": { - "@sanity/ui": "^2.10.9", + "@sanity/ui": "^2.10.12", "react": "^18.3.1", "react-dom": "^18.3.1", "sanity": "workspace:*", "styled-components": "^6.1.0" }, "devDependencies": { - "@types/react": "^18.3.14", - "@types/react-dom": "^18.3.3", + "@types/react": "^18.3.17", + "@types/react-dom": "^18.3.5", "@vitejs/plugin-react": "^4.3.4", "typescript": "5.7.2", "vite": "^5.4.11" diff --git a/dev/page-building-studio/package.json b/dev/page-building-studio/package.json index b018beb29e1..78c205e1193 100644 --- a/dev/page-building-studio/package.json +++ b/dev/page-building-studio/package.json @@ -1,6 +1,6 @@ { "name": "sanity-page-building-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "license": "MIT", "author": "Sanity.io ", @@ -13,9 +13,9 @@ }, "dependencies": { "@sanity/vision": "workspace:*", - "babel-plugin-react-compiler": "19.0.0-beta-37ed2a7-20241206", + "babel-plugin-react-compiler": "19.0.0-beta-201e55d-20241215", "react": "^18.2.0", - "react-compiler-runtime": "19.0.0-beta-37ed2a7-20241206", + "react-compiler-runtime": "19.0.0-beta-201e55d-20241215", "react-dom": "^18.2.0", "react-icons": "^5.2.1", "sanity": "workspace:*", diff --git a/dev/starter-next-studio/package.json b/dev/starter-next-studio/package.json index f65f636ffb2..a8192cdd7a3 100644 --- a/dev/starter-next-studio/package.json +++ b/dev/starter-next-studio/package.json @@ -1,6 +1,6 @@ { "name": "sanity-starter-next-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "license": "MIT", "author": "Sanity.io ", diff --git a/dev/starter-studio/package.json b/dev/starter-studio/package.json index 675d2dd148f..67b44acde9b 100644 --- a/dev/starter-studio/package.json +++ b/dev/starter-studio/package.json @@ -1,6 +1,6 @@ { "name": "sanity-starter-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "license": "MIT", "author": "Sanity.io ", @@ -12,9 +12,9 @@ "start": "../.bin/sanity start --port 3337" }, "dependencies": { - "babel-plugin-react-compiler": "19.0.0-beta-37ed2a7-20241206", + "babel-plugin-react-compiler": "19.0.0-beta-201e55d-20241215", "react": "^18.3.1", - "react-compiler-runtime": "19.0.0-beta-37ed2a7-20241206", + "react-compiler-runtime": "19.0.0-beta-201e55d-20241215", "react-dom": "^18.3.1", "sanity": "workspace:*", "styled-components": "^6.1.0" diff --git a/dev/strict-studio/package.json b/dev/strict-studio/package.json index 917a28bfef4..46f39fbd934 100644 --- a/dev/strict-studio/package.json +++ b/dev/strict-studio/package.json @@ -1,6 +1,6 @@ { "name": "sanity-strict-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "license": "MIT", "author": "Sanity.io ", diff --git a/dev/studio-e2e-testing/package.json b/dev/studio-e2e-testing/package.json index 7d0072b6c80..93ffff161c0 100644 --- a/dev/studio-e2e-testing/package.json +++ b/dev/studio-e2e-testing/package.json @@ -1,6 +1,6 @@ { "name": "studio-e2e-testing", - "version": "3.67.1", + "version": "3.68.1", "private": true, "keywords": [ "sanity" @@ -17,12 +17,12 @@ "dependencies": { "@sanity/color-input": "^4.0.1", "@sanity/google-maps-input": "^4.0.0", - "@sanity/icons": "^3.5.2", - "@sanity/ui": "^2.10.9", - "@sanity/vision": "3.67.1", - "babel-plugin-react-compiler": "19.0.0-beta-37ed2a7-20241206", + "@sanity/icons": "^3.5.5", + "@sanity/ui": "^2.10.12", + "@sanity/vision": "3.68.1", + "babel-plugin-react-compiler": "19.0.0-beta-201e55d-20241215", "react": "^18.3.1", - "react-compiler-runtime": "19.0.0-beta-37ed2a7-20241206", + "react-compiler-runtime": "19.0.0-beta-201e55d-20241215", "react-dom": "^18.3.1", "sanity": "workspace:*", "sanity-plugin-markdown": "^5.0.0", diff --git a/dev/test-create-integration-studio/package.json b/dev/test-create-integration-studio/package.json index 18f3ff34eef..1f822781cfd 100644 --- a/dev/test-create-integration-studio/package.json +++ b/dev/test-create-integration-studio/package.json @@ -1,6 +1,6 @@ { "name": "test-create-integration-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "license": "MIT", "author": "Sanity.io ", diff --git a/dev/test-next-studio/package.json b/dev/test-next-studio/package.json index 9f3ec2c327f..abe246ae31e 100644 --- a/dev/test-next-studio/package.json +++ b/dev/test-next-studio/package.json @@ -1,6 +1,6 @@ { "name": "sanity-test-next-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "license": "MIT", "author": "Sanity.io ", @@ -12,8 +12,8 @@ }, "dependencies": { "@sanity/vision": "workspace:*", - "babel-plugin-react-compiler": "19.0.0-beta-37ed2a7-20241206", - "next": "15.0.4", + "babel-plugin-react-compiler": "19.0.0-beta-201e55d-20241215", + "next": "15.1.1", "react": "rc", "react-dom": "rc", "react-is": "rc", diff --git a/dev/test-next-studio/turbo.json b/dev/test-next-studio/turbo.json index cb04682e921..96c64879f03 100644 --- a/dev/test-next-studio/turbo.json +++ b/dev/test-next-studio/turbo.json @@ -3,7 +3,7 @@ "extends": ["//"], "tasks": { "build": { - "env": ["REACT_PRODUCTION_PROFILING"], + "env": ["REACT_PRODUCTION_PROFILING", "REACT_MILLION_LINT"], "outputs": [".next/**", "!.next/cache/**", "out/**"], "dependsOn": ["^build"] }, diff --git a/dev/test-studio/components/TranslateExample.tsx b/dev/test-studio/components/TranslateExample.tsx index 9bd95d44b5c..35013f50ccb 100644 --- a/dev/test-studio/components/TranslateExample.tsx +++ b/dev/test-studio/components/TranslateExample.tsx @@ -1,8 +1,9 @@ import {InfoFilledIcon} from '@sanity/icons' import {Card, Stack, Text} from '@sanity/ui' +import {forwardRef} from 'react' import {Translate, useTranslation} from 'sanity' -export function TranslateExample() { +export const TranslateExample = forwardRef(function TranslateExample() { const {t} = useTranslation('testStudio') return ( @@ -60,4 +61,4 @@ export function TranslateExample() { ) -} +}) diff --git a/dev/test-studio/components/panes/debug/DebugPane.tsx b/dev/test-studio/components/panes/debug/DebugPane.tsx index d73f97ede52..b0f7de8d704 100644 --- a/dev/test-studio/components/panes/debug/DebugPane.tsx +++ b/dev/test-studio/components/panes/debug/DebugPane.tsx @@ -1,7 +1,7 @@ import {ChevronDownIcon, ChevronRightIcon, ControlsIcon, LinkIcon} from '@sanity/icons' import {Box, Card, Code, Flex, Stack, Text} from '@sanity/ui' import type * as React from 'react' -import {useMemo} from 'react' +import {useMemo, useState} from 'react' import {usePaneRouter, type UserComponent} from 'sanity/structure' function usePaneChildLinkComponent(props: { @@ -48,7 +48,7 @@ export const DebugPane: UserComponent = function DebugPane(props) { // notice that the ID is only created on mount and should not change between // subsequent re-renders, therefore this ID will only change when the parent // component re-renders. - const randomId = useMemo(() => Math.floor(Math.random() * 10000000).toString(16), []) + const [randomId] = useState(() => Math.floor(Math.random() * 10000000).toString(16)) return ( diff --git a/dev/test-studio/package.json b/dev/test-studio/package.json index b1c7d0987a0..ee61fbf45c3 100644 --- a/dev/test-studio/package.json +++ b/dev/test-studio/package.json @@ -1,6 +1,6 @@ { "name": "sanity-test-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "license": "MIT", "author": "Sanity.io ", @@ -16,15 +16,15 @@ "workshop:dev": "node -r esbuild-register scripts/workshop/dev.ts" }, "dependencies": { - "@portabletext/editor": "^1.15.3", + "@portabletext/editor": "^1.16.3", "@portabletext/react": "^3.0.0", "@sanity/assist": "^3.0.2", - "@sanity/block-tools": "3.67.1", + "@sanity/block-tools": "3.68.1", "@sanity/client": "^6.24.1", "@sanity/color": "^3.0.0", "@sanity/color-input": "^4.0.1", "@sanity/google-maps-input": "^4.0.0", - "@sanity/icons": "^3.5.2", + "@sanity/icons": "^3.5.5", "@sanity/image-url": "^1.0.2", "@sanity/locale-ko-kr": "^1.0.1", "@sanity/locale-nb-no": "^1.0.1", @@ -35,14 +35,14 @@ "@sanity/migrate": "workspace:*", "@sanity/preview-url-secret": "^2.0.0", "@sanity/react-loader": "^1.10.27", - "@sanity/tsdoc": "1.0.150", + "@sanity/tsdoc": "1.0.153", "@sanity/types": "workspace:*", - "@sanity/ui": "^2.10.9", + "@sanity/ui": "^2.10.12", "@sanity/ui-workshop": "^1.0.0", "@sanity/util": "workspace:*", "@sanity/uuid": "^3.0.1", "@sanity/vision": "workspace:*", - "@sanity/visual-editing": "2.10.6", + "@sanity/visual-editing": "2.10.10", "@turf/helpers": "^6.0.1", "@turf/points-within-polygon": "^5.1.5", "@vercel/stega": "0.1.2", @@ -52,7 +52,7 @@ "lodash": "^4.17.21", "qs": "^6.10.2", "react": "^18.3.1", - "react-compiler-runtime": "19.0.0-beta-37ed2a7-20241206", + "react-compiler-runtime": "19.0.0-beta-201e55d-20241215", "react-dom": "^18.3.1", "react-refractor": "^2.1.6", "refractor": "^3.6.0", @@ -65,7 +65,8 @@ "styled-components": "^6.1.11" }, "devDependencies": { - "babel-plugin-react-compiler": "19.0.0-beta-37ed2a7-20241206", + "@million/lint": "1.0.14", + "babel-plugin-react-compiler": "19.0.0-beta-201e55d-20241215", "chokidar": "^3.6.0", "vite": "^5.4.11" } diff --git a/dev/test-studio/sanity.cli.ts b/dev/test-studio/sanity.cli.ts index 9978fe69684..5e8b1869b32 100644 --- a/dev/test-studio/sanity.cli.ts +++ b/dev/test-studio/sanity.cli.ts @@ -3,6 +3,20 @@ import path from 'node:path' import {defineCliConfig} from 'sanity/cli' import {type UserConfig} from 'vite' +const millionLintEnabled = process.env.REACT_MILLION_LINT === 'true' +const millionInclude: string[] = [] +try { + if (millionLintEnabled) { + for (const filePath of require('./.react-compiler-bailout-report.json')) { + millionInclude.push(`**/${filePath}`) + } + } +} catch (err) { + throw new Error('Failed to read lint report, did you run `pnpm report:react-compiler-bailout`?', { + cause: err, + }) +} + export default defineCliConfig({ api: { projectId: 'ppsg7ml5', @@ -13,12 +27,42 @@ export default defineCliConfig({ // A) `SANITY_STUDIO_REACT_STRICT_MODE=false pnpm dev` // B) creating a `.env` file locally that sets the same env variable as above reactStrictMode: true, - reactCompiler: {target: '18'}, + reactCompiler: millionLintEnabled + ? { + target: '18', + sources: (filename) => { + /** + * This is the default filter when `sources` is not defined. + * Since we're overriding it we have to ensure we don't accidentally try running the compiler on non-src files from npm. + */ + if (filename.includes('node_modules')) { + return false + } + return millionInclude.every( + (pattern) => !filename.endsWith(`/${pattern.split('**/')[1]}`), + ) + }, + } + : {target: '18'}, vite(viteConfig: UserConfig): UserConfig { const reactProductionProfiling = process.env.REACT_PRODUCTION_PROFILING === 'true' return { ...viteConfig, + plugins: millionLintEnabled + ? [ + /** + * We're doing a dynamic import here, instead of a static import, to avoid an issue where a WebSocket Server is created by Million for `vite dev` that isn't closed. + * Which leaves `sanity build` hanging, even if the plugin itself isn't actually used. + */ + require('@million/lint').vite({ + filter: { + include: millionInclude, + }, + }), + ...(viteConfig.plugins || []), + ] + : viteConfig.plugins, optimizeDeps: { ...viteConfig.optimizeDeps, include: ['react/jsx-runtime'], diff --git a/dev/test-studio/turbo.json b/dev/test-studio/turbo.json index fa282e4881d..fe29e2ba46b 100644 --- a/dev/test-studio/turbo.json +++ b/dev/test-studio/turbo.json @@ -3,7 +3,7 @@ "extends": ["//"], "tasks": { "build": { - "env": ["REACT_PRODUCTION_PROFILING"], + "env": ["REACT_PRODUCTION_PROFILING", "REACT_MILLION_LINT"], "outputs": [".sanity/**", "dist/**", "workshop/scopes.js"] }, "start": { diff --git a/examples/blog-studio/package.json b/examples/blog-studio/package.json index 46c5dc92c66..b51703bb5a7 100644 --- a/examples/blog-studio/package.json +++ b/examples/blog-studio/package.json @@ -1,6 +1,6 @@ { "name": "blog-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "Content studio running with schema from the blog init template", "keywords": [ diff --git a/examples/clean-studio/package.json b/examples/clean-studio/package.json index 6e77add793a..299bd37d09f 100644 --- a/examples/clean-studio/package.json +++ b/examples/clean-studio/package.json @@ -1,6 +1,6 @@ { "name": "clean-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "Content studio running with schema from the clean template", "keywords": [ diff --git a/examples/ecommerce-studio/package.json b/examples/ecommerce-studio/package.json index c1cea776bd7..cdd92c4ad11 100644 --- a/examples/ecommerce-studio/package.json +++ b/examples/ecommerce-studio/package.json @@ -1,6 +1,6 @@ { "name": "ecommerce-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "", "keywords": [ @@ -29,8 +29,8 @@ "start": "sanity dev --port 3337" }, "dependencies": { - "@sanity/cli": "3.67.1", - "@sanity/ui": "^2.10.9", + "@sanity/cli": "3.68.1", + "@sanity/ui": "^2.10.12", "react": "^18.3.1", "react-barcode": "^1.4.1", "react-dom": "^18.3.1", diff --git a/examples/movies-studio/package.json b/examples/movies-studio/package.json index 1931c0d2a49..2e423412598 100644 --- a/examples/movies-studio/package.json +++ b/examples/movies-studio/package.json @@ -1,6 +1,6 @@ { "name": "movies-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "Content studio running with schema from the moviedb init template", "keywords": [ diff --git a/lerna.json b/lerna.json index df78b0f9bbb..9b681c0de46 100644 --- a/lerna.json +++ b/lerna.json @@ -12,5 +12,5 @@ "packages/groq", "packages/sanity" ], - "version": "3.67.1" + "version": "3.68.1" } diff --git a/package.json b/package.json index 6552b43b26a..c83ac9af1d4 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "check:deps": "pnpm --recursive --parallel exec depcheck", "check:format": "prettier . --check", "check:lint": "turbo run lint --continue -- --quiet", - "check:react-compiler": "eslint --no-inline-config --no-eslintrc --ext .cjs,.mjs,.js,.jsx,.ts,.tsx --parser @typescript-eslint/parser --plugin react-compiler --rule 'react-compiler/react-compiler: [warn]' --ignore-path .eslintignore.react-compiler --max-warnings 79 .", + "check:react-compiler": "eslint --cache --no-inline-config --no-eslintrc --ext .cjs,.mjs,.js,.jsx,.ts,.tsx --parser @typescript-eslint/parser --plugin react-compiler --rule 'react-compiler/react-compiler: [warn]' --ignore-path .eslintignore.react-compiler --max-warnings 27 .", + "report:react-compiler-bailout": "eslint --cache --no-inline-config --no-eslintrc --ext .cjs,.mjs,.js,.jsx,.ts,.tsx --parser @typescript-eslint/parser --plugin react-compiler --rule 'react-compiler/react-compiler: [error,{__unstable_donotuse_reportAllBailouts:true}]' --ignore-path .eslintignore.react-compiler -f ./scripts/reactCompilerBailouts.cjs . || true", "check:test": "run-s test -- --silent", "check:types": "tsc && turbo run check:types --filter='./packages/*' --filter='./packages/@sanity/*'", "chore:format:fix": "prettier --cache --write .", @@ -41,6 +42,8 @@ "dev:test-studio": "pnpm --filter sanity-test-studio dev", "dev:test-create-studio": "pnpm --filter test-create-integration-studio dev", "dev:test-studio-production-profiling": "REACT_PRODUCTION_PROFILING=true turbo run start --filter=sanity-test-studio", + "dev:million-lint": "pnpm report:react-compiler-bailout && pnpm dev:test-studio-million-lint", + "dev:test-studio-million-lint": "REACT_MILLION_LINT=true pnpm --filter sanity-test-studio dev", "dev:next-studio": "pnpm --filter sanity-test-next-studio dev", "dev:turbo-studio": "pnpm dev:next-studio --turbo", "docs:report": "node -r dotenv-flow/config -r esbuild-register scripts/doc-report/docReport", @@ -111,11 +114,11 @@ "@sanity/eslint-config-i18n": "1.0.0", "@sanity/eslint-config-studio": "^4.0.0", "@sanity/mutate": "^0.11.1", - "@sanity/pkg-utils": "6.12.0", + "@sanity/pkg-utils": "6.12.2", "@sanity/prettier-config": "^1.0.3", "@sanity/test": "0.0.1-alpha.1", - "@sanity/tsdoc": "1.0.150", - "@sanity/ui": "^2.10.9", + "@sanity/tsdoc": "1.0.153", + "@sanity/ui": "^2.10.12", "@sanity/uuid": "^3.0.2", "@types/glob": "^7.2.0", "@types/lodash": "^4.17.7", @@ -142,7 +145,7 @@ "eslint-plugin-import": "^2.30.0", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.36.1", - "eslint-plugin-react-compiler": "19.0.0-beta-37ed2a7-20241206", + "eslint-plugin-react-compiler": "19.0.0-beta-201e55d-20241215", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-tsdoc": "^0.3.0", @@ -165,11 +168,11 @@ "rxjs": "^7.8.1", "sanity": "workspace:*", "semver": "^7.3.5", - "turbo": "^2.3.0", + "turbo": "^2.3.3", "typescript": "5.7.2", "vite": "^5.4.11", "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.1.1", + "vitest": "^2.1.8", "yargs": "^17.3.0" }, "optionalDependencies": { diff --git a/packages/@repo/dev-aliases/package.json b/packages/@repo/dev-aliases/package.json index 408c9293f85..754027e47b0 100644 --- a/packages/@repo/dev-aliases/package.json +++ b/packages/@repo/dev-aliases/package.json @@ -1,6 +1,6 @@ { "name": "@repo/dev-aliases", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "Dev aliases for the sanity monorepo", "type": "module", diff --git a/packages/@repo/package.bundle/package.json b/packages/@repo/package.bundle/package.json index a8a8b883387..d9e79a0e984 100644 --- a/packages/@repo/package.bundle/package.json +++ b/packages/@repo/package.bundle/package.json @@ -1,6 +1,6 @@ { "name": "@repo/package.bundle", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "Shared package bundle configuration", "main": "./src/package.bundle.ts", diff --git a/packages/@repo/package.config/package.json b/packages/@repo/package.config/package.json index 07d9e2c62b0..1df3523d9e8 100644 --- a/packages/@repo/package.config/package.json +++ b/packages/@repo/package.config/package.json @@ -1,6 +1,6 @@ { "name": "@repo/package.config", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "Shared @sanity/pkg-utils configuration", "main": "./src/package.config.ts", diff --git a/packages/@repo/test-config/package.json b/packages/@repo/test-config/package.json index f9ce1de02c2..7f53eeb5c05 100644 --- a/packages/@repo/test-config/package.json +++ b/packages/@repo/test-config/package.json @@ -1,6 +1,6 @@ { "name": "@repo/test-config", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "Test (as in unit test) config shared across packages in the sanity monorepo", "type": "module", @@ -9,6 +9,6 @@ }, "devDependencies": { "@repo/dev-aliases": "workspace:*", - "vitest": "^2.1.1" + "vitest": "^2.1.8" } } diff --git a/packages/@repo/test-exports/package.json b/packages/@repo/test-exports/package.json index bb60638debd..389084904dc 100644 --- a/packages/@repo/test-exports/package.json +++ b/packages/@repo/test-exports/package.json @@ -1,6 +1,6 @@ { "name": "@repo/test-exports", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "Ensures that all the monorepo packages that are published works in native node ESM and CJS runtimes", "exports": { diff --git a/packages/@repo/tsconfig/package.json b/packages/@repo/tsconfig/package.json index 236524b4ada..2b01552fa19 100644 --- a/packages/@repo/tsconfig/package.json +++ b/packages/@repo/tsconfig/package.json @@ -1,5 +1,5 @@ { "name": "@repo/tsconfig", - "version": "3.67.1", + "version": "3.68.1", "private": true } diff --git a/packages/@sanity/block-tools/package.json b/packages/@sanity/block-tools/package.json index 779a6b725d2..b6017047f72 100644 --- a/packages/@sanity/block-tools/package.json +++ b/packages/@sanity/block-tools/package.json @@ -1,6 +1,6 @@ { "name": "@sanity/block-tools", - "version": "3.67.1", + "version": "3.68.1", "description": "Can format HTML, Slate JSON or Sanity block array into any other format.", "keywords": [ "sanity", @@ -49,7 +49,7 @@ "watch": "pkg-utils watch" }, "dependencies": { - "@sanity/types": "3.67.1", + "@sanity/types": "3.68.1", "@types/react": "^18.3.5", "get-random-values-esm": "1.0.2", "lodash": "^4.17.21" @@ -57,13 +57,13 @@ "devDependencies": { "@repo/package.config": "workspace:*", "@repo/test-config": "workspace:*", - "@sanity/schema": "3.67.1", + "@sanity/schema": "3.68.1", "@types/jsdom": "^20.0.0", "@types/lodash": "^4.17.7", "@vercel/stega": "0.1.2", "@vitest/coverage-v8": "^2.1.1", "jsdom": "^23.0.1", - "vitest": "^2.1.1" + "vitest": "^2.1.8" }, "publishConfig": { "access": "public" diff --git a/packages/@sanity/cli/package.json b/packages/@sanity/cli/package.json index 0c7c284edfb..fe0d0dd41a6 100644 --- a/packages/@sanity/cli/package.json +++ b/packages/@sanity/cli/package.json @@ -1,6 +1,6 @@ { "name": "@sanity/cli", - "version": "3.67.1", + "version": "3.68.1", "description": "Sanity CLI tool for managing Sanity installations, managing plugins, schemas and datasets", "keywords": [ "sanity", @@ -58,9 +58,10 @@ "dependencies": { "@babel/traverse": "^7.23.5", "@sanity/client": "^6.24.1", - "@sanity/codegen": "3.67.1", + "@sanity/codegen": "3.68.1", "@sanity/telemetry": "^0.7.7", - "@sanity/util": "3.67.1", + "@sanity/template-validator": "^1.0.2", + "@sanity/util": "3.68.1", "chalk": "^4.1.2", "debug": "^4.3.4", "decompress": "^4.2.0", @@ -72,8 +73,7 @@ "prettier": "^3.3.0", "semver": "^7.3.5", "silver-fleece": "1.1.0", - "validate-npm-package-name": "^3.0.0", - "yaml": "^2.6.1" + "validate-npm-package-name": "^3.0.0" }, "devDependencies": { "@repo/package.config": "workspace:*", @@ -127,7 +127,7 @@ "semver-compare": "^1.0.0", "tar": "^6.1.11", "vite": "^5.4.11", - "vitest": "^2.1.1", + "vitest": "^2.1.8", "which": "^2.0.2", "xdg-basedir": "^4.0.0" }, diff --git a/packages/@sanity/cli/src/actions/init-project/bootstrapRemoteTemplate.ts b/packages/@sanity/cli/src/actions/init-project/bootstrapRemoteTemplate.ts index 7eca8f489ca..4f0aff7ddad 100644 --- a/packages/@sanity/cli/src/actions/init-project/bootstrapRemoteTemplate.ts +++ b/packages/@sanity/cli/src/actions/init-project/bootstrapRemoteTemplate.ts @@ -6,13 +6,15 @@ import {detectFrameworkRecord, LocalFileSystemDetector} from '@vercel/fs-detecto import {debug} from '../../debug' import {type CliCommandContext} from '../../types' +import {getDefaultPortForFramework} from '../../util/frameworkPort' import { applyEnvVariables, checkNeedsReadToken, downloadAndExtractRepo, generateSanityApiReadToken, - getMonoRepo, + getPackages, type RepoInfo, + setCorsOrigin, tryApplyPackageName, validateRemoteTemplate, } from '../../util/remoteTemplate' @@ -40,7 +42,7 @@ export async function bootstrapRemoteTemplate( const spinner = output.spinner(`Bootstrapping files from template "${name}"`).start() debug('Validating remote template') - const packages = await getMonoRepo(repoInfo, bearerToken) + const packages = await getPackages(repoInfo, bearerToken) await validateRemoteTemplate(repoInfo, packages, bearerToken) debug('Create new directory "%s"', outputPath) @@ -65,6 +67,12 @@ export async function bootstrapRemoteTemplate( fs: new LocalFileSystemDetector(packagePath), frameworkList: frameworks as readonly Framework[], }) + const port = getDefaultPortForFramework(packageFramework?.slug) + + debug('Setting CORS origin to http://localhost:%d', port) + await setCorsOrigin(`http://localhost:${port}`, variables.projectId, apiClient) + + debug('Applying environment variables to %s', pkg) // Next.js uses `.env.local` for local environment variables const envName = packageFramework?.slug === 'nextjs' ? '.env.local' : '.env' await applyEnvVariables(packagePath, {...variables, readToken}, envName) diff --git a/packages/@sanity/cli/src/outputters/cliOutputter.ts b/packages/@sanity/cli/src/outputters/cliOutputter.ts index 08738f36099..b77564a87bc 100644 --- a/packages/@sanity/cli/src/outputters/cliOutputter.ts +++ b/packages/@sanity/cli/src/outputters/cliOutputter.ts @@ -13,19 +13,19 @@ export default { console.log(...args) }, - success(...args: unknown[]): void { - console.log(`${SYMBOL_CHECK} ${args.join(' ')}`) + success(firstPartOfMessage: unknown, ...args: unknown[]): void { + console.log(`${SYMBOL_CHECK} ${firstPartOfMessage}`, ...args) }, - warn(...args: unknown[]): void { - console.warn(`${SYMBOL_WARN} ${args.join(' ')}`) + warn(firstPartOfMessage: unknown, ...args: unknown[]): void { + console.warn(`${SYMBOL_WARN} ${firstPartOfMessage}`, ...args) }, - error(...args: unknown[]): void { - if (args[0] instanceof Error) { - console.error(`${SYMBOL_FAIL} ${chalk.red(args[0].stack)}`) + error(firstPartOfMessage: unknown, ...args: unknown[]): void { + if (firstPartOfMessage instanceof Error) { + console.error(`${SYMBOL_FAIL} ${chalk.red(firstPartOfMessage.stack)}`) } else { - console.error(`${SYMBOL_FAIL} ${args.join(' ')}`) + console.error(`${SYMBOL_FAIL} ${firstPartOfMessage}`, ...args) } }, @@ -37,7 +37,7 @@ export default { }, spinner(options: Options): Ora { - const spinner = ora({...options, spinner: 'dots'}) + const spinner = ora(options) // Override the default status methods to use custom symbols instead of emojis spinner.succeed = (text?: string) => spinner.stopAndPersist({text, symbol: SYMBOL_CHECK}) spinner.warn = (text?: string) => spinner.stopAndPersist({text, symbol: SYMBOL_WARN}) diff --git a/packages/@sanity/cli/src/util/frameworkPort.ts b/packages/@sanity/cli/src/util/frameworkPort.ts new file mode 100644 index 00000000000..b8609f0d56c --- /dev/null +++ b/packages/@sanity/cli/src/util/frameworkPort.ts @@ -0,0 +1,63 @@ +const FALLBACK_PORT = 3000 + +const portMap: Record = { + 'nextjs': 3000, + 'blitzjs': 3000, + 'gatsby': 8000, + 'remix': 3000, + 'astro': 3000, + 'hexo': 4000, + 'eleventy': 8080, + 'docusaurus': 3000, + 'docusaurus-2': 3000, + 'preact': 8080, + 'solidstart': 3000, + 'solidstart-1': 3000, + 'dojo': 3000, + 'ember': 4200, + 'vue': 8080, + 'scully': 1668, + 'ionic-angular': 4200, + 'angular': 4200, + 'polymer': 8081, + 'svelte': 5000, + 'sveltekit': 5173, + 'sveltekit-1': 5173, + 'ionic-react': 3000, + 'create-react-app': 3000, + 'gridsome': 8080, + 'umijs': 8000, + 'saber': 3000, + 'stencil': 3333, + 'nuxtjs': 3000, + 'redwoodjs': 8910, + 'hugo': 1313, + 'jekyll': 4000, + 'brunch': 3333, + 'middleman': 4567, + 'zola': 1111, + 'hydrogen': 3000, + 'vite': 5173, + 'vitepress': 5173, + 'vuepress': 8080, + 'parcel': 1234, + 'fasthtml': 8000, + 'sanity': 3333, + 'sanity-v3': 3333, + 'storybook': 6006, +} + +/** + * Returns the default development port for a given framework. + * Contains default ports for all frameworks supported by `@vercel/frameworks`. + * Falls back to port 3000 if framework is not found or not specified. + * + * @see https://github.com/vercel/vercel/blob/main/packages/frameworks/src/frameworks.ts + * for the complete list of supported frameworks + * + * @param frameworkSlug - The framework identifier from `@vercel/frameworks` + * @returns The default port number for the framework + */ +export function getDefaultPortForFramework(frameworkSlug?: string | null): number { + return portMap[frameworkSlug ?? ''] ?? FALLBACK_PORT +} diff --git a/packages/@sanity/cli/src/util/remoteTemplate.ts b/packages/@sanity/cli/src/util/remoteTemplate.ts index fbfc184e3f8..0995ccaacdd 100644 --- a/packages/@sanity/cli/src/util/remoteTemplate.ts +++ b/packages/@sanity/cli/src/util/remoteTemplate.ts @@ -4,25 +4,27 @@ import {Readable} from 'node:stream' import {pipeline} from 'node:stream/promises' import {type ReadableStream} from 'node:stream/web' +import { + ENV_TEMPLATE_FILES, + getMonoRepo, + REQUIRED_ENV_VAR, + validateSanityTemplate, +} from '@sanity/template-validator' import {x} from 'tar' -import {parse as parseYaml} from 'yaml' +import {debug} from '../debug' import {type CliApiClient, type PackageJson} from '../types' +const DISALLOWED_PATHS = [ + // Prevent security risks from unknown GitHub Actions + '/.github/', +] + const ENV_VAR = { - PROJECT_ID: /SANITY(?:_STUDIO)?_PROJECT_ID/, // Matches SANITY_PROJECT_ID and SANITY_STUDIO_PROJECT_ID - DATASET: /SANITY(?:_STUDIO)?_DATASET/, // Matches SANITY_DATASET and SANITY_STUDIO_DATASET + ...REQUIRED_ENV_VAR, READ_TOKEN: 'SANITY_API_READ_TOKEN', } as const -const ENV_FILE = { - TEMPLATE: '.env.template', - EXAMPLE: '.env.example', - LOCAL_EXAMPLE: '.env.local.example', -} as const - -const ENV_TEMPLATE_FILES = [ENV_FILE.TEMPLATE, ENV_FILE.EXAMPLE, ENV_FILE.LOCAL_EXAMPLE] as const - type EnvData = { projectId: string dataset: string @@ -40,6 +42,11 @@ export type RepoInfo = { filePath: string } +function getGitHubRawContentUrl(repoInfo: RepoInfo): string { + const {username, name, branch, filePath} = repoInfo + return `https://raw.githubusercontent.com/${username}/${name}/${branch}/${filePath}` +} + function isGithubRepoShorthand(value: string): boolean { if (URL.canParse(value)) { return false @@ -180,6 +187,9 @@ export async function downloadAndExtractRepo( const pathSegments = posixPath.split(posix.sep) rootPath = pathSegments.length ? pathSegments[0] : null } + for (const disallowedPath of DISALLOWED_PATHS) { + if (posixPath.includes(disallowedPath)) return false + } return posixPath.startsWith(`${rootPath}${filePath ? `/${filePath}/` : '/'}`) }, }), @@ -191,222 +201,29 @@ export async function downloadAndExtractRepo( * Supports pnpm workspaces, Lerna, Rush, and npm workspaces (package.json). * @returns Promise that resolves to an array of package paths/names if monorepo is detected, undefined otherwise */ -export async function getMonoRepo( +export async function getPackages( repoInfo: RepoInfo, bearerToken?: string, ): Promise { - const {username, name, branch, filePath} = repoInfo - const baseUrl = `https://raw.githubusercontent.com/${username}/${name}/${branch}/${filePath}` - const headers: Record = {} if (bearerToken) { headers.Authorization = `Bearer ${bearerToken}` } - - type MonorepoHandler = { - check: (content: string) => string[] | undefined - } - - const handlers: Record = { - 'package.json': { - check: (content) => { - try { - const pkg = JSON.parse(content) - if (!pkg.workspaces) return undefined - return Array.isArray(pkg.workspaces) ? pkg.workspaces : pkg.workspaces.packages - } catch { - return undefined - } - }, - }, - 'pnpm-workspace.yaml': { - check: (content) => { - try { - const config = parseYaml(content) - return config.packages - } catch { - return undefined - } - }, - }, - 'lerna.json': { - check: (content) => { - try { - const config = JSON.parse(content) - return config.packages - } catch { - return undefined - } - }, - }, - 'rush.json': { - check: (content) => { - try { - const config = JSON.parse(content) - return config.projects?.map((p: {packageName: string}) => p.packageName) - } catch { - return undefined - } - }, - }, - } - - const fileChecks = await Promise.all( - Object.keys(handlers).map(async (file) => { - const response = await fetch(`${baseUrl}/${file}`, {headers}) - return {file, exists: response.status === 200, content: await response.text()} - }), - ) - - for (const check of fileChecks) { - if (!check.exists) continue - const result = handlers[check.file].check(check.content) - if (result) return result - } - - return undefined + return getMonoRepo(getGitHubRawContentUrl(repoInfo), headers) } -/** - * Validates a single package within a repository against required criteria. - */ -async function validatePackage( - baseUrl: string, - packagePath: string, - headers: Record, -): Promise<{ - hasSanityConfig: boolean - hasSanityCli: boolean - hasEnvFile: boolean - hasSanityDep: boolean -}> { - const packageUrl = packagePath ? `${baseUrl}/${packagePath}` : baseUrl - - const requiredFiles = [ - 'package.json', - 'sanity.config.ts', - 'sanity.config.js', - 'sanity.cli.ts', - 'sanity.cli.js', - ...ENV_TEMPLATE_FILES, - ] - - const fileChecks = await Promise.all( - requiredFiles.map(async (file) => { - const response = await fetch(`${packageUrl}/${file}`, {headers}) - return {file, exists: response.status === 200, content: await response.text()} - }), - ) - - const packageJson = fileChecks.find((f) => f.file === 'package.json') - if (!packageJson?.exists) { - throw new Error(`Package at ${packagePath || 'root'} must include a package.json file`) - } - - let hasSanityDep = false - try { - const pkg: PackageJson = JSON.parse(packageJson.content) - hasSanityDep = !!(pkg.dependencies?.sanity || pkg.devDependencies?.sanity) - } catch (err) { - throw new Error(`Invalid package.json file in ${packagePath || 'root'}`) - } - - const hasSanityConfig = fileChecks.some( - (f) => f.exists && (f.file === 'sanity.config.ts' || f.file === 'sanity.config.js'), - ) - - const hasSanityCli = fileChecks.some( - (f) => f.exists && (f.file === 'sanity.cli.ts' || f.file === 'sanity.cli.js'), - ) - - const envFile = fileChecks.find( - (f) => f.exists && ENV_TEMPLATE_FILES.includes(f.file as (typeof ENV_TEMPLATE_FILES)[number]), - ) - if (envFile) { - const envContent = envFile.content - const hasProjectId = envContent.match(ENV_VAR.PROJECT_ID) - const hasDataset = envContent.match(ENV_VAR.DATASET) - - if (!hasProjectId || !hasDataset) { - const missing = [] - if (!hasProjectId) missing.push('SANITY_PROJECT_ID or SANITY_STUDIO_PROJECT_ID') - if (!hasDataset) missing.push('SANITY_DATASET or SANITY_STUDIO_DATASET') - throw new Error( - `Environment template in ${ - packagePath || 'repo' - } must include the following variables: ${missing.join(', ')}`, - ) - } - } - - return { - hasSanityConfig, - hasSanityCli, - hasEnvFile: Boolean(envFile), - hasSanityDep, - } -} - -/** - * Validates a GitHub repository template against required criteria. - * Supports both monorepo and single-package repositories. - * - * For monorepos: - * - Each package must have a valid package.json - * - At least one package must include 'sanity' in dependencies or devDependencies - * - At least one package must have sanity.config.js/ts and sanity.cli.js/ts - * - Each package must have a .env.template, .env.example, or .env.local.example - * - * For single-package repositories: - * - Must have a valid package.json with 'sanity' dependency - * - Must have sanity.config.js/ts and sanity.cli.js/ts - * - Must have .env.template, .env.example, or .env.local.example - * - * Environment files must include: - * - SANITY_PROJECT_ID or SANITY_STUDIO_PROJECT_ID variable - * - SANITY_DATASET or SANITY_STUDIO_DATASET variable - * - * @throws Error if validation fails with specific reason - */ export async function validateRemoteTemplate( repoInfo: RepoInfo, packages: string[] = [''], bearerToken?: string, ): Promise { - const {username, name, branch, filePath} = repoInfo - const baseUrl = `https://raw.githubusercontent.com/${username}/${name}/${branch}/${filePath}` - const headers: Record = {} if (bearerToken) { headers.Authorization = `Bearer ${bearerToken}` } - - const validations = await Promise.all( - packages.map((pkg) => validatePackage(baseUrl, pkg, headers)), - ) - - const hasSanityDep = validations.some((v) => v.hasSanityDep) - if (!hasSanityDep) { - throw new Error('At least one package must include "sanity" as a dependency in package.json') - } - - const hasSanityConfig = validations.some((v) => v.hasSanityConfig) - if (!hasSanityConfig) { - throw new Error('At least one package must include a sanity.config.js or sanity.config.ts file') - } - - const hasSanityCli = validations.some((v) => v.hasSanityCli) - if (!hasSanityCli) { - throw new Error('At least one package must include a sanity.cli.js or sanity.cli.ts file') - } - - const missingEnvPackages = packages.filter((pkg, i) => !validations[i].hasEnvFile) - if (missingEnvPackages.length > 0) { - throw new Error( - `The following packages are missing .env.template, .env.example, or .env.local.example files: ${missingEnvPackages.join( - ', ', - )}`, - ) + const result = await validateSanityTemplate(getGitHubRawContentUrl(repoInfo), packages, headers) + if (!result.isValid) { + throw new Error(result.errors.join('\n')) } } @@ -510,3 +327,20 @@ export async function generateSanityApiReadToken( }) return response.key } + +export async function setCorsOrigin( + origin: string, + projectId: string, + apiClient: CliApiClient, +): Promise { + try { + await apiClient({api: {projectId}}).request({ + method: 'POST', + url: '/cors', + body: {origin: origin, allowCredentials: false}, + }) + } catch (error) { + // Silent fail, it most likely means that the origin is already set + debug('Failed to set CORS origin', error) + } +} diff --git a/packages/@sanity/cli/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx b/packages/@sanity/cli/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx index d381d433f97..76fe6e23266 100644 --- a/packages/@sanity/cli/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +++ b/packages/@sanity/cli/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx @@ -1,4 +1,4 @@ -import React, {useRef, useState} from 'react' +import React, {useState} from 'react' import { Card, Container, @@ -32,8 +32,8 @@ export const GetStartedTutorial = () => { ) const {sanity} = useTheme() - const rootElement = useRef(null) - const rect = useElementSize(rootElement.current) + const [rootElement, setRootElement] = useState(null) + const rect = useElementSize(rootElement) const width = rect?.content?.width const isSmallScreen = width ? width < sanity.media[1] : false const isProdEnv = process.env.NODE_ENV !== 'development' @@ -48,7 +48,7 @@ export const GetStartedTutorial = () => { } return ( -
+
{isSmallScreen && ( diff --git a/packages/@sanity/cli/test/test-template/package.json b/packages/@sanity/cli/test/test-template/package.json index 7fdbd0c9c4b..a6743ee6ddf 100644 --- a/packages/@sanity/cli/test/test-template/package.json +++ b/packages/@sanity/cli/test/test-template/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@sanity/assist": "^3.0.8", - "@sanity/icons": "^3.5.2", + "@sanity/icons": "^3.5.5", "@sanity/image-url": "^1.0.2", "@sanity/preview-url-secret": "^2.0.0", "@sanity/vision": "^3.62.0", diff --git a/packages/@sanity/codegen/package.json b/packages/@sanity/codegen/package.json index b87d9b8c52c..0fbb5cbd965 100644 --- a/packages/@sanity/codegen/package.json +++ b/packages/@sanity/codegen/package.json @@ -1,6 +1,6 @@ { "name": "@sanity/codegen", - "version": "3.67.1", + "version": "3.68.1", "description": "Codegen toolkit for Sanity.io", "keywords": [ "sanity", @@ -75,7 +75,7 @@ "@types/babel__traverse": "^7.20.5", "@types/debug": "^4.1.12", "rimraf": "^5.0.10", - "vitest": "^2.1.1" + "vitest": "^2.1.8" }, "engines": { "node": ">=18" diff --git a/packages/@sanity/codegen/src/typescript/__tests__/findQueriesInPath.test.ts b/packages/@sanity/codegen/src/typescript/__tests__/findQueriesInPath.test.ts index 1d5d4e6a14a..c3da55f9a73 100644 --- a/packages/@sanity/codegen/src/typescript/__tests__/findQueriesInPath.test.ts +++ b/packages/@sanity/codegen/src/typescript/__tests__/findQueriesInPath.test.ts @@ -40,4 +40,18 @@ describe('findQueriesInPath', () => { assert(result.value.type === 'error') // workaround for TS expect(result.value.error.message).toMatch(/Duplicate query name found:/) }) + + test('can find and handle .astro files', async () => { + const stream = findQueriesInPath({ + path: [path.join('**', 'typescript', '__tests__', 'fixtures', '*.astro')], + }) + const res = [] + for await (const result of stream) { + res.push(result) + } + expect(res.length).toBe(1) + expect(res[0].type).toBe('queries') + assert(res[0].type === 'queries') // workaround for TS + expect(res[0].queries.length).toBe(1) + }) }) diff --git a/packages/@sanity/codegen/src/typescript/__tests__/fixtures/import.astro b/packages/@sanity/codegen/src/typescript/__tests__/fixtures/import.astro new file mode 100644 index 00000000000..648a1dad9fd --- /dev/null +++ b/packages/@sanity/codegen/src/typescript/__tests__/fixtures/import.astro @@ -0,0 +1,9 @@ +--- +import groq from 'groq' +import { type Client } from '@sanity/client' + +export const query = groq`*[_type == "myType"]` +--- + +
{query}
+
diff --git a/packages/@sanity/codegen/src/typescript/__tests__/parseSource.test.ts b/packages/@sanity/codegen/src/typescript/__tests__/parseSource.test.ts new file mode 100644 index 00000000000..bb21d77b41b --- /dev/null +++ b/packages/@sanity/codegen/src/typescript/__tests__/parseSource.test.ts @@ -0,0 +1,31 @@ +import {describe, expect, test} from 'vitest' + +import {parseSourceFile} from '../parseSource' + +describe('parseSource', () => { + test('should parse astro', () => { + const source = ` +--- +import Layout from '../layouts/Layout.astro'; +import { project_dir } from '../libs/utils'; + + +const proj = "10_prerender" +const render_time = new Date() +export const prerender = true +--- + + +
+

Prerendered

+

This page was prerendered at {render_time.toISOString()}

+
+
+ ` + + const parsed = parseSourceFile(source, 'foo.astro', {}) + + expect(parsed.type).toBe('File') + expect(parsed.program.body.length).toBe(5) + }) +}) diff --git a/packages/@sanity/codegen/src/typescript/parseSource.ts b/packages/@sanity/codegen/src/typescript/parseSource.ts index 26085d571c6..b4ccda466e8 100644 --- a/packages/@sanity/codegen/src/typescript/parseSource.ts +++ b/packages/@sanity/codegen/src/typescript/parseSource.ts @@ -3,10 +3,17 @@ import type * as babelTypes from '@babel/types' // helper function to parse a source file export function parseSourceFile( - source: string, - filename: string, + _source: string, + _filename: string, babelOptions: TransformOptions, ): babelTypes.File { + let source = _source + let filename = _filename + if (filename.endsWith('.astro')) { + // append .ts to the filename so babel will parse it as typescript + filename += '.ts' + source = parseAstro(source) + } const result = parse(source, { ...babelOptions, filename, @@ -18,3 +25,17 @@ export function parseSourceFile( return result } + +function parseAstro(source: string): string { + // find all code fences, the js code is between --- and --- + const codeFences = source.match(/---\n([\s\S]*?)\n---/g) + if (!codeFences) { + return '' + } + + return codeFences + .map((codeFence) => { + return codeFence.split('\n').slice(1, -1).join('\n') + }) + .join('\n') +} diff --git a/packages/@sanity/diff/package.json b/packages/@sanity/diff/package.json index 1fc114f6732..de2688b573b 100644 --- a/packages/@sanity/diff/package.json +++ b/packages/@sanity/diff/package.json @@ -1,6 +1,6 @@ { "name": "@sanity/diff", - "version": "3.67.1", + "version": "3.68.1", "description": "Generates diffs between documents and primitive types", "keywords": [ "sanity", diff --git a/packages/@sanity/migrate/package.json b/packages/@sanity/migrate/package.json index ddc79049e61..7ba893a12e1 100644 --- a/packages/@sanity/migrate/package.json +++ b/packages/@sanity/migrate/package.json @@ -1,6 +1,6 @@ { "name": "@sanity/migrate", - "version": "3.67.1", + "version": "3.68.1", "description": "Tooling for running data migrations on Sanity.io projects", "keywords": [ "sanity", @@ -52,8 +52,8 @@ "dependencies": { "@sanity/client": "^6.24.1", "@sanity/mutate": "^0.11.1", - "@sanity/types": "3.67.1", - "@sanity/util": "3.67.1", + "@sanity/types": "3.68.1", + "@sanity/util": "3.68.1", "arrify": "^2.0.1", "debug": "^4.3.4", "fast-fifo": "^1.3.2", @@ -63,10 +63,9 @@ "devDependencies": { "@repo/package.config": "workspace:*", "@repo/test-config": "workspace:*", - "@types/arrify": "^2.0.1", "@types/debug": "^4.1.12", "rimraf": "^5.0.10", - "vitest": "^2.1.1" + "vitest": "^2.1.8" }, "engines": { "node": ">=18" diff --git a/packages/@sanity/mutator/package.json b/packages/@sanity/mutator/package.json index 8d2ef7f33c8..dc23fac5c0a 100644 --- a/packages/@sanity/mutator/package.json +++ b/packages/@sanity/mutator/package.json @@ -1,6 +1,6 @@ { "name": "@sanity/mutator", - "version": "3.67.1", + "version": "3.68.1", "description": "A set of models to make it easier to utilize the powerful real time collaborative features of Sanity", "keywords": [ "sanity", @@ -50,7 +50,7 @@ }, "dependencies": { "@sanity/diff-match-patch": "^3.1.1", - "@sanity/types": "3.67.1", + "@sanity/types": "3.68.1", "@sanity/uuid": "^3.0.1", "debug": "^4.3.4", "lodash": "^4.17.21" @@ -61,6 +61,6 @@ "@types/debug": "^4.1.5", "@types/lodash": "^4.17.7", "rimraf": "^5.0.10", - "vitest": "^2.1.1" + "vitest": "^2.1.8" } } diff --git a/packages/@sanity/schema/package.json b/packages/@sanity/schema/package.json index 71918760238..6f149351501 100644 --- a/packages/@sanity/schema/package.json +++ b/packages/@sanity/schema/package.json @@ -1,6 +1,6 @@ { "name": "@sanity/schema", - "version": "3.67.1", + "version": "3.68.1", "description": "", "keywords": [ "sanity", @@ -64,8 +64,8 @@ }, "dependencies": { "@sanity/generate-help-url": "^3.0.0", - "@sanity/types": "3.67.1", - "arrify": "^1.0.1", + "@sanity/types": "3.68.1", + "arrify": "^2.0.1", "groq-js": "^1.14.2", "humanize-list": "^1.0.1", "leven": "^3.1.0", @@ -75,12 +75,11 @@ "devDependencies": { "@repo/package.config": "workspace:*", "@repo/test-config": "workspace:*", - "@sanity/icons": "^3.5.2", - "@types/arrify": "^1.0.4", + "@sanity/icons": "^3.5.5", "@types/lodash": "^4.17.7", "@types/object-inspect": "^1.13.0", "@types/react": "^18.3.12", "rimraf": "^5.0.10", - "vitest": "^2.1.1" + "vitest": "^2.1.8" } } diff --git a/packages/@sanity/types/package.json b/packages/@sanity/types/package.json index 278a2ce8bb3..bea54a0993f 100644 --- a/packages/@sanity/types/package.json +++ b/packages/@sanity/types/package.json @@ -1,6 +1,6 @@ { "name": "@sanity/types", - "version": "3.67.1", + "version": "3.68.1", "description": "Type definitions for common Sanity data structures", "keywords": [ "sanity", @@ -59,6 +59,6 @@ "@vitejs/plugin-react": "^4.3.4", "react": "^18.3.1", "rimraf": "^5.0.10", - "vitest": "^2.1.1" + "vitest": "^2.1.8" } } diff --git a/packages/@sanity/util/package.json b/packages/@sanity/util/package.json index 63a2275005f..2463308bf49 100644 --- a/packages/@sanity/util/package.json +++ b/packages/@sanity/util/package.json @@ -1,6 +1,6 @@ { "name": "@sanity/util", - "version": "3.67.1", + "version": "3.68.1", "description": "Utilities shared across projects of Sanity", "keywords": [ "sanity", @@ -122,7 +122,7 @@ }, "dependencies": { "@sanity/client": "^6.24.1", - "@sanity/types": "3.67.1", + "@sanity/types": "3.68.1", "get-random-values-esm": "1.0.2", "moment": "^2.30.1", "rxjs": "^7.8.1" @@ -131,7 +131,7 @@ "@repo/package.config": "workspace:*", "@repo/test-config": "workspace:*", "rimraf": "^5.0.10", - "vitest": "^2.1.1" + "vitest": "^2.1.8" }, "engines": { "node": ">=18" diff --git a/packages/@sanity/vision/package.json b/packages/@sanity/vision/package.json index 3189db8d3cc..155f5cb8934 100644 --- a/packages/@sanity/vision/package.json +++ b/packages/@sanity/vision/package.json @@ -1,6 +1,6 @@ { "name": "@sanity/vision", - "version": "3.67.1", + "version": "3.68.1", "description": "Sanity plugin for running/debugging GROQ-queries against Sanity datasets", "keywords": [ "sanity", @@ -59,18 +59,18 @@ "@codemirror/view": "^6.1.1", "@juggle/resize-observer": "^3.3.1", "@lezer/highlight": "^1.0.0", - "@rexxars/react-json-inspector": "^8.0.1", - "@rexxars/react-split-pane": "^0.1.93", + "@rexxars/react-json-inspector": "^9.0.1", + "@rexxars/react-split-pane": "^1.0.0", "@sanity/color": "^3.0.0", - "@sanity/icons": "^3.5.2", - "@sanity/ui": "^2.10.9", + "@sanity/icons": "^3.5.5", + "@sanity/ui": "^2.10.12", "@uiw/react-codemirror": "^4.11.4", "is-hotkey-esm": "^1.0.0", "json-2-csv": "^5.5.1", "json5": "^2.2.3", "lodash": "^4.17.21", "quick-lru": "^5.1.1", - "react-compiler-runtime": "19.0.0-beta-37ed2a7-20241206" + "react-compiler-runtime": "19.0.0-beta-201e55d-20241215" }, "devDependencies": { "@repo/package.config": "workspace:*", @@ -85,7 +85,7 @@ "@sanity/types": "workspace:*", "@sanity/util": "workspace:*", "@types/lodash": "^4.17.7", - "babel-plugin-react-compiler": "19.0.0-beta-37ed2a7-20241206", + "babel-plugin-react-compiler": "19.0.0-beta-201e55d-20241215", "react": "^18.3.1", "sanity": "workspace:*", "styled-components": "^6.1.13" diff --git a/packages/@sanity/vision/src/components/ResultView.tsx b/packages/@sanity/vision/src/components/ResultView.tsx index b6a1e4913ed..48d76d9ac71 100644 --- a/packages/@sanity/vision/src/components/ResultView.tsx +++ b/packages/@sanity/vision/src/components/ResultView.tsx @@ -1,4 +1,4 @@ -import JSONInspector from '@rexxars/react-json-inspector' +import {JsonInspector} from '@rexxars/react-json-inspector' import {LinkIcon} from '@sanity/icons' import {Code} from '@sanity/ui' import LRU from 'quick-lru' @@ -16,7 +16,7 @@ export function ResultView(props: {data: unknown; datasetName: string}): JSX.Ele if (isRecord(data) || Array.isArray(data)) { return ( - { - {/* @ts-expect-error: https://github.com/tomkp/react-split-pane/pull/819 */} { - Disables resize if the container height is less then 500px This should ensure that we mostly avoid a pane to take up all the room, and for the controls to not be eaten up by the pane */} - {/* @ts-expect-error: https://github.com/tomkp/react-split-pane/pull/819 */} ((options) => { component: lazy(() => import('./SanityVision')), options: config, router: route.create('/*'), + __internalApplicationType: 'sanity/vision', }, ], i18n: { diff --git a/packages/create-sanity/package.json b/packages/create-sanity/package.json index 9e67a61e845..825ae815554 100644 --- a/packages/create-sanity/package.json +++ b/packages/create-sanity/package.json @@ -1,6 +1,6 @@ { "name": "create-sanity", - "version": "3.67.1", + "version": "3.68.1", "description": "Initialize a new Sanity project", "keywords": [ "sanity", @@ -26,7 +26,7 @@ "index.js" ], "dependencies": { - "@sanity/cli": "3.67.1", + "@sanity/cli": "3.68.1", "resolve-pkg": "^2.0.0" }, "engines": { diff --git a/packages/groq/package.json b/packages/groq/package.json index 96fb815fe2b..06655ac31fb 100644 --- a/packages/groq/package.json +++ b/packages/groq/package.json @@ -1,6 +1,6 @@ { "name": "groq", - "version": "3.67.1", + "version": "3.68.1", "description": "Tagged template literal for Sanity.io GROQ-queries", "keywords": [ "sanity", diff --git a/packages/sanity/README.md b/packages/sanity/README.md index 95263054400..eeb3162328a 100644 --- a/packages/sanity/README.md +++ b/packages/sanity/README.md @@ -77,9 +77,11 @@ Check out [the docs](https://www.sanity.io/docs/sanity-studio) and [plugins](htt ## Stay up to date -- Follow **@sanity_io** on [Twitter](https://twitter.com/sanity_io) +- Follow us on [X](https://x.com/sanity_io) +- Follow us on [Bluesky](https://bsky.app/profile/sanity.io) +- Subscribe to our [YouTube channel](https://www.youtube.com/@sanity_io) - Subscribe to [our blog by RSS](https://www.sanity.io/feed/rss) -- Subscribe to our [newsletter](http://eepurl.com/b2yaDz) +- Subscribe to our [newsletter](https://www.sanity.io/newsletter) - Join the [developer community on Slack](https://slack.sanity.io) ## Code of Conduct diff --git a/packages/sanity/package.json b/packages/sanity/package.json index e960f001d08..73b9c71b25c 100644 --- a/packages/sanity/package.json +++ b/packages/sanity/package.json @@ -1,6 +1,6 @@ { "name": "sanity", - "version": "3.67.1", + "version": "3.68.1", "description": "Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches", "keywords": [ "sanity", @@ -153,37 +153,36 @@ "@dnd-kit/sortable": "^7.0.1", "@dnd-kit/utilities": "^3.2.0", "@juggle/resize-observer": "^3.3.1", - "@portabletext/editor": "^1.15.3", + "@portabletext/editor": "^1.16.3", "@portabletext/react": "^3.0.0", - "@rexxars/react-json-inspector": "^8.0.1", + "@rexxars/react-json-inspector": "^9.0.1", "@sanity/asset-utils": "^2.0.6", "@sanity/bifur-client": "^0.4.1", - "@sanity/block-tools": "3.67.1", - "@sanity/cli": "3.67.1", + "@sanity/block-tools": "3.68.1", + "@sanity/cli": "3.68.1", "@sanity/client": "^6.24.1", "@sanity/color": "^3.0.0", - "@sanity/diff": "3.67.1", + "@sanity/diff": "3.68.1", "@sanity/diff-match-patch": "^3.1.1", "@sanity/eventsource": "^5.0.0", "@sanity/export": "^3.41.1", - "@sanity/icons": "^3.5.2", + "@sanity/icons": "^3.5.5", "@sanity/image-url": "^1.0.2", "@sanity/import": "^3.37.9", "@sanity/insert-menu": "1.0.16", "@sanity/logos": "^2.1.4", - "@sanity/migrate": "3.67.1", - "@sanity/mutator": "3.67.1", + "@sanity/migrate": "3.68.1", + "@sanity/mutator": "3.68.1", "@sanity/presentation": "1.19.8-release.0", - "@sanity/schema": "3.67.1", + "@sanity/schema": "3.68.1", "@sanity/telemetry": "^0.7.7", - "@sanity/types": "3.67.1", - "@sanity/ui": "^2.10.9", - "@sanity/util": "3.67.1", + "@sanity/types": "3.68.1", + "@sanity/ui": "^2.10.12", + "@sanity/util": "3.68.1", "@sanity/uuid": "^3.0.1", "@sentry/react": "^8.33.0", "@tanstack/react-table": "^8.16.0", - "@tanstack/react-virtual": "3.0.0-beta.54", - "@types/react-copy-to-clipboard": "^5.0.2", + "@tanstack/react-virtual": "^3.11.2", "@types/react-is": "^18.3.0", "@types/shallow-equals": "^1.0.0", "@types/speakingurl": "^13.0.3", @@ -191,7 +190,7 @@ "@types/use-sync-external-store": "^0.0.6", "@vitejs/plugin-react": "^4.3.4", "archiver": "^7.0.0", - "arrify": "^1.0.1", + "arrify": "^2.0.1", "async-mutex": "^0.4.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", @@ -207,7 +206,7 @@ "execa": "^2.0.0", "exif-component": "^1.0.1", "form-data": "^4.0.0", - "framer-motion": "11.0.8", + "framer-motion": "^11.15.0", "get-it": "^8.6.5", "get-random-values-esm": "1.0.2", "groq-js": "^1.14.2", @@ -215,6 +214,7 @@ "i18next": "^23.2.7", "import-fresh": "^3.3.0", "is-hotkey-esm": "^1.0.0", + "isomorphic-dompurify": "^2.19.0", "jsdom": "^23.0.1", "jsdom-global": "^3.0.2", "json-lexer": "^1.2.0", @@ -237,14 +237,13 @@ "pretty-ms": "^7.0.1", "quick-lru": "^5.1.1", "raf": "^3.4.1", - "react-compiler-runtime": "19.0.0-beta-37ed2a7-20241206", - "react-copy-to-clipboard": "^5.0.4", + "react-compiler-runtime": "19.0.0-beta-201e55d-20241215", "react-fast-compare": "^3.2.0", - "react-focus-lock": "^2.8.1", + "react-focus-lock": "^2.13.5", "react-i18next": "14.0.2", "react-is": "^18.2.0", "react-refractor": "^2.1.6", - "react-rx": "^4.1.8", + "react-rx": "^4.1.10", "read-pkg-up": "^7.0.1", "refractor": "^3.6.0", "resolve-from": "^5.0.0", @@ -273,17 +272,16 @@ "@repo/dev-aliases": "workspace:*", "@repo/package.config": "workspace:*", "@repo/test-config": "workspace:*", - "@sanity/codegen": "3.67.1", + "@sanity/codegen": "3.68.1", "@sanity/generate-help-url": "^3.0.0", - "@sanity/pkg-utils": "6.12.0", - "@sanity/tsdoc": "1.0.150", + "@sanity/pkg-utils": "6.12.2", + "@sanity/tsdoc": "1.0.153", "@sanity/ui-workshop": "^1.2.11", "@sentry/types": "^8.12.0", "@testing-library/jest-dom": "^6.4.8", "@testing-library/react": "^15.0.6", "@testing-library/user-event": "^13.5.0", "@types/archiver": "^6.0.2", - "@types/arrify": "^1.0.4", "@types/configstore": "^5.0.1", "@types/debug": "^4.1.12", "@types/jsdom": "^20.0.0", @@ -299,7 +297,7 @@ "@types/tar-fs": "^2.0.1", "@vitejs/plugin-react": "^4.3.3", "@vvo/tzdb": "6.137.0", - "babel-plugin-react-compiler": "19.0.0-beta-37ed2a7-20241206", + "babel-plugin-react-compiler": "19.0.0-beta-201e55d-20241215", "blob-polyfill": "^9.0.20240710", "date-fns-tz": "2.0.1", "react": "^18.3.1", diff --git a/packages/sanity/playwright-ct/tests/formBuilder/inputs/PortableText/RangeDecoration.spec.tsx b/packages/sanity/playwright-ct/tests/formBuilder/inputs/PortableText/RangeDecoration.spec.tsx deleted file mode 100644 index dc798d36446..00000000000 --- a/packages/sanity/playwright-ct/tests/formBuilder/inputs/PortableText/RangeDecoration.spec.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import {expect, test} from '@playwright/experimental-ct-react' -import {type SanityDocument} from 'sanity' - -import {testHelpers} from '../../../utils/testHelpers' -import {type DecorationData, RangeDecorationStory} from './RangeDecorationStory' - -const document: SanityDocument = { - _id: '123', - _type: 'test', - _createdAt: new Date().toISOString(), - _updatedAt: new Date().toISOString(), - _rev: '123', - body: [ - { - _type: 'block', - _key: 'a', - children: [{_type: 'span', _key: 'a1', text: 'Hello there world'}], - markDefs: [], - }, - { - _type: 'block', - _key: 'b', - children: [{_type: 'span', _key: 'b1', text: "It's a beautiful day on planet earth"}], - markDefs: [], - }, - ], -} - -// Since we can't pass React components to our story, we'll just pass the selection data, -// and use a test component inside the Story to render the range decoration. -const decorationData: DecorationData[] = [ - { - word: 'there', - selection: { - anchor: {path: [{_key: 'a'}, 'children', {_key: 'a1'}], offset: 6}, - focus: {path: [{_key: 'a'}, 'children', {_key: 'a1'}], offset: 11}, - }, - }, -] - -test.describe('Portable Text Input', () => { - test.describe('Range Decoration', () => { - // test.only('Manual testing can be performed with this test', async ({mount, page}) => { - // await mount() - // await page.waitForTimeout(360000) - // }) - test(`Draws range decoration around our selection`, async ({mount, page}) => { - await mount() - await expect(page.getByTestId('range-decoration')).toHaveText('there') - }) - - test(`Let's us move the range according to our edits`, async ({mount, page}) => { - const {getFocusedPortableTextEditor, insertPortableText} = testHelpers({page}) - - await mount() - - const $pte = await getFocusedPortableTextEditor('field-body') - - await insertPortableText('123 ', $pte) - await expect($pte).toHaveText("123 Hello there worldIt's a beautiful day on planet earth") - // Assert that the same word is decorated after the edit - await expect(page.getByTestId('range-decoration')).toHaveText('there') - expect(await page.getByTestId('range-decoration').count()).toBe(1) - }) - test(`Let's us render single point decorations correctly`, async ({mount, page}) => { - const {getFocusedPortableTextEditor} = testHelpers({page}) - const singlePointDecorationData: DecorationData[] = [ - { - selection: { - anchor: {path: [{_key: 'a'}, 'children', {_key: 'a1'}], offset: 6}, - focus: {path: [{_key: 'a'}, 'children', {_key: 'a1'}], offset: 6}, - }, - word: '', - }, - ] - await mount( - , - ) - await getFocusedPortableTextEditor('field-body') - expect(await page.getByTestId('range-decoration').count()).toBe(1) - }) - }) -}) diff --git a/packages/sanity/playwright-ct/tests/formBuilder/inputs/PortableText/RangeDecorationStory.tsx b/packages/sanity/playwright-ct/tests/formBuilder/inputs/PortableText/RangeDecorationStory.tsx deleted file mode 100644 index 39e48166cdc..00000000000 --- a/packages/sanity/playwright-ct/tests/formBuilder/inputs/PortableText/RangeDecorationStory.tsx +++ /dev/null @@ -1,91 +0,0 @@ -/* eslint-disable max-nested-callbacks */ -import {type EditorSelection, type RangeDecoration} from '@portabletext/editor' -import {defineArrayMember, defineField, defineType, type SanityDocument} from '@sanity/types' -import {type PropsWithChildren, useEffect, useMemo, useState} from 'react' -import {type InputProps, PortableTextInput, type PortableTextInputProps} from 'sanity' - -import {TestForm} from '../../utils/TestForm' -import {TestWrapper} from '../../utils/TestWrapper' - -export type DecorationData = {selection: EditorSelection; word: string} - -const RangeDecorationTestComponent = (props: PropsWithChildren) => { - return ( - - {props.children} - - ) -} - -const CustomPortableTextInput = ( - props: PortableTextInputProps & {decorationData?: DecorationData[]}, -) => { - const {decorationData} = props - const [rangeDecorationsState, setRangeDecorationsState] = useState([]) - - useEffect(() => { - setRangeDecorationsState( - (decorationData?.map((data) => ({ - component: RangeDecorationTestComponent, - selection: data.selection, - onMoved: (movedProps) => { - const {newSelection, rangeDecoration} = movedProps - setRangeDecorationsState((prev) => - prev.map((decoration) => - data.selection === rangeDecoration.selection - ? {...decoration, selection: newSelection} - : decoration, - ), - ) - }, - payload: {word: data.word}, - })) || []) as RangeDecoration[], - ) - }, [decorationData]) - - return -} - -export function RangeDecorationStory({ - document, - decorationData, -}: { - document?: SanityDocument - decorationData?: DecorationData[] -}) { - const schemaTypes = useMemo( - () => [ - defineType({ - type: 'document', - name: 'test', - title: 'Test', - fields: [ - defineField({ - type: 'array', - name: 'body', - of: [ - defineArrayMember({ - type: 'block', - }), - ], - components: { - input: (props: InputProps) => ( - - ), - }, - }), - ], - }), - ], - [decorationData], - ) - - return ( - - - - ) -} diff --git a/packages/sanity/playwright-ct/tests/formBuilder/utils/TestForm.tsx b/packages/sanity/playwright-ct/tests/formBuilder/utils/TestForm.tsx index 742c063ac92..96b71978868 100644 --- a/packages/sanity/playwright-ct/tests/formBuilder/utils/TestForm.tsx +++ b/packages/sanity/playwright-ct/tests/formBuilder/utils/TestForm.tsx @@ -96,7 +96,7 @@ export function TestForm(props: TestFormProps) { }, ) const [focusPath, setFocusPath] = useState(() => focusPathFromProps || []) - const patchChannel = useMemo(() => createPatchChannel(), []) + const [patchChannel] = useState(() => createPatchChannel()) useGlobalCopyPasteElementHandler({ element: wrapperRef.current, diff --git a/packages/sanity/playwright-ct/tests/utils/testHelpers.tsx b/packages/sanity/playwright-ct/tests/utils/testHelpers.tsx index d85b8cc65e5..42d48034288 100644 --- a/packages/sanity/playwright-ct/tests/utils/testHelpers.tsx +++ b/packages/sanity/playwright-ct/tests/utils/testHelpers.tsx @@ -73,11 +73,11 @@ export function testHelpers({page}: {page: PlaywrightTestArgs['page']}) { // Wait for field to get ready (without this tests fails randomly on Webkit) await page.locator(`[data-testid='${testId}']`).waitFor() const $pteField: Locator = page.getByTestId(testId) + await $pteField.locator('[contenteditable="true"]').waitFor() + const $pteTextbox = $pteField.locator('[contenteditable="true"]') // Activate the input if needed await activatePTInputOverlay($pteField) // Ensure focus on the contentEditable element of the Portable Text Editor - const $pteTextbox = $pteField.getByRole('textbox') - await $pteTextbox.isEditable() await $pteTextbox.focus() return $pteField }, @@ -93,11 +93,11 @@ export function testHelpers({page}: {page: PlaywrightTestArgs['page']}) { // Wait for field to get ready (without this tests fails randomly on Webkit) await page.locator(`[data-testid='${testId}']`).waitFor() const $pteField: Locator = page.getByTestId(testId) + await $pteField.locator('[contenteditable="true"]').waitFor() + const $pteTextbox = $pteField.locator('[contenteditable="true"]') // Activate the input if needed await activatePTInputOverlay($pteField) // Ensure focus on the contentEditable element of the Portable Text Editor - const $pteTextbox = $pteField.getByRole('textbox') - await $pteTextbox.isEditable() await $pteTextbox.focus() return $pteTextbox }, diff --git a/packages/sanity/src/_internal/cli/actions/manifest/extractManifestAction.ts b/packages/sanity/src/_internal/cli/actions/manifest/extractManifestAction.ts index 509110cf775..24d57f7d469 100644 --- a/packages/sanity/src/_internal/cli/actions/manifest/extractManifestAction.ts +++ b/packages/sanity/src/_internal/cli/actions/manifest/extractManifestAction.ts @@ -17,6 +17,7 @@ import {getTimer} from '../../util/timing' const MANIFEST_FILENAME = 'create-manifest.json' const SCHEMA_FILENAME_SUFFIX = '.create-schema.json' +const TOOLS_FILENAME_SUFFIX = '.create-tools.json' /** Escape-hatch env flags to change action behavior */ const FEATURE_ENABLED_ENV_NAME = 'SANITY_CLI_EXTRACT_MANIFEST_ENABLED' @@ -90,7 +91,12 @@ async function extractManifest( const workspaceFiles = await writeWorkspaceFiles(workspaceManifests, staticPath) const manifest: CreateManifest = { - version: 1, + /** + * Version history: + * 1: Initial release. + * 2: Added tools file. + */ + version: 2, createdAt: new Date().toISOString(), workspaces: workspaceFiles, } @@ -157,26 +163,36 @@ function writeWorkspaceFiles( ): Promise { const output = manifestWorkspaces.reduce[]>( (workspaces, workspace) => { - return [...workspaces, writeWorkspaceSchemaFile(workspace, staticPath)] + return [...workspaces, writeWorkspaceFile(workspace, staticPath)] }, [], ) return Promise.all(output) } -async function writeWorkspaceSchemaFile( +async function writeWorkspaceFile( workspace: CreateWorkspaceManifest, staticPath: string, ): Promise { - const schemaString = JSON.stringify(workspace.schema, null, 2) - const hash = createHash('sha1').update(schemaString).digest('hex') - const filename = `${hash.slice(0, 8)}${SCHEMA_FILENAME_SUFFIX}` - - // workspaces with identical schemas will overwrite each others schema file. This is ok, since they are identical and can be shared - await writeFile(join(staticPath, filename), schemaString) + const [schemaFilename, toolsFilename] = await Promise.all([ + createFile(staticPath, workspace.schema, SCHEMA_FILENAME_SUFFIX), + createFile(staticPath, workspace.tools, TOOLS_FILENAME_SUFFIX), + ]) return { ...workspace, - schema: filename, + schema: schemaFilename, + tools: toolsFilename, } } + +const createFile = async (path: string, content: any, filenameSuffix: string) => { + const stringifiedContent = JSON.stringify(content, null, 2) + const hash = createHash('sha1').update(stringifiedContent).digest('hex') + const filename = `${hash.slice(0, 8)}${filenameSuffix}` + + // workspaces with identical data will overwrite each others file. This is ok, since they are identical and can be shared + await writeFile(join(path, filename), stringifiedContent) + + return filename +} diff --git a/packages/sanity/src/_internal/cli/server/renderDocument.ts b/packages/sanity/src/_internal/cli/server/renderDocument.tsx similarity index 98% rename from packages/sanity/src/_internal/cli/server/renderDocument.ts rename to packages/sanity/src/_internal/cli/server/renderDocument.tsx index 123e7b68cca..0e1be1c83f9 100644 --- a/packages/sanity/src/_internal/cli/server/renderDocument.ts +++ b/packages/sanity/src/_internal/cli/server/renderDocument.tsx @@ -13,7 +13,6 @@ import {isMainThread, parentPort, Worker, workerData} from 'node:worker_threads' import chalk from 'chalk' import importFresh from 'import-fresh' import {parse as parseHtml} from 'node-html-parser' -import {createElement} from 'react' import {renderToStaticMarkup} from 'react-dom/server' import {TIMESTAMPED_IMPORTMAP_INJECTOR_SCRIPT} from './constants' @@ -231,7 +230,7 @@ function getDocumentHtml( debug('Rendering document component using React') const result = addTimestampedImportMapScriptToHtml( - renderToStaticMarkup(createElement(Document, {...defaultProps, ...props, css})), + renderToStaticMarkup(), importMap, ) diff --git a/packages/sanity/src/_internal/manifest/Icon.tsx b/packages/sanity/src/_internal/manifest/Icon.tsx new file mode 100644 index 00000000000..a0b087ab4e6 --- /dev/null +++ b/packages/sanity/src/_internal/manifest/Icon.tsx @@ -0,0 +1,30 @@ +import {ThemeProvider} from '@sanity/ui' +import {buildTheme} from '@sanity/ui/theme' +import {type ComponentType, isValidElement, type ReactNode} from 'react' +import {isValidElementType} from 'react-is' +import {createDefaultIcon} from 'sanity' + +const theme = buildTheme() + +interface SchemaIconProps { + icon?: ComponentType | ReactNode + title: string + subtitle?: string +} + +const SchemaIcon = ({icon, title, subtitle}: SchemaIconProps): JSX.Element => { + return {normalizeIcon(icon, title, subtitle)} +} + +function normalizeIcon( + Icon: ComponentType | ReactNode | undefined, + title: string, + subtitle = '', +): JSX.Element { + if (isValidElementType(Icon)) return + if (isValidElement(Icon)) return Icon + return createDefaultIcon(title, subtitle) +} + +export {SchemaIcon} +export type {SchemaIconProps} diff --git a/packages/sanity/src/_internal/manifest/__tests__/Icon.test.tsx b/packages/sanity/src/_internal/manifest/__tests__/Icon.test.tsx new file mode 100644 index 00000000000..79cbdae1a30 --- /dev/null +++ b/packages/sanity/src/_internal/manifest/__tests__/Icon.test.tsx @@ -0,0 +1,50 @@ +import {studioTheme, ThemeProvider} from '@sanity/ui' +import {render as renderRTL, screen} from '@testing-library/react' +import {describe, expect, it} from 'vitest' + +import {SchemaIcon, type SchemaIconProps} from '../Icon' + +const render = (props?: Partial) => + renderRTL(, { + wrapper: ({children}) => {children}, + }) + +describe('SchemaIcon', () => { + it("should render the title's first letter as uppercase when there is no icon present & the title is a single word", () => { + render() + + expect(screen.getByText('S')).toBeInTheDocument() + }) + + it('should render the first two letters of a multi-word title as uppercase when there is no icon present', () => { + render({title: 'My Studio'}) + + expect(screen.getByText('MS')).toBeInTheDocument() + }) + + it('should render the icon when present as a ComponentType', () => { + render({ + icon: () => ( + + + + ), + }) + + expect(screen.getByTestId('icon')).toBeInTheDocument() + expect(screen.queryByText('S')).not.toBeInTheDocument() + }) + + it('should render the icon when present as a ReactNode', () => { + render({ + icon: ( + + + + ), + }) + + expect(screen.getByTestId('icon')).toBeInTheDocument() + expect(screen.queryByText('S')).not.toBeInTheDocument() + }) +}) diff --git a/packages/sanity/src/_internal/manifest/extractWorkspaceManifest.ts b/packages/sanity/src/_internal/manifest/extractWorkspaceManifest.tsx similarity index 90% rename from packages/sanity/src/_internal/manifest/extractWorkspaceManifest.ts rename to packages/sanity/src/_internal/manifest/extractWorkspaceManifest.tsx index 427d4b83a7b..f6fa17c05bf 100644 --- a/packages/sanity/src/_internal/manifest/extractWorkspaceManifest.ts +++ b/packages/sanity/src/_internal/manifest/extractWorkspaceManifest.tsx @@ -1,4 +1,6 @@ +import DOMPurify from 'isomorphic-dompurify' import startCase from 'lodash/startCase' +import {renderToString} from 'react-dom/server' import { type ArraySchemaType, type BlockDefinition, @@ -21,7 +23,9 @@ import { type StringSchemaType, type Workspace, } from 'sanity' +import {ServerStyleSheet} from 'styled-components' +import {SchemaIcon, type SchemaIconProps} from './Icon' import { getCustomFields, isCrossDatasetReference, @@ -40,9 +44,11 @@ import { type ManifestSchemaType, type ManifestSerializable, type ManifestTitledValue, + type ManifestTool, type ManifestValidationGroup, type ManifestValidationRule, } from './manifestTypes' +import {config} from './purifyConfig' interface Context { schema: Schema @@ -70,14 +76,22 @@ const INLINE_TYPES = ['document', 'object', 'image', 'file'] export function extractCreateWorkspaceManifest(workspace: Workspace): CreateWorkspaceManifest { const serializedSchema = extractManifestSchemaTypes(workspace.schema) + const serializedTools = extractManifestTools(workspace.tools) return { name: workspace.name, title: workspace.title, subtitle: workspace.subtitle, basePath: workspace.basePath, + projectId: workspace.projectId, dataset: workspace.dataset, + icon: resolveIcon({ + icon: workspace.icon, + title: workspace.title, + subtitle: workspace.subtitle, + }), schema: serializedSchema, + tools: serializedTools, } } @@ -500,3 +514,48 @@ function resolveTitleValueArray(possibleArray: unknown): ManifestTitledValue[] | return titledValues } + +const extractManifestTools = (tools: Workspace['tools']): ManifestTool[] => + tools.map((tool) => { + const { + title, + name, + icon, + __internalApplicationType: type, + } = tool as Workspace['tools'][number] & {__internalApplicationType: string} + return { + title, + name, + type: type || null, + icon: resolveIcon({ + icon, + title, + }), + } satisfies ManifestTool + }) + +const resolveIcon = (props: SchemaIconProps): string | null => { + const sheet = new ServerStyleSheet() + + try { + /** + * You must render the element first so + * the style-sheet above can be populated + */ + const element = renderToString(sheet.collectStyles()) + const styleTags = sheet.getStyleTags() + + /** + * We can then create a single string + * of HTML combining our styles and element + * before purifying below. + */ + const html = `${styleTags}${element}`.trim() + + return DOMPurify.sanitize(html, config) + } catch (error) { + return null + } finally { + sheet.seal() + } +} diff --git a/packages/sanity/src/_internal/manifest/manifestTypes.ts b/packages/sanity/src/_internal/manifest/manifestTypes.ts index 7ce29c9ba7e..25e30e38efc 100644 --- a/packages/sanity/src/_internal/manifest/manifestTypes.ts +++ b/packages/sanity/src/_internal/manifest/manifestTypes.ts @@ -6,15 +6,14 @@ export type ManifestSerializable = | ManifestSerializable[] export interface CreateManifest { - version: 1 + version: number createdAt: string workspaces: ManifestWorkspaceFile[] } -export interface ManifestWorkspaceFile { - name: string - dataset: string +export interface ManifestWorkspaceFile extends Omit { schema: string // filename + tools: string // filename } export interface CreateWorkspaceManifest { @@ -23,7 +22,13 @@ export interface CreateWorkspaceManifest { subtitle?: string basePath: string dataset: string + projectId: string schema: ManifestSchemaType[] + tools: ManifestTool[] + /** + * returns null in the case of the icon not being able to be stringified + */ + icon: string | null } export interface ManifestSchemaType { @@ -83,3 +88,13 @@ export type ManifestValidationRule = { constraint?: ManifestSerializable [index: string]: ManifestSerializable | undefined } + +export interface ManifestTool { + name: string + title: string + /** + * returns null in the case of the icon not being able to be stringified + */ + icon: string | null + type: string | null +} diff --git a/packages/sanity/src/_internal/manifest/purifyConfig.ts b/packages/sanity/src/_internal/manifest/purifyConfig.ts new file mode 100644 index 00000000000..0e43ccd76c7 --- /dev/null +++ b/packages/sanity/src/_internal/manifest/purifyConfig.ts @@ -0,0 +1,310 @@ +import {type Config} from 'isomorphic-dompurify' + +/** + * This file maintains our sanitization configuration for DOMPurify. + * We use an allowlist for tags and attributes to ensure that only safe + * elements and attributes are allowed. + * + * This is easier to loosen as specs develop & use-cases are discovered. + */ + +///////// Tags + +const HTML_TAGS = ['img', 'style'] + +const SVG_TAGS = [ + 'svg', + 'a', + 'altglyph', + 'altglyphdef', + 'altglyphitem', + 'animatecolor', + 'animatemotion', + 'animatetransform', + 'circle', + 'clippath', + 'defs', + 'desc', + 'ellipse', + 'filter', + 'font', + 'g', + 'glyph', + 'glyphref', + 'hkern', + 'image', + 'line', + 'lineargradient', + 'marker', + 'mask', + 'metadata', + 'mpath', + 'path', + 'pattern', + 'polygon', + 'polyline', + 'radialgradient', + 'rect', + 'stop', + 'style', + 'switch', + 'symbol', + 'text', + 'textpath', + 'title', + 'tref', + 'tspan', + 'view', + 'vkern', +] as const + +const SVG_FILTER_TAGS = [ + 'feBlend', + 'feColorMatrix', + 'feComponentTransfer', + 'feComposite', + 'feConvolveMatrix', + 'feDiffuseLighting', + 'feDisplacementMap', + 'feDistantLight', + 'feDropShadow', + 'feFlood', + 'feFuncA', + 'feFuncB', + 'feFuncG', + 'feFuncR', + 'feGaussianBlur', + 'feImage', + 'feMerge', + 'feMergeNode', + 'feMorphology', + 'feOffset', + 'fePointLight', + 'feSpecularLighting', + 'feSpotLight', + 'feTile', + 'feTurbulence', +] as const + +const ALLOWED_TAGS: Config['ALLOWED_TAGS'] = [...SVG_TAGS, ...HTML_TAGS, ...SVG_FILTER_TAGS] + +///////// Attributes + +const HTML_ATTRIBUTES = [ + 'alt', + 'class', + 'crossorigin', + 'decoding', + 'elementtiming', + 'fetchpriority', + 'height', + 'loading', + 'src', + 'srcset', + 'style', + 'width', +] + +const SVG_ATTRIBUTES = [ + 'accent-height', + 'accumulate', + 'additive', + 'alignment-baseline', + 'amplitude', + 'ascent', + 'attributename', + 'attributetype', + 'azimuth', + 'basefrequency', + 'baseline-shift', + 'begin', + 'bias', + 'by', + 'class', + 'clip', + 'clippathunits', + 'clip-path', + 'clip-rule', + 'color', + 'color-interpolation', + 'color-interpolation-filters', + 'color-profile', + 'color-rendering', + 'cx', + 'cy', + 'd', + 'dx', + 'dy', + 'diffuseconstant', + 'direction', + 'display', + 'divisor', + 'dur', + 'edgemode', + 'elevation', + 'end', + 'exponent', + 'fill', + 'fill-opacity', + 'fill-rule', + 'filter', + 'filterunits', + 'flood-color', + 'flood-opacity', + 'font-family', + 'font-size', + 'font-size-adjust', + 'font-stretch', + 'font-style', + 'font-variant', + 'font-weight', + 'fx', + 'fy', + 'g1', + 'g2', + 'glyph-name', + 'glyphref', + 'gradientunits', + 'gradienttransform', + 'height', + 'href', + 'id', + 'image-rendering', + 'in', + 'in2', + 'intercept', + 'k', + 'k1', + 'k2', + 'k3', + 'k4', + 'kerning', + 'keypoints', + 'keysplines', + 'keytimes', + 'lang', + 'lengthadjust', + 'letter-spacing', + 'kernelmatrix', + 'kernelunitlength', + 'lighting-color', + 'local', + 'marker-end', + 'marker-mid', + 'marker-start', + 'markerheight', + 'markerunits', + 'markerwidth', + 'maskcontentunits', + 'maskunits', + 'max', + 'mask', + 'media', + 'method', + 'mode', + 'min', + 'name', + 'numoctaves', + 'offset', + 'operator', + 'opacity', + 'order', + 'orient', + 'orientation', + 'origin', + 'overflow', + 'paint-order', + 'path', + 'pathlength', + 'patterncontentunits', + 'patterntransform', + 'patternunits', + 'points', + 'preservealpha', + 'preserveaspectratio', + 'primitiveunits', + 'r', + 'rx', + 'ry', + 'radius', + 'refx', + 'refy', + 'repeatcount', + 'repeatdur', + 'restart', + 'result', + 'rotate', + 'scale', + 'seed', + 'shape-rendering', + 'slope', + 'specularconstant', + 'specularexponent', + 'spreadmethod', + 'startoffset', + 'stddeviation', + 'stitchtiles', + 'stop-color', + 'stop-opacity', + 'stroke-dasharray', + 'stroke-dashoffset', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-miterlimit', + 'stroke-opacity', + 'stroke', + 'stroke-width', + 'style', + 'surfacescale', + 'systemlanguage', + 'tabindex', + 'tablevalues', + 'targetx', + 'targety', + 'transform', + 'transform-origin', + 'text-anchor', + 'text-decoration', + 'text-rendering', + 'textlength', + 'type', + 'u1', + 'u2', + 'unicode', + 'values', + 'viewbox', + 'visibility', + 'version', + 'vert-adv-y', + 'vert-origin-x', + 'vert-origin-y', + 'width', + 'word-spacing', + 'wrap', + 'writing-mode', + 'xchannelselector', + 'ychannelselector', + 'x', + 'x1', + 'x2', + 'xmlns', + 'y', + 'y1', + 'y2', + 'z', + 'zoomandpan', +] as const + +const ALLOWED_ATTR: Config['ALLOWED_ATTR'] = [...SVG_ATTRIBUTES, ...HTML_ATTRIBUTES] + +const config = { + ALLOWED_ATTR, + ALLOWED_TAGS, + /** + * Required to allow for the use of `style` tags, + * namely rendering the style tags from `styled-components` + */ + FORCE_BODY: true, +} satisfies Config + +export {config} diff --git a/packages/sanity/src/_singletons/context/HoveredFieldContext.ts b/packages/sanity/src/_singletons/context/HoveredFieldContext.ts index 6960d97ee69..ff9638ddbf1 100644 --- a/packages/sanity/src/_singletons/context/HoveredFieldContext.ts +++ b/packages/sanity/src/_singletons/context/HoveredFieldContext.ts @@ -3,7 +3,10 @@ import {createContext} from 'sanity/_createContext' /** @internal */ export interface HoveredFieldContextValue { - hoveredStack: string[] + store: { + subscribe: (onStoreCallback: () => void) => () => void + getSnapshot: () => string[] + } onMouseEnter: (path: Path) => void onMouseLeave: (path: Path) => void } @@ -12,7 +15,10 @@ export interface HoveredFieldContextValue { export const HoveredFieldContext = createContext( 'sanity/_singletons/context/hovered-field', { - hoveredStack: [], + store: { + subscribe: () => () => undefined, + getSnapshot: () => [], + }, onMouseEnter: () => undefined, onMouseLeave: () => undefined, }, diff --git a/packages/sanity/src/core/comments/components/list/CommentsListItem.tsx b/packages/sanity/src/core/comments/components/list/CommentsListItem.tsx index 083146ae517..c7cc649ada4 100644 --- a/packages/sanity/src/core/comments/components/list/CommentsListItem.tsx +++ b/packages/sanity/src/core/comments/components/list/CommentsListItem.tsx @@ -145,7 +145,7 @@ export const CommentsListItem = memo(function CommentsListItem(props: CommentsLi const {t} = useTranslation(commentsLocaleNamespace) const [value, setValue] = useState(EMPTY_ARRAY) const [collapsed, setCollapsed] = useState(true) - const didExpand = useRef(false) + const [didExpand, setDidExpand] = useState(false) const replyInputRef = useRef(null) const {isTopLayer} = useLayer() @@ -238,7 +238,7 @@ export const CommentsListItem = memo(function CommentsListItem(props: CommentsLi const handleExpand = useCallback((e: MouseEvent) => { e.stopPropagation() setCollapsed(false) - didExpand.current = true + setDidExpand(true) }, []) const splicedReplies = useMemo(() => { @@ -258,10 +258,10 @@ export const CommentsListItem = memo(function CommentsListItem(props: CommentsLi }, [replies?.length]) useEffect(() => { - if (replies.length > MAX_COLLAPSED_REPLIES && !didExpand.current) { + if (replies.length > MAX_COLLAPSED_REPLIES && !didExpand) { setCollapsed(true) } - }, [replies]) + }, [didExpand, replies]) /* TODO - once we understand how to set up with "finished" releases we need to add a condition to the readOnly prop in this component */ @@ -359,7 +359,7 @@ export const CommentsListItem = memo(function CommentsListItem(props: CommentsLi /> - {showCollapseButton && !didExpand.current && ( + {showCollapseButton && !didExpand && ( @@ -400,3 +400,4 @@ export const CommentsListItem = memo(function CommentsListItem(props: CommentsLi ) }) +CommentsListItem.displayName = 'Memo(CommentsListItem)' diff --git a/packages/sanity/src/core/comments/components/onboarding/CommentsOnboardingPopover.tsx b/packages/sanity/src/core/comments/components/onboarding/CommentsOnboardingPopover.tsx index 582147a5a95..a896093cf7b 100644 --- a/packages/sanity/src/core/comments/components/onboarding/CommentsOnboardingPopover.tsx +++ b/packages/sanity/src/core/comments/components/onboarding/CommentsOnboardingPopover.tsx @@ -30,7 +30,7 @@ interface CommentsOnboardingPopoverProps extends Omit { } export function CommentsOnboardingPopover(props: CommentsOnboardingPopoverProps) { - const {onDismiss} = props + const {onDismiss, ...rest} = props const {t} = useTranslation(commentsLocaleNamespace) return ( @@ -52,7 +52,7 @@ export function CommentsOnboardingPopover(props: CommentsOnboardingPopoverProps) } open portal - {...props} + {...rest} /> ) } diff --git a/packages/sanity/src/core/comments/components/pte/comment-input/Editable.tsx b/packages/sanity/src/core/comments/components/pte/comment-input/Editable.tsx index 9d570da4a24..afc77a67232 100644 --- a/packages/sanity/src/core/comments/components/pte/comment-input/Editable.tsx +++ b/packages/sanity/src/core/comments/components/pte/comment-input/Editable.tsx @@ -9,7 +9,7 @@ import {useClickOutsideEvent} from '@sanity/ui' // eslint-disable-next-line camelcase import {getTheme_v2} from '@sanity/ui/theme' import {isEqual} from 'lodash' -import {type KeyboardEvent, useCallback, useEffect, useMemo, useRef} from 'react' +import {type KeyboardEvent, useCallback, useEffect, useMemo, useRef, useState} from 'react' import {css, styled} from 'styled-components' import {Popover, type PopoverProps} from '../../../../../ui-components' @@ -85,8 +85,8 @@ export function Editable(props: EditableProps) { renderBlock, } = props const popoverRef = useRef(null) - const rootElementRef = useRef(null) - const editableRef = useRef(null) + const [rootElement, setRootElement] = useState(null) + const [inputElement, setInputElement] = useState(null) const mentionsMenuRef = useRef(null) const selection = usePortableTextEditorSelection() @@ -104,7 +104,7 @@ export function Editable(props: EditableProps) { const cursorElement = useCursorElement({ disabled: !mentionsMenuOpen, - rootElement: rootElementRef.current, + rootElement: rootElement, }) const renderPlaceholder = useCallback( @@ -195,7 +195,7 @@ export function Editable(props: EditableProps) { const popoverContent = ( +
- ) } +Editable.displayName = 'Editable' diff --git a/packages/sanity/src/core/comments/components/reactions/CommentReactionsBar.tsx b/packages/sanity/src/core/comments/components/reactions/CommentReactionsBar.tsx index 71ee314db2e..4a00c9570f0 100644 --- a/packages/sanity/src/core/comments/components/reactions/CommentReactionsBar.tsx +++ b/packages/sanity/src/core/comments/components/reactions/CommentReactionsBar.tsx @@ -5,7 +5,7 @@ import { Flex, Text, } from '@sanity/ui' -import {memo, useCallback, useMemo, useRef} from 'react' +import {memo, useCallback, useMemo, useState} from 'react' import {Tooltip, TooltipDelayGroupProvider} from '../../../../ui-components' import {COMMENT_REACTION_EMOJIS, COMMENT_REACTION_OPTIONS} from '../../constants' @@ -110,16 +110,22 @@ export const CommentReactionsBar = memo(function CommentReactionsBar( return grouped.filter(([name]) => COMMENT_REACTION_EMOJIS[name]) }, [reactions]) - // An array of the initial order of the reactions. This is used to sort the reactions. - // E.g. [':+1:', ':heart:'] - const sortOrder = useRef(Object.keys(Object.fromEntries(groupedReactions))) - + const [sortedGroupedReactions, setSortedGroupedReactions] = useState(() => ({ + // An array of the initial order of the reactions. This is used to sort the reactions. + // E.g. [':+1:', ':heart:'] + sortOrder: Object.keys(Object.fromEntries(groupedReactions)), + // We cache the groupedReactions to know when we should update the sortedReactions, ensuring we don't run into an infinite render loop. + groupedReactions: [] as typeof groupedReactions, + sortedReactions: [] as typeof groupedReactions, + })) // Sort the reactions based on the initial order to make sure that the reactions // are not jumping around when new reactions are added. - const sortedReactions = useMemo(() => { - const sorted = groupedReactions.sort(([nameA], [nameB]) => { - const indexA = sortOrder.current.indexOf(nameA) - const indexB = sortOrder.current.indexOf(nameB) + let {sortedReactions} = sortedGroupedReactions + if (sortedGroupedReactions.groupedReactions !== groupedReactions) { + const {sortOrder} = sortedGroupedReactions + sortedReactions = groupedReactions.sort(([nameA], [nameB]) => { + const indexA = sortOrder.indexOf(nameA) + const indexB = sortOrder.indexOf(nameB) if (indexA === -1) { return 1 @@ -132,10 +138,12 @@ export const CommentReactionsBar = memo(function CommentReactionsBar( return indexA - indexB }) - sortOrder.current = sorted.map(([name]) => name) - - return sorted - }, [groupedReactions]) + setSortedGroupedReactions({ + groupedReactions, + sortOrder: sortedReactions.map(([name]) => name), + sortedReactions, + }) + } return ( @@ -190,3 +198,4 @@ export const CommentReactionsBar = memo(function CommentReactionsBar( ) }) +CommentReactionsBar.displayName = 'Memo(CommentReactionsBar)' diff --git a/packages/sanity/src/core/comments/helpers.ts b/packages/sanity/src/core/comments/helpers.ts index 0bcfbea9ee2..3a89c187a53 100644 --- a/packages/sanity/src/core/comments/helpers.ts +++ b/packages/sanity/src/core/comments/helpers.ts @@ -1,13 +1,13 @@ import {isPortableTextSpan, isPortableTextTextBlock} from '@sanity/types' import {isEqual} from 'lodash' -import {useMemo, useRef} from 'react' +import {useMemo, useState} from 'react' import {type CommentContext, type CommentDocument, type CommentMessage} from './types' export function useCommentHasChanged(message: CommentMessage): boolean { - const prevMessage = useRef(message) + const [prevMessage] = useState(message) - return useMemo(() => !isEqual(prevMessage.current, message), [message]) + return useMemo(() => !isEqual(prevMessage, message), [prevMessage, message]) } export function hasCommentMessageValue(value: CommentMessage): boolean { diff --git a/packages/sanity/src/core/comments/plugin/input/components/FloatingButtonPopover.tsx b/packages/sanity/src/core/comments/plugin/input/components/FloatingButtonPopover.tsx index 38717113b9c..5521dbdeb22 100644 --- a/packages/sanity/src/core/comments/plugin/input/components/FloatingButtonPopover.tsx +++ b/packages/sanity/src/core/comments/plugin/input/components/FloatingButtonPopover.tsx @@ -9,7 +9,7 @@ import {useTranslation} from '../../../../i18n' import {CommentDisabledIcon} from '../../../components' import {commentsLocaleNamespace} from '../../../i18n' -const MotionPopover = styled(motion(Popover))` +const MotionPopover = styled(motion.create(Popover))` user-select: none; ` diff --git a/packages/sanity/src/core/comments/plugin/input/components/InlineCommentInputPopover.tsx b/packages/sanity/src/core/comments/plugin/input/components/InlineCommentInputPopover.tsx index ed3c70c106d..dbb56b0d992 100644 --- a/packages/sanity/src/core/comments/plugin/input/components/InlineCommentInputPopover.tsx +++ b/packages/sanity/src/core/comments/plugin/input/components/InlineCommentInputPopover.tsx @@ -10,7 +10,7 @@ import {hasCommentMessageValue} from '../../../helpers' const POPOVER_FALLBACK_PLACEMENTS: PopoverProps['fallbackPlacements'] = ['bottom', 'top'] -const MotionPopover = motion(Popover) +const MotionPopover = motion.create(Popover) const RootStack = styled(Stack)` width: 250px; diff --git a/packages/sanity/src/core/comments/utils/inline-comments/buildRangeDecorations.tsx b/packages/sanity/src/core/comments/utils/inline-comments/buildRangeDecorations.tsx index 60ca294f3c9..75d3e98700d 100644 --- a/packages/sanity/src/core/comments/utils/inline-comments/buildRangeDecorations.tsx +++ b/packages/sanity/src/core/comments/utils/inline-comments/buildRangeDecorations.tsx @@ -1,6 +1,6 @@ import {type RangeDecoration, type RangeDecorationOnMovedDetails} from '@portabletext/editor' import {type PortableTextBlock} from '@sanity/types' -import {memo, useCallback, useEffect, useRef} from 'react' +import {memo, useCallback, useEffect, useRef, useState} from 'react' import {CommentInlineHighlightSpan} from '../../components' import {applyInlineCommentIdAttr} from '../../hooks' @@ -32,8 +32,8 @@ const CommentRangeDecoration = memo(function CommentRangeDecoration( threadId, } = props const decoratorRef = useRef(null) - const isNestedRef = useRef(false) - const parentCommentId = useRef(null) + const [isNested, setIsNested] = useState(false) + const [parentCommentId, setParentCommentId] = useState(null) useEffect(() => { // Get the previous and next sibling of the decorator element @@ -42,7 +42,7 @@ const CommentRangeDecoration = memo(function CommentRangeDecoration( // If there is no previous or next sibling, then the decorator is not nested if (!prevEl || !nextEl) { - isNestedRef.current = false + setIsNested(false) return } @@ -56,9 +56,9 @@ const CommentRangeDecoration = memo(function CommentRangeDecoration( const isEqual = prevId === nextId const isNestedDecorator = Boolean(prevId && nextId && isEqual) - parentCommentId.current = isNestedDecorator ? prevId : null + setParentCommentId(isNestedDecorator ? prevId : null) - isNestedRef.current = isNestedDecorator + setIsNested(isNestedDecorator) }, []) const handleMouseEnter = useCallback(() => onHoverStart(commentId), [commentId, onHoverStart]) @@ -67,7 +67,7 @@ const CommentRangeDecoration = memo(function CommentRangeDecoration( const hovered = currentHoveredCommentId === commentId || - (currentHoveredCommentId === parentCommentId.current && isNestedRef.current) + (currentHoveredCommentId === parentCommentId && isNested) const selected = selectedThreadId === threadId @@ -75,7 +75,7 @@ const CommentRangeDecoration = memo(function CommentRangeDecoration( ) }) +CommentRangeDecoration.displayName = 'Memo(CommentRangeDecoration)' interface BuildRangeDecorationsProps { comments: CommentDocument[] diff --git a/packages/sanity/src/core/comments/utils/transform-children/linkMiddleware.ts b/packages/sanity/src/core/comments/utils/transform-children/linkMiddleware.tsx similarity index 78% rename from packages/sanity/src/core/comments/utils/transform-children/linkMiddleware.ts rename to packages/sanity/src/core/comments/utils/transform-children/linkMiddleware.tsx index eca3a297ab1..e5da5478cca 100644 --- a/packages/sanity/src/core/comments/utils/transform-children/linkMiddleware.ts +++ b/packages/sanity/src/core/comments/utils/transform-children/linkMiddleware.tsx @@ -1,4 +1,4 @@ -import {createElement, type MouseEvent, type ReactNode} from 'react' +import {type MouseEvent, type ReactNode} from 'react' import {type Middleware} from './types' @@ -10,9 +10,12 @@ export function onClick(event: MouseEvent): void { function createLinkElement(url: string): ReactNode { const href = url.startsWith('http') ? url : `https://${url}` - const props = {href, target: '_blank', rel: 'noopener noreferrer', key: url, onClick} - return createElement('a', props, url) + return ( + + {url} + + ) } /** diff --git a/packages/sanity/src/core/components/WithReferringDocuments.tsx b/packages/sanity/src/core/components/WithReferringDocuments.tsx index 3deee5990af..ef784d2c6a3 100644 --- a/packages/sanity/src/core/components/WithReferringDocuments.tsx +++ b/packages/sanity/src/core/components/WithReferringDocuments.tsx @@ -4,6 +4,8 @@ import {type ReactElement} from 'react' import {useReferringDocuments} from '../hooks/useReferringDocuments' import {type DocumentStore} from '../store' +const EMPTY: never[] = [] + /** * @internal * @deprecated - Will be removed in 4.0.0, use the `useReferringDocuments()` hook instead @@ -19,5 +21,5 @@ export function WithReferringDocuments({ documentStore?: DocumentStore id: string }) { - return children(useReferringDocuments(id)) + return children(useReferringDocuments(id, EMPTY)) } diff --git a/packages/sanity/src/core/components/commandList/CommandList.tsx b/packages/sanity/src/core/components/commandList/CommandList.tsx index 3b1aee44bdc..c4c44978074 100644 --- a/packages/sanity/src/core/components/commandList/CommandList.tsx +++ b/packages/sanity/src/core/components/commandList/CommandList.tsx @@ -9,6 +9,7 @@ import { forwardRef, Fragment, isValidElement, + memo, type ReactElement, useCallback, useEffect, @@ -91,17 +92,7 @@ const VirtualListChildBox = styled(Box) // width: 100%; ` -/** - * Renders a Command List with support for the following: - * - * - Keyboard navigation (↑ / ↓ / ENTER) to children with a specified container (`childContainerRef`) - * - Focus redirection when clicking child elements - * - Pointer blocking when navigating with arrow keys (to ensure that only one active state is visible at any given time) - * - ARIA attributes to define a `combobox` input that controls a separate `listbox` - * - * @internal - */ -export const CommandList = forwardRef(function CommandList( +const CommandListComponent = forwardRef(function CommandList( { activeItemDataAttr = LIST_ITEM_DATA_ATTR_ACTIVE, ariaLabel, @@ -123,13 +114,14 @@ export const CommandList = forwardRef(funct onlyShowSelectionWhenActive, overscan, renderItem, + testId, wrapAround = true, ...responsivePaddingProps }, ref, ) { const isMountedRef = useRef(false) - const commandListId = useRef(useId()) + const [commandListId] = useState(useId()) const activeIndexRef = useRef(initialIndex ?? 0) const [childContainerElement, setChildContainerElement] = useState(null) @@ -217,11 +209,11 @@ export const CommandList = forwardRef(funct ) const getChildDescendantId = useCallback( - (index: number) => `${commandListId.current}-item-${index}`, - [], + (index: number) => `${commandListId}-item-${index}`, + [commandListId], ) - const getCommandListChildrenId = useCallback(() => `${commandListId.current}-children`, []) + const getCommandListChildrenId = useCallback(() => `${commandListId}-children`, [commandListId]) /** * Iterate through all virtual list children and apply the active data-attribute on the selected index. @@ -592,6 +584,7 @@ export const CommandList = forwardRef(funct ref={setVirtualListElement} sizing="border" tabIndex={rootTabIndex} + data-testid={testId} {...responsivePaddingProps} > {canReceiveFocus && } @@ -617,47 +610,32 @@ export const CommandList = forwardRef(funct virtualIndex, }) as ReactElement - const clonedItem = cloneElement( - itemToRender, - isValidElement(itemToRender) && itemToRender.type == Fragment - ? {} - : { + // @TODO can we avoid using cloneElement here? + const clonedItem = + isValidElement(itemToRender) && itemToRender.type != Fragment + ? cloneElement(itemToRender, { + // @ts-expect-error @TODO shift the responsibility of setting tabIndex to the consumer, so we can remove the need to clone tabIndex: -1, - }, - ) - - const activeAriaAttributes = - typeof activeIndex === 'number' && !disabled - ? { - 'aria-posinset': activeIndex + 1, - ...(ariaMultiselectable ? {'aria-selected': selected.toString()} : {}), - 'aria-setsize': activeItemCount, - 'id': getChildDescendantId(activeIndex), - 'role': 'option', - 'onMouseEnter': handleChildMouseEnter(activeIndex), - } - : {} + }) + : itemToRender return ( - {clonedItem} - + ) })} @@ -665,4 +643,96 @@ export const CommandList = forwardRef(funct ) }) -CommandList.displayName = 'ForwardRef(CommandList)' + +/** + * Renders a Command List with support for the following: + * + * - Keyboard navigation (↑ / ↓ / ENTER) to children with a specified container (`childContainerRef`) + * - Focus redirection when clicking child elements + * - Pointer blocking when navigating with arrow keys (to ensure that only one active state is visible at any given time) + * - ARIA attributes to define a `combobox` input that controls a separate `listbox` + * + * @internal + */ +export const CommandList = memo(CommandListComponent) +CommandList.displayName = 'Memo(ForwardRef(CommandList))' + +const CommandListItemComponent = forwardRef(function CommandListItem( + props: { + children: React.ReactNode + activeIndex: number | null + activeItemCount: number + ariaMultiselectable: boolean + disabled: boolean + fixedHeight: `${number}px` | undefined + getChildDescendantId: (index: number) => string + handleChildMouseEnter: (index: number) => () => void + selected: boolean + virtualIndex: number + virtualRowStart: number + }, + forwardedRef: React.ForwardedRef, +) { + const { + children, + activeIndex, + activeItemCount, + ariaMultiselectable, + disabled, + fixedHeight, + getChildDescendantId, + handleChildMouseEnter, + selected, + virtualIndex, + virtualRowStart, + } = props + + const onMouseEnter = useMemo( + () => + typeof activeIndex === 'number' && !disabled ? handleChildMouseEnter(activeIndex) : undefined, + [activeIndex, disabled, handleChildMouseEnter], + ) + const activeAriaAttributes = useMemo( + () => + typeof activeIndex === 'number' && !disabled + ? { + 'aria-posinset': activeIndex + 1, + ...(ariaMultiselectable ? {'aria-selected': selected.toString()} : {}), + 'aria-setsize': activeItemCount, + 'id': getChildDescendantId(activeIndex), + 'role': 'option', + } + : {}, + [activeIndex, activeItemCount, ariaMultiselectable, disabled, getChildDescendantId, selected], + ) + + const style = useMemo( + () => ({ + flex: 1, + height: fixedHeight, + left: 0, + position: 'absolute' as const, + top: 0, + transform: `translateY(${virtualRowStart}px)`, + width: '100%', + }), + [fixedHeight, virtualRowStart], + ) + + return ( + + {children} + + ) +}) + +const CommandListItem = memo(CommandListItemComponent) +CommandListItem.displayName = 'Memo(ForwardRef(CommandListItem))' diff --git a/packages/sanity/src/core/components/commandList/__tests__/CommandList.test.tsx b/packages/sanity/src/core/components/commandList/__tests__/CommandList.test.tsx index a47711048cc..7bc8aa9bf8f 100644 --- a/packages/sanity/src/core/components/commandList/__tests__/CommandList.test.tsx +++ b/packages/sanity/src/core/components/commandList/__tests__/CommandList.test.tsx @@ -1,11 +1,14 @@ +import {afterEach} from 'node:test' + import {studioTheme, ThemeProvider} from '@sanity/ui' -import {render, screen} from '@testing-library/react' +import {render, screen, waitFor} from '@testing-library/react' import userEvent from '@testing-library/user-event' import {useCallback} from 'react' -import {describe, expect, it} from 'vitest' +import {beforeEach, describe, expect, it, vi} from 'vitest' import {CommandList} from '../CommandList' +const COMMAND_LIST_TEST_ID = 'command-list' const CUSTOM_ACTIVE_ATTR = 'my-active-data-attribute' type Item = number @@ -52,6 +55,7 @@ function TestComponent(props: TestComponentProps) { // same as the number of items for the tests to pass overscan={items.length} renderItem={renderItem} + testId={COMMAND_LIST_TEST_ID} />
@@ -59,13 +63,44 @@ function TestComponent(props: TestComponentProps) { } describe('core/components: CommandList', () => { - it('should change active item on pressing arrow keys', () => { + const originalGetBoundingClientRect = Element.prototype.getBoundingClientRect + + const getDOMRect = (width: number, height: number) => ({ + width, + height, + top: 0, + left: 0, + bottom: 0, + right: 0, + x: 0, + y: 0, + toJSON: () => {}, + }) + + beforeEach(() => { + // Virtual list will return an empty list of items unless we have some size, + // so we need to mock getBoundingClientRect to return a size for the list. + // Not pretty, but it's what they recommend for testing outside of browsers: + // https://github.com/TanStack/virtual/issues/641 + Element.prototype.getBoundingClientRect = vi.fn(function (this: Element) { + if (this.getAttribute('data-testid') === COMMAND_LIST_TEST_ID) { + return getDOMRect(350, 800) + } + return getDOMRect(0, 0) + }) + }) + + afterEach(() => { + Element.prototype.getBoundingClientRect = originalGetBoundingClientRect + }) + + it('should change active item on pressing arrow keys', async () => { render() const buttons = screen.getAllByTestId('button') // First button should be active on render - expect(buttons[0]).toHaveAttribute(CUSTOM_ACTIVE_ATTR) + await waitFor(() => expect(buttons[0]).toHaveAttribute(CUSTOM_ACTIVE_ATTR)) // Set second button as active on arrow down userEvent.keyboard('[ArrowDown]') @@ -96,13 +131,13 @@ describe('core/components: CommandList', () => { expect(buttons[3]).not.toHaveAttribute(CUSTOM_ACTIVE_ATTR) }) - it('should set the initial active item based on the initialIndex prop', () => { + it('should set the initial active item based on the initialIndex prop', async () => { render() const buttons = screen.getAllByTestId('button') // Button with index 2 should be active on render - expect(buttons[0]).not.toHaveAttribute(CUSTOM_ACTIVE_ATTR) + await waitFor(() => expect(buttons[0]).not.toHaveAttribute(CUSTOM_ACTIVE_ATTR)) expect(buttons[1]).not.toHaveAttribute(CUSTOM_ACTIVE_ATTR) expect(buttons[2]).toHaveAttribute(CUSTOM_ACTIVE_ATTR) expect(buttons[3]).not.toHaveAttribute(CUSTOM_ACTIVE_ATTR) @@ -123,13 +158,13 @@ describe('core/components: CommandList', () => { expect(buttons[0]).toHaveAttribute(CUSTOM_ACTIVE_ATTR) }) - it('should skip disabled elements', () => { + it('should skip disabled elements', async () => { render() const buttons = screen.getAllByTestId('button') // Second button should be active since the first button is disabled - expect(buttons[1]).toHaveAttribute(CUSTOM_ACTIVE_ATTR) + await waitFor(() => expect(buttons[1]).toHaveAttribute(CUSTOM_ACTIVE_ATTR)) // Fourth button should be active since the third is disabled userEvent.keyboard('[ArrowDown]') diff --git a/packages/sanity/src/core/components/commandList/types.ts b/packages/sanity/src/core/components/commandList/types.ts index 2190bb8e0e7..4435d399bad 100644 --- a/packages/sanity/src/core/components/commandList/types.ts +++ b/packages/sanity/src/core/components/commandList/types.ts @@ -78,6 +78,8 @@ export interface CommandListProps extends ResponsivePaddingProps { overscan?: number /** Rendered component in virtual lists */ renderItem: CommandListRenderItemCallback + /** `data-testid` to apply to outermost container */ + testId?: string /** Allow wraparound keyboard navigation between first and last items */ wrapAround?: boolean } diff --git a/packages/sanity/src/core/components/previews/__workshop__/GeneralPreviewStory.tsx b/packages/sanity/src/core/components/previews/__workshop__/GeneralPreviewStory.tsx index 3df744fe64b..9a7f0de51ee 100644 --- a/packages/sanity/src/core/components/previews/__workshop__/GeneralPreviewStory.tsx +++ b/packages/sanity/src/core/components/previews/__workshop__/GeneralPreviewStory.tsx @@ -1,7 +1,7 @@ import {DocumentIcon, EditIcon} from '@sanity/icons' import {Card, Container, Flex, Text} from '@sanity/ui' import {useBoolean, useNumber, useSelect, useString, useText} from '@sanity/ui-workshop' -import {type ComponentType, createElement, useMemo} from 'react' +import {type ComponentType, useMemo} from 'react' import {PREVIEW_SIZES} from '../constants' import {CompactPreview} from '../general/CompactPreview' @@ -84,9 +84,10 @@ export default function GeneralPreviewStory() { [description, isPlaceholder, media, progress, status, subtitle, title], ) - const component = layout && previewComponents[layout] + const Component = + layout && (previewComponents[layout] as ComponentType>) - if (!component) { + if (!Component) { return ( Unknown layout: {layout} @@ -103,10 +104,7 @@ export default function GeneralPreviewStory() { selected={interactive ? selected : undefined} style={{lineHeight: 0}} > - {createElement( - component as ComponentType>, - previewProps, - )} +
diff --git a/packages/sanity/src/core/components/previews/__workshop__/PortableTextPreviewStory.tsx b/packages/sanity/src/core/components/previews/__workshop__/PortableTextPreviewStory.tsx index a47148afc23..57387f8161c 100644 --- a/packages/sanity/src/core/components/previews/__workshop__/PortableTextPreviewStory.tsx +++ b/packages/sanity/src/core/components/previews/__workshop__/PortableTextPreviewStory.tsx @@ -1,7 +1,7 @@ import {DocumentIcon, EditIcon} from '@sanity/icons' import {Card, Container, Flex, Text} from '@sanity/ui' import {useBoolean, useSelect, useString} from '@sanity/ui-workshop' -import {type ComponentType, createElement, useMemo} from 'react' +import {type ComponentType, useMemo} from 'react' import {ContextMenuButton} from '../../contextMenuButton' import {PREVIEW_SIZES} from '../constants' @@ -87,9 +87,10 @@ export default function PortableTextPreviewStory() { [isPlaceholder, media, status, subtitle, title, withActions], ) - const component = layout && previewComponents[layout] + const Component = + layout && (previewComponents[layout] as ComponentType>) - if (!component) { + if (!Component) { return ( Unknown layout: {layout} @@ -102,10 +103,7 @@ export default function PortableTextPreviewStory() { - {createElement( - component as ComponentType>, - previewProps, - )} + diff --git a/packages/sanity/src/core/components/previews/__workshop__/TemplatePreviewStory.tsx b/packages/sanity/src/core/components/previews/__workshop__/TemplatePreviewStory.tsx index 3a6aad00d3d..5b7b37b1bc0 100644 --- a/packages/sanity/src/core/components/previews/__workshop__/TemplatePreviewStory.tsx +++ b/packages/sanity/src/core/components/previews/__workshop__/TemplatePreviewStory.tsx @@ -1,7 +1,7 @@ import {DocumentIcon} from '@sanity/icons' import {Card, Container, Flex, Text} from '@sanity/ui' import {useBoolean, useSelect, useString, useText} from '@sanity/ui-workshop' -import {type ComponentType, createElement, type ReactNode} from 'react' +import {type ComponentType, type ReactNode} from 'react' import {TemplatePreview, type TemplatePreviewProps} from '../template/TemplatePreview' @@ -36,9 +36,9 @@ export default function TemplatePreviewStory() { const description = useText('Description', undefined, 'Props') const media = mediaValues[mediaKey] || false - const component = layout && previewComponents[layout] + const Component = layout && previewComponents[layout] - if (!component) { + if (!Component) { return ( Unknown layout: {layout} @@ -51,13 +51,13 @@ export default function TemplatePreviewStory() { - {createElement(component, { - description, - isPlaceholder, - media, - title, - subtitle, - })} + diff --git a/packages/sanity/src/core/components/previews/_common/Media.tsx b/packages/sanity/src/core/components/previews/_common/Media.tsx index d915bf60e14..b81c46daf97 100644 --- a/packages/sanity/src/core/components/previews/_common/Media.tsx +++ b/packages/sanity/src/core/components/previews/_common/Media.tsx @@ -1,5 +1,5 @@ import {Text} from '@sanity/ui' -import {createElement, isValidElement, type ReactNode} from 'react' +import {isValidElement, type ReactNode} from 'react' import {isValidElementType} from 'react-is' import {type PreviewLayoutKey, type PreviewMediaDimensions, type PreviewProps} from '../types' @@ -48,7 +48,14 @@ function renderMedia(props: { const {dimensions, layout, media, styles} = props if (isValidElementType(media)) { - return createElement(media, {dimensions, layout}) + const MediaComponent = media + return ( + + ) } if (typeof media === 'string') { diff --git a/packages/sanity/src/core/components/previews/helpers.tsx b/packages/sanity/src/core/components/previews/helpers.tsx index 82ceecd1a17..b85beb80929 100644 --- a/packages/sanity/src/core/components/previews/helpers.tsx +++ b/packages/sanity/src/core/components/previews/helpers.tsx @@ -1,4 +1,4 @@ -import {createElement, type ElementType, type ReactNode} from 'react' +import {type ElementType, type ReactNode} from 'react' import {isValidElementType} from 'react-is' import {type PreviewLayoutKey, type PreviewMediaDimensions} from './types' @@ -9,7 +9,14 @@ export function renderPreviewMedia( dimensions: PreviewMediaDimensions, ): ReactNode { if (isValidElementType(value)) { - return createElement(value, {layout, dimensions}) + const Value = value + return ( + + ) } if (typeof value === 'string') { @@ -30,7 +37,13 @@ export function renderPreviewNode( } if (isValidElementType(value)) { - return createElement(value, {layout}) + const Value = value + return ( + + ) } // @todo: find out why `value` isn't infered as `ReactNode` here diff --git a/packages/sanity/src/core/components/previews/template/TemplatePreview.tsx b/packages/sanity/src/core/components/previews/template/TemplatePreview.tsx index 400157ed823..545bf6fa24c 100644 --- a/packages/sanity/src/core/components/previews/template/TemplatePreview.tsx +++ b/packages/sanity/src/core/components/previews/template/TemplatePreview.tsx @@ -1,5 +1,5 @@ import {Box, Flex, rem, Stack, Text, TextSkeleton} from '@sanity/ui' -import {createElement, type ElementType, isValidElement, type ReactNode} from 'react' +import {type ElementType, isValidElement, type ReactNode} from 'react' import {isValidElementType} from 'react-is' import {styled} from 'styled-components' import {getDevicePixelRatio} from 'use-device-pixel-ratio' @@ -63,8 +63,8 @@ export function TemplatePreview(props: TemplatePreviewProps) { isPlaceholder, media, mediaDimensions = DEFAULT_MEDIA_DIMENSION, - subtitle, - title = 'Untitled', + subtitle: Subtitle, + title: Title = 'Untitled', } = props if (isPlaceholder) { @@ -84,19 +84,27 @@ export function TemplatePreview(props: TemplatePreviewProps) { - {isValidElementType(title) && ( - {createElement(title, {layout: 'default'})} + {isValidElementType(Title) && ( + + + </Text> )} - {isValidElement(title) && <Text textOverflow="ellipsis">{title}</Text>} + {isValidElement(Title) && <Text textOverflow="ellipsis">{Title}</Text>} - {isValidElementType(subtitle) && ( + {isValidElementType(Subtitle) && ( <Text muted size={1} textOverflow="ellipsis"> - {createElement(subtitle, {layout: 'default'})} + <Subtitle + // @ts-expect-error - @todo fix typings + layout="default" + /> </Text> )} - {isValidElement(subtitle) && ( + {isValidElement(Subtitle) && ( <Text muted size={1} textOverflow="ellipsis"> - {subtitle} + {Subtitle} </Text> )} </Stack> diff --git a/packages/sanity/src/core/components/scroll/scrollContainer.tsx b/packages/sanity/src/core/components/scroll/scrollContainer.tsx index 071aa7e84d2..f8a39fdb2e3 100644 --- a/packages/sanity/src/core/components/scroll/scrollContainer.tsx +++ b/packages/sanity/src/core/components/scroll/scrollContainer.tsx @@ -1,6 +1,5 @@ import createPubSub from 'nano-pubsub' import { - createElement, type ElementType, type ForwardedRef, forwardRef, @@ -8,8 +7,8 @@ import { useContext, useEffect, useImperativeHandle, - useMemo, useRef, + useState, } from 'react' import {ScrollContext} from 'sanity/_singletons' @@ -20,8 +19,6 @@ export interface ScrollContainerProps<T extends ElementType> onScroll?: (event: Event) => () => void } -const noop = () => undefined - /** * This provides a utility function for use within Sanity Studios to create scrollable containers * It also provides a way for components inside a scrollable container to track onScroll on their first parent scroll container @@ -35,28 +32,24 @@ export const ScrollContainer = forwardRef(function ScrollContainer<T extends Ele props: ScrollContainerProps<T>, forwardedRef: ForwardedRef<HTMLDivElement>, ) { - const {as = 'div', onScroll, ...rest} = props + const {as: As = 'div', onScroll, ...rest} = props const ref = useRef<HTMLDivElement | null>(null) useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => ref.current) const parentContext = useContext(ScrollContext) - const childContext = useMemo(() => createPubSub<Event>(), []) + const [childContext] = useState(() => createPubSub<Event>()) useEffect(() => { - if (onScroll) { - // emit scroll events from children - return childContext.subscribe(onScroll) - } - return noop + if (!onScroll) return undefined + // emit scroll events from children + return childContext.subscribe(onScroll) }, [childContext, onScroll]) useEffect(() => { + if (!parentContext) return undefined // let events bubble up - if (parentContext) { - return childContext.subscribe(parentContext.publish) - } - return noop + return childContext.subscribe(parentContext.publish) }, [parentContext, childContext]) useEffect(() => { @@ -82,7 +75,7 @@ export const ScrollContainer = forwardRef(function ScrollContainer<T extends Ele return ( <ScrollContext.Provider value={childContext}> - {createElement(as, {'ref': ref, 'data-testid': 'scroll-container', ...rest})} + <As data-testid="scroll-container" {...rest} ref={ref} /> </ScrollContext.Provider> ) }) diff --git a/packages/sanity/src/core/config/components/useMiddlewareComponents.ts b/packages/sanity/src/core/config/components/useMiddlewareComponents.tsx similarity index 88% rename from packages/sanity/src/core/config/components/useMiddlewareComponents.ts rename to packages/sanity/src/core/config/components/useMiddlewareComponents.tsx index cf312416c43..c7483177ca2 100644 --- a/packages/sanity/src/core/config/components/useMiddlewareComponents.ts +++ b/packages/sanity/src/core/config/components/useMiddlewareComponents.tsx @@ -1,28 +1,28 @@ /* eslint-disable @typescript-eslint/ban-types */ -import {type ComponentType, createElement, Fragment, useMemo} from 'react' +import {type ComponentType, Fragment, useMemo} from 'react' -import {flattenConfig} from '../../config' import {useSource} from '../../studio' +import {flattenConfig} from '..' import {type PluginOptions} from '../types' -const emptyRender = () => createElement(Fragment) +const emptyRender = () => <Fragment /> function _createMiddlewareComponent<T extends {}>( - defaultComponent: ComponentType<T>, + DefaultComponent: ComponentType<T>, middlewareComponents: ComponentType<T>[], ): ComponentType<T> { return (outerProps: T) => { // This is the inner "layer" of the middleware chain // Here we render the _default_ component (typically Sanity's component) - let next = (props: T) => createElement(defaultComponent, props) + let next = (props: T) => <DefaultComponent {...props} /> - for (const middleware of middlewareComponents) { + for (const Middleware of middlewareComponents) { // As we progress through the chain, the meaning of "renderDefault" changes. // At a given layer in the chain, the _next_ layer is the "default". const renderDefault = next // Here we replace `next` so that the _previous_ layer may use this as its _next_. - next = (props) => createElement(middleware, {...props, renderDefault}) + next = (props) => <Middleware {...props} renderDefault={renderDefault} /> } return next({ diff --git a/packages/sanity/src/core/config/createDefaultIcon.tsx b/packages/sanity/src/core/config/createDefaultIcon.tsx index fd0e9f508cb..17668d28985 100644 --- a/packages/sanity/src/core/config/createDefaultIcon.tsx +++ b/packages/sanity/src/core/config/createDefaultIcon.tsx @@ -19,6 +19,7 @@ const SvgText = styled.text` /** * Creates an icon element based on the input title + * @internal */ export function createDefaultIcon(title: string, subtitle: string) { const rng1 = pseudoRandomNumber(`${title} ${subtitle}`) diff --git a/packages/sanity/src/core/config/index.ts b/packages/sanity/src/core/config/index.ts index 1ea0374d04b..920fcb73855 100644 --- a/packages/sanity/src/core/config/index.ts +++ b/packages/sanity/src/core/config/index.ts @@ -1,6 +1,7 @@ export * from './components' export * from './ConfigPropertyError' export * from './ConfigResolutionError' +export * from './createDefaultIcon' export * from './defineConfig' export * from './definePlugin' export * from './document' diff --git a/packages/sanity/src/core/config/prepareConfig.ts b/packages/sanity/src/core/config/prepareConfig.tsx similarity index 98% rename from packages/sanity/src/core/config/prepareConfig.ts rename to packages/sanity/src/core/config/prepareConfig.tsx index a9266da29bb..a50a441252b 100644 --- a/packages/sanity/src/core/config/prepareConfig.ts +++ b/packages/sanity/src/core/config/prepareConfig.tsx @@ -4,13 +4,7 @@ import {type CurrentUser, type Schema, type SchemaValidationProblem} from '@sani import {studioTheme} from '@sanity/ui' import {type i18n} from 'i18next' import {startCase} from 'lodash' -import { - type ComponentType, - createElement, - type ElementType, - type ErrorInfo, - isValidElement, -} from 'react' +import {type ComponentType, type ElementType, type ErrorInfo, isValidElement} from 'react' import {isValidElementType} from 'react-is' import {map, shareReplay} from 'rxjs/operators' @@ -74,12 +68,12 @@ type InternalSource = WorkspaceSummary['__internal']['sources'][number] const isError = (p: SchemaValidationProblem) => p.severity === 'error' function normalizeIcon( - icon: ComponentType | ElementType | undefined, + Icon: ComponentType | ElementType | undefined, title: string, subtitle = '', ): JSX.Element { - if (isValidElementType(icon)) return createElement(icon) - if (isValidElement(icon)) return icon + if (isValidElementType(Icon)) return <Icon /> + if (isValidElement(Icon)) return Icon return createDefaultIcon(title, subtitle) } diff --git a/packages/sanity/src/core/config/types.ts b/packages/sanity/src/core/config/types.ts index 4af60acb82f..ed8205733dc 100644 --- a/packages/sanity/src/core/config/types.ts +++ b/packages/sanity/src/core/config/types.ts @@ -110,8 +110,6 @@ export interface Tool<Options = any> { /** * React component for the icon representing the tool. - * - * @deprecated Tool icons are no longer displayed. */ icon?: ComponentType diff --git a/packages/sanity/src/core/create/context/SanityCreateConfigProvider.tsx b/packages/sanity/src/core/create/context/SanityCreateConfigProvider.tsx index e604546cd0d..d1ae36a1105 100644 --- a/packages/sanity/src/core/create/context/SanityCreateConfigProvider.tsx +++ b/packages/sanity/src/core/create/context/SanityCreateConfigProvider.tsx @@ -1,4 +1,4 @@ -import {type ReactNode, useMemo} from 'react' +import {type ReactNode, useMemo, useState} from 'react' import {SanityCreateConfigContext} from 'sanity/_singletons' import {useSource} from '../../studio' @@ -19,7 +19,7 @@ export function SanityCreateConfigProvider(props: SanityCreateConfigProviderProp const {children} = props const {beta} = useSource() - const appIdCache = useMemo(() => createAppIdCache(), []) + const [appIdCache] = useState(() => createAppIdCache()) const value = useMemo((): SanityCreateConfigContextValue => { return { diff --git a/packages/sanity/src/core/field/conditional-property/utils.tsx b/packages/sanity/src/core/field/conditional-property/utils.tsx index 296fbc9470d..e07341dc596 100644 --- a/packages/sanity/src/core/field/conditional-property/utils.tsx +++ b/packages/sanity/src/core/field/conditional-property/utils.tsx @@ -4,7 +4,7 @@ import { type CurrentUser, } from '@sanity/types' import {omit} from 'lodash' -import {useMemo, useRef} from 'react' +import {useMemo} from 'react' import {isRecord} from '../../util' @@ -23,8 +23,6 @@ export function useCheckCondition( ): boolean { const {currentUser, document, parent, value} = context - const didWarn = useRef(false) - return useMemo(() => { let isTrueIsh = false @@ -46,7 +44,7 @@ export function useCheckCondition( return false } - if (isThenable(isTrueIsh) && !didWarn.current) { + if (isThenable(isTrueIsh)) { console.warn( `The \`${checkPropertyName}\` option is either a promise or a promise returning function. Async callbacks for \`${checkPropertyName}\` option is not currently supported.`, ) diff --git a/packages/sanity/src/core/field/diff/components/DiffFromTo.tsx b/packages/sanity/src/core/field/diff/components/DiffFromTo.tsx index cf8d9c46f92..33a422a0ea7 100644 --- a/packages/sanity/src/core/field/diff/components/DiffFromTo.tsx +++ b/packages/sanity/src/core/field/diff/components/DiffFromTo.tsx @@ -1,5 +1,5 @@ import {type Path, type SchemaType} from '@sanity/types' -import {createElement, type CSSProperties} from 'react' +import {type CSSProperties} from 'react' import {type FieldPreviewComponent} from '../../preview' import {type Diff} from '../../types' @@ -28,27 +28,35 @@ const cardStyles: CSSProperties = { /** @internal */ export function DiffFromTo(props: DiffFromToProps) { - const {align, cardClassName, diff, layout, path, previewComponent, schemaType} = props + const { + align, + cardClassName, + diff, + layout, + path, + previewComponent: PreviewComponent, + schemaType, + } = props const {action} = diff const changeVerb = useChangeVerb(diff) if (action === 'unchanged') { return ( <DiffCard className={cardClassName} style={cardStyles}> - {createElement(previewComponent, {schemaType, value: diff.toValue})} + <PreviewComponent schemaType={schemaType} value={diff.toValue} /> </DiffCard> ) } const from = diff.fromValue !== undefined && diff.fromValue !== null && ( <DiffCard as="del" className={cardClassName} diff={diff} path={path} style={cardStyles}> - {createElement(previewComponent, {schemaType, value: diff.fromValue})} + <PreviewComponent schemaType={schemaType} value={diff.fromValue} /> </DiffCard> ) const to = diff.toValue !== undefined && diff.toValue !== null && ( <DiffCard as="ins" className={cardClassName} diff={diff} path={path} style={cardStyles}> - {createElement(previewComponent, {schemaType, value: diff.toValue})} + <PreviewComponent schemaType={schemaType} value={diff.toValue} /> </DiffCard> ) diff --git a/packages/sanity/src/core/field/diff/components/FromToArrow.tsx b/packages/sanity/src/core/field/diff/components/FromToArrow.tsx index 65eb61573c0..4d44114c074 100644 --- a/packages/sanity/src/core/field/diff/components/FromToArrow.tsx +++ b/packages/sanity/src/core/field/diff/components/FromToArrow.tsx @@ -1,6 +1,6 @@ import {ArrowDownIcon, ArrowRightIcon} from '@sanity/icons' import {Text, type TextProps} from '@sanity/ui' -import {createElement, type HTMLProps} from 'react' +import {type HTMLProps} from 'react' /** @internal */ export type FromToArrowDirection = 'down' | 'right' @@ -16,11 +16,11 @@ export function FromToArrow( Omit<HTMLProps<HTMLDivElement>, 'children' | 'ref'>, ) { const {direction = 'right', ...restProps} = props - const arrowComponent = arrowComponents[direction] + const ArrowComponent = arrowComponents[direction] return ( <Text muted size={1} {...restProps}> - {createElement(arrowComponent)} + <ArrowComponent /> </Text> ) } diff --git a/packages/sanity/src/core/field/diff/components/MetaInfo.tsx b/packages/sanity/src/core/field/diff/components/MetaInfo.tsx index aa08febbbfa..ddbf2cefecc 100644 --- a/packages/sanity/src/core/field/diff/components/MetaInfo.tsx +++ b/packages/sanity/src/core/field/diff/components/MetaInfo.tsx @@ -1,5 +1,5 @@ import {Box, Flex, Stack, Text} from '@sanity/ui' -import {type ComponentType, createElement, type ReactNode} from 'react' +import {type ComponentType, type ReactNode} from 'react' import {styled} from 'styled-components' /** @internal */ @@ -17,14 +17,14 @@ const MetaText = styled(Text)` /** @internal */ export function MetaInfo(props: MetaInfoProps) { - const {title, action, icon, children, markRemoved} = props + const {title, action, icon: Icon, children, markRemoved} = props return ( <Flex padding={2} align="center"> - {icon && ( + {Icon && ( <Box padding={2}> <MetaText size={4} forwardedAs={markRemoved ? 'del' : 'div'}> - {createElement(icon)} + <Icon /> </MetaText> </Box> )} diff --git a/packages/sanity/src/core/field/types/portableText/diff/components/PortableText.tsx b/packages/sanity/src/core/field/types/portableText/diff/components/PortableText.tsx index 4ca44527a20..b26cac60bb1 100644 --- a/packages/sanity/src/core/field/types/portableText/diff/components/PortableText.tsx +++ b/packages/sanity/src/core/field/types/portableText/diff/components/PortableText.tsx @@ -6,7 +6,7 @@ import { type SpanSchemaType, } from '@sanity/types' import {uniq, xor} from 'lodash' -import {createElement, type ReactElement, type ReactNode, useCallback, useMemo} from 'react' +import {type ReactElement, type ReactNode, useCallback, useMemo} from 'react' import {type TFunction, useTranslation} from '../../../../../i18n' import {DiffCard} from '../../../../diff' @@ -228,7 +228,7 @@ export function PortableText(props: Props): JSX.Element { } } // end if seg.text }) - return createElement('div', {key: block._key}, ...returnedChildren) + return <div key={block._key}>{returnedChildren}</div> } throw new Error("'span' schemaType not found") }, diff --git a/packages/sanity/src/core/form/contexts/GetFormValue.tsx b/packages/sanity/src/core/form/contexts/GetFormValue.tsx index 2a9d858b49c..2354d0e246d 100644 --- a/packages/sanity/src/core/form/contexts/GetFormValue.tsx +++ b/packages/sanity/src/core/form/contexts/GetFormValue.tsx @@ -1,5 +1,5 @@ import {type Path} from '@sanity/types' -import {type ReactNode, useCallback, useContext, useRef} from 'react' +import {type ReactNode, useCallback, useContext, useEffect, useRef} from 'react' import {GetFormValueContext} from 'sanity/_singletons' import {getValueAtPath} from '../../field' @@ -10,18 +10,21 @@ import {type FormDocumentValue} from '../types' * @internal * @hidden */ -export function GetFormValueProvider(props: { +export const GetFormValueProvider = function GetFormValueProvider(props: { value: FormDocumentValue | undefined children: ReactNode }) { const valueRef = useRef(props.value) - valueRef.current = props.value + useEffect(() => { + valueRef.current = props.value + }, [props.value]) const getValue = useCallback((path: Path) => getValueAtPath(valueRef.current, path), [valueRef]) return ( <GetFormValueContext.Provider value={getValue}>{props.children}</GetFormValueContext.Provider> ) } +GetFormValueProvider.displayName = 'GetFormValueProvider' /** * React hook that returns a function that can be called to look up the value from the current document at the given path. diff --git a/packages/sanity/src/core/form/field/HoveredFieldProvider.tsx b/packages/sanity/src/core/form/field/HoveredFieldProvider.tsx index aaf23210588..72772bb492f 100644 --- a/packages/sanity/src/core/form/field/HoveredFieldProvider.tsx +++ b/packages/sanity/src/core/form/field/HoveredFieldProvider.tsx @@ -1,5 +1,5 @@ import {type Path} from '@sanity/types' -import {memo, type PropsWithChildren, useCallback, useMemo, useState} from 'react' +import {memo, type PropsWithChildren, useCallback, useMemo, useRef, useState} from 'react' import {HoveredFieldContext, type HoveredFieldContextValue} from 'sanity/_singletons' import {pathToString} from '../../field' @@ -7,40 +7,57 @@ import {pathToString} from '../../field' /** @internal */ export const HoveredFieldProvider = memo(function HoveredFieldProvider(props: PropsWithChildren) { const {children} = props - const [hoveredStack, setHoveredStack] = useState<string[]>([]) + const [listeners] = useState(() => new Set<() => void>()) + const hoveredStackRef = useRef<string[]>([]) - const handleMouseEnter = useCallback((path: Path) => { - const pathString = pathToString(path) + const handleMouseEnter = useCallback( + (path: Path) => { + const pathString = pathToString(path) - setHoveredStack((prev) => { - if (prev.includes(pathString)) { - return prev + if (!hoveredStackRef.current.includes(pathString)) { + hoveredStackRef.current = [pathString, ...hoveredStackRef.current] + for (const listener of listeners) { + listener() + } } + }, + [listeners], + ) - return [pathString, ...prev] - }) - }, []) - - const handleMouseLeave = useCallback((path: Path) => { - const pathString = pathToString(path) + const handleMouseLeave = useCallback( + (path: Path) => { + const pathString = pathToString(path) - setHoveredStack((prev) => { - if (prev.includes(pathString)) { - // eslint-disable-next-line max-nested-callbacks - return prev.filter((item) => item !== pathString) + if (hoveredStackRef.current.includes(pathString)) { + hoveredStackRef.current = hoveredStackRef.current.filter((item) => item !== pathString) + for (const listener of listeners) { + listener() + } } + }, + [listeners], + ) - return prev - }) - }, []) + const store = useMemo( + () => ({ + subscribe: (onStoreChange: () => void) => { + listeners.add(onStoreChange) + return () => { + listeners.delete(onStoreChange) + } + }, + getSnapshot: () => hoveredStackRef.current, + }), + [listeners], + ) const context: HoveredFieldContextValue = useMemo( () => ({ - hoveredStack, + store, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, }), - [handleMouseEnter, handleMouseLeave, hoveredStack], + [handleMouseEnter, handleMouseLeave, store], ) return <HoveredFieldContext.Provider value={context}>{children}</HoveredFieldContext.Provider> diff --git a/packages/sanity/src/core/form/field/actions/FieldActionMenu.tsx b/packages/sanity/src/core/form/field/actions/FieldActionMenu.tsx index 575a3aeb74e..6aae3ab7be1 100644 --- a/packages/sanity/src/core/form/field/actions/FieldActionMenu.tsx +++ b/packages/sanity/src/core/form/field/actions/FieldActionMenu.tsx @@ -137,10 +137,11 @@ function RootFieldActionMenuGroup(props: { <MenuButton button={ <Button - icon={node.icon} aria-label={open ? undefined : title} data-testid="field-actions-trigger" + icon={node.icon} mode="bleed" + tabIndex={0} tooltipProps={{ ...STATUS_BUTTON_TOOLTIP_PROPS, content: node.title, diff --git a/packages/sanity/src/core/form/field/actions/FieldActionsProvider.tsx b/packages/sanity/src/core/form/field/actions/FieldActionsProvider.tsx index dad188391c7..ef6993a3e85 100644 --- a/packages/sanity/src/core/form/field/actions/FieldActionsProvider.tsx +++ b/packages/sanity/src/core/form/field/actions/FieldActionsProvider.tsx @@ -1,5 +1,5 @@ import {type Path} from '@sanity/types' -import {type PropsWithChildren, useCallback, useMemo} from 'react' +import {memo, type PropsWithChildren, useCallback, useMemo, useSyncExternalStore} from 'react' import {FieldActionsContext, type FieldActionsContextValue} from 'sanity/_singletons' import {type DocumentFieldActionNode} from '../../../config' @@ -14,12 +14,23 @@ type FieldActionsProviderProps = PropsWithChildren<{ }> /** @internal */ -export function FieldActionsProvider(props: FieldActionsProviderProps) { +export const FieldActionsProvider = memo(function FieldActionsProvider( + props: FieldActionsProviderProps, +) { const {actions, children, path, focused} = props - const {onMouseEnter: onFieldMouseEnter, onMouseLeave: onFieldMouseLeave} = useHoveredField() - - const hoveredPath = useHoveredField().hoveredStack[0] - const hovered = supportsTouch || (hoveredPath ? pathToString(path) === hoveredPath : false) + const { + onMouseEnter: onFieldMouseEnter, + onMouseLeave: onFieldMouseLeave, + store: hoveredStore, + } = useHoveredField() + /** + * The `useSyncExternalStore` has a super power: if the value returned by the snapshot hasn't changed since last time, React won't re-render the component. + * This is why we can subscribe to the state of what's currently being hovered, but the component won't re-render unless the hovered state changes between `true` and `false`. + */ + const hovered = useSyncExternalStore(hoveredStore.subscribe, () => { + const [hoveredPath] = hoveredStore.getSnapshot() + return supportsTouch || (hoveredPath ? pathToString(path) === hoveredPath : false) + }) const handleMouseEnter = useCallback(() => { onFieldMouseEnter(path) @@ -41,4 +52,5 @@ export function FieldActionsProvider(props: FieldActionsProviderProps) { ) return <FieldActionsContext.Provider value={context}>{children}</FieldActionsContext.Provider> -} +}) +FieldActionsProvider.displayName = 'Memo(FieldActionsProvider)' diff --git a/packages/sanity/src/core/form/form-components-hooks/components.ts b/packages/sanity/src/core/form/form-components-hooks/components.tsx similarity index 90% rename from packages/sanity/src/core/form/form-components-hooks/components.ts rename to packages/sanity/src/core/form/form-components-hooks/components.tsx index b43c049bef5..a778bf1129d 100644 --- a/packages/sanity/src/core/form/form-components-hooks/components.ts +++ b/packages/sanity/src/core/form/form-components-hooks/components.tsx @@ -1,5 +1,5 @@ import {type SchemaType} from '@sanity/types' -import {type ComponentType, createElement, type ReactElement, useCallback} from 'react' +import {type ComponentType, type ReactElement, useCallback} from 'react' import {type PreviewProps} from '../../components/previews' import { @@ -33,7 +33,7 @@ function useResolveDefaultComponent<T extends {schemaType?: SchemaType}>(props: throw new Error('the `schemaType` property must be defined') } - const defaultResolvedComponent = componentResolver(componentProps.schemaType) + const DefaultResolvedComponent = componentResolver(componentProps.schemaType) const renderDefault = useCallback( (parentTypeProps: T) => { @@ -46,16 +46,13 @@ function useResolveDefaultComponent<T extends {schemaType?: SchemaType}>(props: // in order to prevent that a component is render itself // eslint-disable-next-line @typescript-eslint/no-unused-vars const {components, ...restSchemaType} = parentTypeProps.schemaType - const parentTypeResolvedComponent = componentResolver(restSchemaType) - return createElement(parentTypeResolvedComponent, parentTypeProps) + const ParentTypeResolvedComponent = componentResolver(restSchemaType) + return <ParentTypeResolvedComponent {...parentTypeProps} /> }, [componentResolver], ) - return createElement(defaultResolvedComponent, { - ...componentProps, - renderDefault, - }) as ReactElement<T> + return <DefaultResolvedComponent {...componentProps} renderDefault={renderDefault} /> } /** diff --git a/packages/sanity/src/core/form/hooks/__tests__/useDidUpdate.test.ts b/packages/sanity/src/core/form/hooks/__tests__/useDidUpdate.test.ts index 6c994e9deea..97994f96cfd 100644 --- a/packages/sanity/src/core/form/hooks/__tests__/useDidUpdate.test.ts +++ b/packages/sanity/src/core/form/hooks/__tests__/useDidUpdate.test.ts @@ -75,8 +75,8 @@ describe('useDidUpdate', () => { wrapper: StrictMode, }) - // The first time, didUpdate should be called. StrictMode runs hooks twice https://dev/reference/react/StrictMode#strictmode - expect(didUpdate).toHaveBeenCalledTimes(2) + // StrictMode runs hooks twice https://dev/reference/react/StrictMode#strictmode didUpdate should still be called once + expect(didUpdate).toHaveBeenCalledTimes(1) rerender({value: currentValue}) @@ -94,7 +94,7 @@ describe('useDidUpdate', () => { wrapper: StrictMode, }) - // The first time, didUpdate should be called. StrictMode runs hooks twice https://dev/reference/react/StrictMode#strictmode + // StrictMode runs hooks twice https://dev/reference/react/StrictMode#strictmode didUpdate should still be called once expect(didUpdate).toHaveBeenCalledTimes(2) expect(compare).toHaveBeenCalledTimes(2) @@ -114,8 +114,8 @@ describe('useDidUpdate', () => { wrapper: StrictMode, }) - // The first time, didUpdate should be called. StrictMode runs hooks twice https://dev/reference/react/StrictMode#strictmode - expect(didUpdate).toHaveBeenCalledTimes(2) + // StrictMode runs hooks twice https://dev/reference/react/StrictMode#strictmode didUpdate should still be called once + expect(didUpdate).toHaveBeenCalledTimes(1) didUpdate.mockClear() diff --git a/packages/sanity/src/core/form/hooks/__tests__/usePrevious.test.ts b/packages/sanity/src/core/form/hooks/__tests__/usePrevious.test.ts deleted file mode 100644 index 191f685b290..00000000000 --- a/packages/sanity/src/core/form/hooks/__tests__/usePrevious.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import {renderHook} from '@testing-library/react' -import {describe, expect, it} from 'vitest' - -import {usePrevious} from '../usePrevious' - -describe('usePrevious', () => { - it('should return undefined on the first render', () => { - const {result} = renderHook(() => usePrevious('test')) - expect(result.current).toBeNull() - }) - - it('should return the previous value on the next render', () => { - const {result, rerender} = renderHook(({value}) => usePrevious(value), { - initialProps: {value: 'test'}, - }) - - rerender({value: 'updated'}) - expect(result.current).toEqual('test') - - rerender({value: 'changed'}) - expect(result.current).toEqual('updated') - }) - - it('should return the initial value if provided', () => { - const {result, rerender} = renderHook(({value}) => usePrevious(value, 'initial'), { - initialProps: {value: 'test'}, - }) - expect(result.current).toEqual('initial') - - rerender({value: 'updated'}) - expect(result.current).toEqual('test') - }) -}) diff --git a/packages/sanity/src/core/form/hooks/useDidUpdate.ts b/packages/sanity/src/core/form/hooks/useDidUpdate.ts index 451cf5e0c32..653193812f6 100644 --- a/packages/sanity/src/core/form/hooks/useDidUpdate.ts +++ b/packages/sanity/src/core/form/hooks/useDidUpdate.ts @@ -1,8 +1,6 @@ -import {useEffect} from 'react' +import {useEffect, useRef} from 'react' import shallowEquals from 'shallow-equals' -import {usePrevious} from './usePrevious' - /** * A hook for doing side effects as a response to a change in a hook value between renders * @@ -30,10 +28,11 @@ export function useDidUpdate<T>( didUpdate: (previous: T | undefined, current: T | undefined) => void, compare: (previous: T | undefined, current: T) => boolean = shallowEquals, ): void { - const previous = usePrevious<T | undefined>(current) + const previous = useRef<T | undefined>(undefined) useEffect(() => { - if (!compare(previous, current)) { - didUpdate(previous, current) + if (!compare(previous.current, current)) { + didUpdate(previous.current, current) + previous.current = current } - }, [didUpdate, current, previous, compare]) + }, [compare, current, didUpdate]) } diff --git a/packages/sanity/src/core/form/hooks/usePrevious.ts b/packages/sanity/src/core/form/hooks/usePrevious.ts deleted file mode 100644 index c1a16a314f7..00000000000 --- a/packages/sanity/src/core/form/hooks/usePrevious.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {useEffect, useRef} from 'react' - -/** - * A hook that returns the previous value of a component variable - * This might be provided by React in the future (https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state) - */ -export function usePrevious<T>( - /** The value to track. Will return undefined for first render*/ - value: T, -): T | undefined -export function usePrevious<T>( - /** The value to track. Will return undefined for first render */ - value: T, - initial: T, -): T -export function usePrevious<T>(value: T, initial?: T): T | null { - const ref = useRef<T | null>(initial || null) - useEffect(() => { - ref.current = value - }, [value]) - return ref.current -} diff --git a/packages/sanity/src/core/form/inputs/CrossDatasetReferenceInput/CrossDatasetReferenceInput.tsx b/packages/sanity/src/core/form/inputs/CrossDatasetReferenceInput/CrossDatasetReferenceInput.tsx index 8b6b69d9b26..3a6be19e8bd 100644 --- a/packages/sanity/src/core/form/inputs/CrossDatasetReferenceInput/CrossDatasetReferenceInput.tsx +++ b/packages/sanity/src/core/form/inputs/CrossDatasetReferenceInput/CrossDatasetReferenceInput.tsx @@ -142,7 +142,8 @@ export function CrossDatasetReferenceInput(props: CrossDatasetReferenceInputProp const loadableReferenceInfo = useReferenceInfo(refDoc as FIXME, getReferenceInfoMemo) const featureInfo = useFeatureEnabled(CROSS_DATASET_FEATUREKEY) - const autocompletePopoverReferenceElementRef = useRef<HTMLDivElement | null>(null) + const [autocompletePopoverReferenceElement, setAutocompletePopoverReferenceElement] = + useState<HTMLDivElement | null>(null) const hasFocusAtRef = focusPath.length === 1 && focusPath[0] === '_ref' @@ -282,12 +283,12 @@ export function CrossDatasetReferenceInput(props: CrossDatasetReferenceInputProp {isEditing ? ( <Stack space={2} ref={clickOutsideBoundaryRef}> <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}> - <div ref={autocompletePopoverReferenceElementRef}> + <div ref={setAutocompletePopoverReferenceElement}> <ReferenceAutocomplete {...elementProps} data-testid="autocomplete" loading={searchState.isLoading} - referenceElement={autocompletePopoverReferenceElementRef.current} + referenceElement={autocompletePopoverReferenceElement} portalRef={autocompletePortalRef} id={inputId || ''} options={searchState.hits.map((hit) => ({ diff --git a/packages/sanity/src/core/form/inputs/CrossDatasetReferenceInput/CrossDatasetReferencePreview.tsx b/packages/sanity/src/core/form/inputs/CrossDatasetReferenceInput/CrossDatasetReferencePreview.tsx index 1b048c8062b..7ffd08bb9dd 100644 --- a/packages/sanity/src/core/form/inputs/CrossDatasetReferenceInput/CrossDatasetReferencePreview.tsx +++ b/packages/sanity/src/core/form/inputs/CrossDatasetReferenceInput/CrossDatasetReferencePreview.tsx @@ -3,7 +3,7 @@ import {AccessDeniedIcon, HelpCircleIcon, LaunchIcon} from '@sanity/icons' import imageUrlBuilder from '@sanity/image-url' import {type CrossDatasetType, type PreviewValue} from '@sanity/types' import {Badge, Box, Flex, Inline, Text} from '@sanity/ui' -import {createElement, isValidElement as ReactIsValidElement, useMemo} from 'react' +import {isValidElement as ReactIsValidElement, useMemo} from 'react' import {Tooltip} from '../../../../ui-components' import {DefaultPreview, type PreviewMediaDimensions, TextWithTone} from '../../../components' @@ -71,7 +71,9 @@ export function CrossDatasetReferencePreview(props: { ) } } - return refType?.icon ? createElement(refType.icon) : null + if (!refType?.icon) return null + const Icon = refType.icon + return <Icon /> }, [previewMedia, dataset, projectId, refType?.icon, t]) return ( diff --git a/packages/sanity/src/core/form/inputs/PortableText/PortableTextInput.tsx b/packages/sanity/src/core/form/inputs/PortableText/PortableTextInput.tsx index 2c56a8ee883..d048caea4c9 100644 --- a/packages/sanity/src/core/form/inputs/PortableText/PortableTextInput.tsx +++ b/packages/sanity/src/core/form/inputs/PortableText/PortableTextInput.tsx @@ -1,30 +1,35 @@ import { type EditorChange, + type EditorEmittedEvent, + EditorEventListener, + EditorProvider, type EditorSelection, type InvalidValue, type OnPasteFn, - type Patch as EditorPatch, type Patch, type PortableTextEditableProps, PortableTextEditor, type RangeDecoration, type RenderEditableFunction, + useEditor, + usePortableTextEditor, } from '@portabletext/editor' import {useTelemetry} from '@sanity/telemetry/react' -import {isKeySegment, type PortableTextBlock} from '@sanity/types' +import {isKeySegment, type Path, type PortableTextBlock} from '@sanity/types' import {Box, Flex, Text, useToast} from '@sanity/ui' import {randomKey} from '@sanity/util/content' import {sortBy} from 'lodash' import { + forwardRef, type ReactNode, startTransition, useCallback, useEffect, + useImperativeHandle, useMemo, useRef, useState, } from 'react' -import {Subject} from 'rxjs' import {useTranslation} from '../../../i18n' import {EMPTY_ARRAY} from '../../../util' @@ -59,6 +64,21 @@ function keyGenerator() { return randomKey(12) } +/** + * `EditorProvider` doesn't have a `ref` prop. This custom PTE plugin takes + * care of imperatively forwarding that ref. + */ +const EditorRefPlugin = forwardRef<PortableTextEditor | null>((_, ref) => { + const portableTextEditor = usePortableTextEditor() + + const portableTextEditorRef = useRef(portableTextEditor) + + useImperativeHandle(ref, () => portableTextEditorRef.current, []) + + return null +}) +EditorRefPlugin.displayName = 'EditorRefPlugin' + /** @internal */ export interface PortableTextMemberItem { kind: 'annotation' | 'textBlock' | 'objectBlock' | 'inlineObject' @@ -125,24 +145,17 @@ export function PortableTextInput(props: PortableTextInputProps): ReactNode { ), ) - const {subscribe} = usePatches({path}) const {t} = useTranslation() const [ignoreValidationError, setIgnoreValidationError] = useState(false) const [invalidValue, setInvalidValue] = useState<InvalidValue | null>(null) const [isFullscreen, setIsFullscreen] = useState(initialFullscreen ?? false) const [isActive, setIsActive] = useState(initialActive ?? false) const [hasFocusWithin, setHasFocusWithin] = useState(false) + const [ready, setReady] = useState(false) const telemetry = useTelemetry() const toast = useToast() - // Memoized patch stream - const patchSubject: Subject<{ - patches: EditorPatch[] - snapshot: PortableTextBlock[] | undefined - }> = useMemo(() => new Subject(), []) - const patches$ = useMemo(() => patchSubject.asObservable(), [patchSubject]) - const handleToggleFullscreen = useCallback(() => { setIsFullscreen((v) => { const next = !v @@ -164,13 +177,6 @@ export function PortableTextInput(props: PortableTextInputProps): ReactNode { } }, [invalidValue, value]) - // Subscribe to patches - useEffect(() => { - return subscribe(({patches, snapshot}): void => { - patchSubject.next({patches, snapshot}) - }) - }, [patchSubject, subscribe]) - const portableTextMemberItems = usePortableTextMemberItemsFromProps(props) // Set active if focused within the editor @@ -237,6 +243,9 @@ export function PortableTextInput(props: PortableTextInputProps): ReactNode { description: change.description, }) break + case 'ready': + setReady(true) + break default: } if (editorRef.current && onEditorChange) { @@ -305,7 +314,7 @@ export function PortableTextInput(props: PortableTextInputProps): ReactNode { file, uploaderCandidates: getUploadCandidates(schemaType.of, resolveUploader, file), })) - const ready = tasks.filter((task) => task.uploaderCandidates.length > 0) + const readyTasks = tasks.filter((task) => task.uploaderCandidates.length > 0) const rejected: UploadTask[] = tasks.filter((task) => task.uploaderCandidates.length === 0) if (rejected.length > 0) { @@ -330,7 +339,7 @@ export function PortableTextInput(props: PortableTextInputProps): ReactNode { // todo: consider if we should to ask the user here // the list of candidates is sorted by their priority and the first one is selected - ready.forEach((task) => { + readyTasks.forEach((task) => { uploadFile( task.file, // eslint-disable-next-line max-nested-callbacks @@ -373,16 +382,19 @@ export function PortableTextInput(props: PortableTextInputProps): ReactNode { {(!invalidValue || ignoreValidationError) && ( <PortableTextMarkersProvider markers={markers}> <PortableTextMemberItemsProvider memberItems={portableTextMemberItems}> - <PortableTextEditor - patches$={patches$} - keyGenerator={keyGenerator} - onChange={handleEditorChange} - maxBlocks={undefined} // TODO: from schema? - ref={editorRef} - readOnly={readOnly} - schemaType={schemaType} - value={value} + <EditorProvider + initialConfig={{ + initialValue: value, + readOnly: readOnly || !ready, + keyGenerator, + schema: schemaType, + }} > + <EditorChangePlugin onChange={handleEditorChange} /> + <EditorRefPlugin ref={editorRef} /> + <PatchesPlugin path={path} /> + <UpdateReadOnlyPlugin readOnly={readOnly || !ready} /> + <UpdateValuePlugin value={value} /> <Compositor {...props} elementRef={elementRef} @@ -397,11 +409,12 @@ export function PortableTextInput(props: PortableTextInputProps): ReactNode { onPaste={handlePaste} onToggleFullscreen={handleToggleFullscreen} rangeDecorations={rangeDecorations} + readOnly={readOnly || !ready} renderBlockActions={renderBlockActions} renderCustomMarkers={renderCustomMarkers} renderEditable={renderEditable} /> - </PortableTextEditor> + </EditorProvider> </PortableTextMemberItemsProvider> </PortableTextMarkersProvider> )} @@ -409,6 +422,138 @@ export function PortableTextInput(props: PortableTextInputProps): ReactNode { ) } +/** + * Custom PTE plugin that translates `EditorEmittedEvent`s to `EditorChange`s + */ +function EditorChangePlugin(props: {onChange: (change: EditorChange) => void}) { + const handleEditorEvent = useCallback( + (event: EditorEmittedEvent) => { + switch (event.type) { + case 'blurred': + props.onChange({ + type: 'blur', + event: event.event, + }) + break + case 'error': + props.onChange({ + type: 'error', + name: event.name, + level: 'warning', + description: event.description, + }) + break + case 'focused': + props.onChange({ + type: 'focus', + event: event.event, + }) + break + case 'loading': + props.onChange({ + type: 'loading', + isLoading: true, + }) + break + case 'done loading': + props.onChange({ + type: 'loading', + isLoading: false, + }) + break + case 'invalid value': + props.onChange({ + type: 'invalidValue', + resolution: event.resolution, + value: event.value, + }) + break + case 'mutation': + props.onChange(event) + break + case 'patch': { + props.onChange(event) + break + } + case 'ready': + props.onChange(event) + break + case 'selection': { + props.onChange(event) + break + } + case 'value changed': + props.onChange({ + type: 'value', + value: event.value, + }) + break + default: + } + }, + [props], + ) + + return <EditorEventListener on={handleEditorEvent} /> +} + +/** + * Custom PTE plugin that sets up a patch subscription and sends patches to the + * editor. + */ +function PatchesPlugin(props: {path: Path}) { + const editor = useEditor() + const {subscribe} = usePatches({path: props.path}) + + useEffect(() => { + const unsubscribe = subscribe(({patches, snapshot}): void => { + editor.send({type: 'patches', patches, snapshot}) + }) + + return () => { + return unsubscribe() + } + }, [editor, subscribe]) + + return null +} + +/** + * `EditorProvider` doesn't have a `value` prop. Instead, this custom PTE + * plugin listens for the prop change and sends an `update value` event to the + * editor. + */ +function UpdateValuePlugin(props: {value: Array<PortableTextBlock> | undefined}) { + const editor = useEditor() + + useEffect(() => { + editor.send({ + type: 'update value', + value: props.value, + }) + }, [editor, props.value]) + + return null +} + +/** + * `EditorProvider` doesn't have a `readOnly` prop. Instead, this custom PTE + * plugin listens for the prop change and sends a `toggle readOnly` event to + * the editor. + */ +function UpdateReadOnlyPlugin(props: {readOnly: boolean}) { + const editor = useEditor() + + useEffect(() => { + editor.send({ + type: 'update readOnly', + readOnly: props.readOnly, + }) + }, [editor, props.readOnly]) + + return null +} + function toFormPatches(patches: any) { return patches.map((p: Patch) => ({...p, patchType: SANITY_PATCH_TYPE})) } diff --git a/packages/sanity/src/core/form/inputs/PortableText/object/modals/PopoverModal.tsx b/packages/sanity/src/core/form/inputs/PortableText/object/modals/PopoverModal.tsx index a2cf1285a48..40ad79a241f 100644 --- a/packages/sanity/src/core/form/inputs/PortableText/object/modals/PopoverModal.tsx +++ b/packages/sanity/src/core/form/inputs/PortableText/object/modals/PopoverModal.tsx @@ -2,7 +2,8 @@ import {CloseIcon} from '@sanity/icons' import {Box, Flex, Text, useClickOutsideEvent, useGlobalKeyDown} from '@sanity/ui' -import {type ReactNode, useCallback, useEffect, useRef, useState} from 'react' +import {type ReactNode, useCallback, useRef, useState} from 'react' +import FocusLock from 'react-focus-lock' import {type PortableTextEditorElement} from 'sanity/_singletons' import {Button, type PopoverProps} from '../../../../../../ui-components' @@ -24,18 +25,8 @@ interface PopoverEditDialogProps { const POPOVER_FALLBACK_PLACEMENTS: PopoverProps['fallbackPlacements'] = ['top', 'bottom'] -export function PopoverEditDialog(props: PopoverEditDialogProps) { +export function PopoverEditDialog(props: PopoverEditDialogProps): ReactNode { const {floatingBoundary, referenceBoundary, referenceElement, width = 1} = props - const [open, setOpen] = useState(false) - - // This hook is here to set open after the initial render. - // If rendered immediately, the popover will for a split second be - // visible in the top left of the boundaryElement before correctly - // placed pointing at the reference element. - useEffect(() => { - setOpen(true) - }, []) - return ( <RootPopover content={<Content {...props} />} @@ -44,7 +35,7 @@ export function PopoverEditDialog(props: PopoverEditDialogProps) { data-ui="PopoverEditDialog" fallbackPlacements={POPOVER_FALLBACK_PLACEMENTS} floatingBoundary={floatingBoundary} - open={open} + open overflow="auto" placement="bottom" portal="default" @@ -52,26 +43,33 @@ export function PopoverEditDialog(props: PopoverEditDialogProps) { referenceBoundary={referenceBoundary} referenceElement={referenceElement} width={width} + autoFocus /> ) } function Content(props: PopoverEditDialogProps) { const {onClose, referenceBoundary, referenceElement, title, autoFocus} = props + const isClosedRef = useRef(false) + + const handleClose = useCallback(() => { + isClosedRef.current = true + onClose() + }, [onClose]) useGlobalKeyDown( useCallback( (event: KeyboardEvent) => { if (event.key === 'Escape') { - onClose() + handleClose() } }, - [onClose], + [handleClose], ), ) useClickOutsideEvent( - onClose, + handleClose, () => [referenceElement], () => referenceBoundary, ) @@ -80,42 +78,44 @@ function Content(props: PopoverEditDialogProps) { const [contentElement, setContentElement] = useState<HTMLDivElement | null>(null) const containerElement = useRef<HTMLDivElement | null>(null) - useEffect(() => { - // When rendered, focus on the first input element in the content - if (contentElement) { - contentElement.querySelector('input')?.focus() - } - }, [contentElement]) + const handleFocusLockWhiteList = useCallback((element: HTMLElement) => { + // This is needed in order for focusLock not to trap focus in the + // popover when closing the popover and focus is to be returned to the editor + if (isClosedRef.current) return false + return Boolean(element.contentEditable) || Boolean(containerElement.current?.contains(element)) + }, []) return ( <VirtualizerScrollInstanceProvider scrollElement={contentElement} containerElement={containerElement} > - <Flex ref={containerElement} direction="column" height="fill"> - <ContentHeaderBox flex="none" padding={1}> - <Flex align="center"> - <Box flex={1} padding={2}> - <Text weight="medium">{title}</Text> - </Box> + <FocusLock autoFocus whiteList={handleFocusLockWhiteList}> + <Flex ref={containerElement} direction="column" height="fill"> + <ContentHeaderBox flex="none" padding={1}> + <Flex align="center"> + <Box flex={1} padding={2}> + <Text weight="medium">{title}</Text> + </Box> - <Button - autoFocus={Boolean(autoFocus)} - icon={CloseIcon} - mode="bleed" - onClick={onClose} - tooltipProps={{content: 'Close'}} - /> - </Flex> - </ContentHeaderBox> - <ContentScrollerBox flex={1}> - <PresenceOverlay margins={[0, 0, 1, 0]}> - <Box padding={3} ref={setContentElement}> - {props.children} - </Box> - </PresenceOverlay> - </ContentScrollerBox> - </Flex> + <Button + autoFocus={Boolean(autoFocus)} + icon={CloseIcon} + mode="bleed" + onClick={handleClose} + tooltipProps={{content: 'Close'}} + /> + </Flex> + </ContentHeaderBox> + <ContentScrollerBox flex={1}> + <PresenceOverlay margins={[0, 0, 1, 0]}> + <Box padding={3} ref={setContentElement}> + {props.children} + </Box> + </PresenceOverlay> + </ContentScrollerBox> + </Flex> + </FocusLock> </VirtualizerScrollInstanceProvider> ) } diff --git a/packages/sanity/src/core/form/inputs/PortableText/presence-cursors/UserPresenceCursor.tsx b/packages/sanity/src/core/form/inputs/PortableText/presence-cursors/UserPresenceCursor.tsx index 84e6966edf0..ab30643a483 100644 --- a/packages/sanity/src/core/form/inputs/PortableText/presence-cursors/UserPresenceCursor.tsx +++ b/packages/sanity/src/core/form/inputs/PortableText/presence-cursors/UserPresenceCursor.tsx @@ -83,7 +83,7 @@ const CursorDot = styled.div` } ` -const UserBox = styled(motion(Box))(({theme}) => { +const UserBox = styled(motion.create(Box))(({theme}) => { const radius = getTheme_v2(theme)?.radius[4] return css` @@ -102,7 +102,7 @@ const UserBox = styled(motion(Box))(({theme}) => { ` }) -const UserText = styled(motion(Text))` +const UserText = styled(motion.create(Text))` color: var(--presence-cursor-fg); mix-blend-mode: unset; ` diff --git a/packages/sanity/src/core/form/inputs/ReferenceInput/ReferenceInput.tsx b/packages/sanity/src/core/form/inputs/ReferenceInput/ReferenceInput.tsx index a254fd43fc2..de06351c2c6 100644 --- a/packages/sanity/src/core/form/inputs/ReferenceInput/ReferenceInput.tsx +++ b/packages/sanity/src/core/form/inputs/ReferenceInput/ReferenceInput.tsx @@ -137,7 +137,8 @@ export function ReferenceInput(props: ReferenceInputProps) { const loadableReferenceInfo = useReferenceInfo(value?._ref, getReferenceInfo) - const autocompletePopoverReferenceElementRef = useRef<HTMLDivElement | null>(null) + const [autocompletePopoverReferenceElement, setAutocompletePopoverReferenceElement] = + useState<HTMLDivElement | null>(null) const {push} = useToast() const {t} = useTranslation() @@ -222,11 +223,11 @@ export function ReferenceInput(props: ReferenceInputProps) { const handleFocus = useCallback(() => onPathFocus(['_ref']), [onPathFocus]) const handleBlur = useCallback( (event: FocusEvent) => { - if (!autocompletePopoverReferenceElementRef.current?.contains(event.relatedTarget)) { + if (!autocompletePopoverReferenceElement?.contains(event.relatedTarget)) { props.elementProps.onBlur(event) } }, - [props.elementProps], + [autocompletePopoverReferenceElement, props.elementProps], ) const isWeakRefToNonexistent = @@ -309,14 +310,14 @@ export function ReferenceInput(props: ReferenceInputProps) { </Text> </Alert> ) : null} - <AutocompleteContainer ref={autocompletePopoverReferenceElementRef}> + <AutocompleteContainer ref={setAutocompletePopoverReferenceElement}> <ReferenceAutocomplete {...elementProps} onFocus={handleFocus} onBlur={handleBlur} data-testid="autocomplete" loading={searchState.isLoading} - referenceElement={autocompletePopoverReferenceElementRef.current} + referenceElement={autocompletePopoverReferenceElement} options={hits} radius={2} placeholder={t('inputs.reference.search-placeholder')} diff --git a/packages/sanity/src/core/form/inputs/ReferenceInput/useReferenceInfo.ts b/packages/sanity/src/core/form/inputs/ReferenceInput/useReferenceInfo.ts index 82e7e074de3..cd6aa1a083c 100644 --- a/packages/sanity/src/core/form/inputs/ReferenceInput/useReferenceInfo.ts +++ b/packages/sanity/src/core/form/inputs/ReferenceInput/useReferenceInfo.ts @@ -1,5 +1,5 @@ import {observableCallback} from 'observable-callback' -import {useMemo} from 'react' +import {useMemo, useState} from 'react' import {useObservable} from 'react-rx' import {concat, type Observable, of} from 'rxjs' import {catchError, concatMap, map, startWith} from 'rxjs/operators' @@ -34,7 +34,7 @@ export function useReferenceInfo( getReferenceInfo: GetReferenceInfo, ): Loadable<ReferenceInfo> { // NOTE: this is a small message queue to handle retries - const [onRetry$, onRetry] = useMemo(() => observableCallback(), []) + const [[onRetry$, onRetry]] = useState(() => observableCallback()) const referenceInfoObservable = useMemo( () => diff --git a/packages/sanity/src/core/form/inputs/ReferenceInput/useReferenceInput.tsx b/packages/sanity/src/core/form/inputs/ReferenceInput/useReferenceInput.tsx index aa561a3668c..c9a2e24407e 100644 --- a/packages/sanity/src/core/form/inputs/ReferenceInput/useReferenceInput.tsx +++ b/packages/sanity/src/core/form/inputs/ReferenceInput/useReferenceInput.tsx @@ -5,6 +5,7 @@ import { type ForwardedRef, forwardRef, useCallback, + useEffect, useMemo, useRef, } from 'react' @@ -21,7 +22,9 @@ import {type EditReferenceEvent} from './types' function useValueRef<T>(value: T): {current: T} { const ref = useRef(value) - ref.current = value + useEffect(() => { + ref.current = value + }, [value]) return ref } diff --git a/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/Grid/GridItem.tsx b/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/Grid/GridItem.tsx index b301eadc87d..892713af995 100644 --- a/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/Grid/GridItem.tsx +++ b/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/Grid/GridItem.tsx @@ -1,7 +1,7 @@ import {AddDocumentIcon, CopyIcon, TrashIcon} from '@sanity/icons' import {type SchemaType} from '@sanity/types' import {Box, Card, type CardTone, Menu} from '@sanity/ui' -import {useCallback, useMemo, useRef, useState} from 'react' +import {useCallback, useImperativeHandle, useMemo, useRef, useState} from 'react' import {styled} from 'styled-components' import {MenuButton, MenuItem} from '../../../../../../ui-components' @@ -96,7 +96,9 @@ export function GridItem<Item extends ObjectItem = ObjectItem>(props: GridItemPr const sortable = parentSchemaType.options?.sortable !== false const insertableTypes = parentSchemaType.of + const [previewCardElement, setPreviewCardElement] = useState<FIXME | null>(null) const previewCardRef = useRef<FIXME | null>(null) + useImperativeHandle(previewCardRef, () => previewCardElement, [previewCardElement]) // this is here to make sure the item is visible if it's being edited behind a modal useScrollIntoViewOnFocusWithin(previewCardRef, open) @@ -232,7 +234,7 @@ export function GridItem<Item extends ObjectItem = ObjectItem>(props: GridItemPr tabIndex={0} disabled={resolvingInitialValue} onClick={onOpen} - ref={previewCardRef} + ref={setPreviewCardElement} onFocus={onFocus} __unstable_focusRing > @@ -267,7 +269,7 @@ export function GridItem<Item extends ObjectItem = ObjectItem>(props: GridItemPr id={value._key} onClose={onClose} autofocus={focused} - legacy_referenceElement={previewCardRef.current} + legacy_referenceElement={previewCardElement} > {children} </EditPortal> diff --git a/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/ListArrayInput.tsx b/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/ListArrayInput.tsx index 609e016429c..3125752fce2 100644 --- a/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/ListArrayInput.tsx +++ b/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/ListArrayInput.tsx @@ -33,7 +33,6 @@ export function ListArrayInput<Item extends ObjectItem>(props: ArrayOfObjectsInp elementProps, members, onChange, - onInsert, onItemMove, onUpload, focusPath, @@ -113,7 +112,7 @@ export function ListArrayInput<Item extends ObjectItem>(props: ArrayOfObjectsInp const scroll = instance.scrollElement - const handleScroll = () => { + const handleScroll = (evt?: Event) => { const containerElementTop = containerElement.current?.getBoundingClientRect().top ?? 0 const parentElementTop = parentRef.current?.getBoundingClientRect().top ?? 0 @@ -122,7 +121,7 @@ export function ListArrayInput<Item extends ObjectItem>(props: ArrayOfObjectsInp // We pass a component that we have more control over to avoid issues when wrapped in custom component const itemOffset = Math.floor(parentElementTop - containerElementTop) - callback(scroll.scrollTop - itemOffset) + callback(scroll.scrollTop - itemOffset, Boolean(evt)) } handleScroll() @@ -225,7 +224,7 @@ export function ListArrayInput<Item extends ObjectItem>(props: ArrayOfObjectsInp top: 0, left: 0, width: '100%', - transform: `translateY(${items[0].start}px)`, + transform: items.length > 0 ? `translateY(${items[0].start}px)` : undefined, }} > {items.map((virtualRow) => { diff --git a/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/PreviewItem.tsx b/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/PreviewItem.tsx index 8c30e179ce2..ba859cb0df0 100644 --- a/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/PreviewItem.tsx +++ b/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/PreviewItem.tsx @@ -2,7 +2,7 @@ import {AddDocumentIcon, CopyIcon, TrashIcon} from '@sanity/icons' import {type SchemaType} from '@sanity/types' import {Box, Card, type CardTone, Menu} from '@sanity/ui' -import {useCallback, useMemo, useRef, useState} from 'react' +import {useCallback, useImperativeHandle, useMemo, useRef, useState} from 'react' import {MenuButton, MenuItem} from '../../../../../../ui-components' import {ChangeIndicator} from '../../../../../changeIndicators' @@ -80,7 +80,13 @@ export function PreviewItem<Item extends ObjectItem = ObjectItem>(props: Preview const sortable = parentSchemaType.options?.sortable !== false const insertableTypes = parentSchemaType.of + const [previewCardElement, setPreviewCardElement] = useState<HTMLDivElement | null>(null) const previewCardRef = useRef<HTMLDivElement | null>(null) + useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>( + previewCardRef, + () => previewCardElement, + [previewCardElement], + ) // this is here to make sure the item is visible if it's being edited behind a modal useScrollIntoViewOnFocusWithin(previewCardRef, open) @@ -210,7 +216,7 @@ export function PreviewItem<Item extends ObjectItem = ObjectItem>(props: Preview radius={1} disabled={resolvingInitialValue} onClick={onOpen} - ref={previewCardRef} + ref={setPreviewCardElement} onFocus={onFocus} __unstable_focusRing style={BUTTON_CARD_STYLE} @@ -248,7 +254,7 @@ export function PreviewItem<Item extends ObjectItem = ObjectItem>(props: Preview id={value._key} onClose={onClose} autofocus={focused} - legacy_referenceElement={previewCardRef.current} + legacy_referenceElement={previewCardElement} > {children} </EditPortal> diff --git a/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/useMemoCompare.ts b/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/useMemoCompare.ts index a55e88b230f..7603ad3c70f 100644 --- a/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/useMemoCompare.ts +++ b/packages/sanity/src/core/form/inputs/arrays/ArrayOfObjectsInput/List/useMemoCompare.ts @@ -1,20 +1,17 @@ -import {useEffect, useRef} from 'react' +import {useState} from 'react' export function useMemoCompare<T>(next: T, compare: (prev: T, next: T) => boolean): T { - // Ref for storing previous value - const previousRef = useRef<T>(next) - const previous = previousRef.current + // State for storing previous value + const [previous, setPrevious] = useState<T>(next) // Pass previous and next value to compare function // to determine whether to consider them equal. - const isEqual = compare(previous, next) - // If not equal update previousRef to next value. - // We only update if not equal so that this hook continues to return - // the same old value if compare keeps returning true. - useEffect(() => { - if (!isEqual) { - previousRef.current = next - } - }) - // Finally, if equal then return the previous value - return isEqual ? previous : next + if (!compare(previous, next)) { + // We only update if not equal so that this hook continues to return + // the same old value if compare keeps returning true. + setPrevious(next) + // Return the next value right away, no need to have a render cycle with the old value + return next + } + // Finally, return the previous value until it has changed according to the compare function + return previous } diff --git a/packages/sanity/src/core/form/inputs/files/ImageToolInput/imagetool/Resize.tsx b/packages/sanity/src/core/form/inputs/files/ImageToolInput/imagetool/Resize.tsx index 59acc8fd48d..0029af56e9b 100644 --- a/packages/sanity/src/core/form/inputs/files/ImageToolInput/imagetool/Resize.tsx +++ b/packages/sanity/src/core/form/inputs/files/ImageToolInput/imagetool/Resize.tsx @@ -1,4 +1,4 @@ -import {type ReactNode, useLayoutEffect, useRef, useState} from 'react' +import {type ReactNode, useEffect, useLayoutEffect, useState} from 'react' export interface ResizeProps { image: HTMLImageElement @@ -7,31 +7,32 @@ export interface ResizeProps { children: (canvas: HTMLCanvasElement) => ReactNode } -export function Resize(props: ResizeProps): any { +export function Resize(props: ResizeProps): ReactNode { const {image, maxHeight, maxWidth, children} = props - const canvasRef = useRef<HTMLCanvasElement | null>(null) - const [ready, setReady] = useState(false) + const [canvas, setCanvas] = useState<HTMLCanvasElement | null>(null) + const hasCanvas = Boolean(canvas) + useEffect(() => { + if (hasCanvas) { + return undefined + } + const canvasElement = document.createElement('canvas') + canvasElement.style.display = 'none' + document.body.appendChild(canvasElement) + setCanvas(canvasElement) + return () => { + document.body.removeChild(canvasElement) + } + }, [hasCanvas]) /** * The useLayoutEffect is used here intentionally. - * Since the first render doesn't have a canvas element yet we return `null` instead of calling `children` so that `ImageTool` don't have to deal with - * the initial render not having a canvas element. - * Now, the flow is that first ImageTool will render a loading state, then it will render <Resize> and expect it to have a canvas that - * renders the provided image. - * If we use `useEffect` there will be a flash where <ImageTool> just finished rendering loading, - * then it will render with nothing, causing a jump, - * and finally it renders the image inside the canvas. - * By using `useLayoutEffect` we ensure that the intermediary state where there is no canvas doesn't paint in the browser, - * React blocks it, runs render again, this time we have a canvas element that got setup inside the effect and assigned to the ref, - * and then we render the image inside the canvas. - * No flash, no jumps, just a smooth transition from loading to image. + * It ensures that changes to the painted image, height and width are applied synchronously, before the next paint. + * If we used a passive useEffect it would cause a flicker as the canvas would be painted after the next paint. + * Two effect hooks are used to ensure the `document.body.appendChild` related logic only run once, while resizing the canvas and painting a new image can run multiple times as needed. */ useLayoutEffect(() => { - if (!canvasRef.current) { - const canvasElement = document.createElement('canvas') - canvasElement.style.display = 'none' - canvasRef.current = canvasElement - setReady(true) + if (!canvas) { + return } const ratio = image.width / image.height @@ -42,24 +43,17 @@ export function Resize(props: ResizeProps): any { const targetWidth = landscape ? width : height * ratio const targetHeight = landscape ? width / ratio : height - canvasRef.current.width = targetWidth - canvasRef.current.height = targetHeight + Object.assign(canvas, {width: targetWidth, height: targetHeight}) - const ctx = canvasRef.current.getContext('2d') + const ctx = canvas.getContext('2d') if (ctx) { ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, targetWidth, targetHeight) } + }, [canvas, image, maxHeight, maxWidth]) - const node = canvasRef.current - document.body.appendChild(node) - return () => { - document.body.removeChild(node) - } - }, [image, maxHeight, maxWidth]) - - if (!canvasRef.current || !ready) { + if (!canvas) { return null } - return children(canvasRef.current) + return children(canvas) } diff --git a/packages/sanity/src/core/form/store/useFormState.ts b/packages/sanity/src/core/form/store/useFormState.ts index a57912da68b..3d1651fc6bf 100644 --- a/packages/sanity/src/core/form/store/useFormState.ts +++ b/packages/sanity/src/core/form/store/useFormState.ts @@ -1,7 +1,7 @@ /* eslint-disable camelcase */ import {type ObjectSchemaType, type Path, type ValidationMarker} from '@sanity/types' -import {useMemo} from 'react' +import {useMemo, useState} from 'react' import {type FormNodePresence} from '../../presence' import {useCurrentUser} from '../../store' @@ -53,44 +53,44 @@ export function useFormState< // note: feel free to move these state pieces out of this hook const currentUser = useCurrentUser() - const prepareHiddenState = useMemo(() => createCallbackResolver({property: 'hidden'}), []) - const prepareReadOnlyState = useMemo(() => createCallbackResolver({property: 'readOnly'}), []) - const prepareFormState = useMemo(() => createPrepareFormState(), []) + const [prepareHiddenState] = useState(() => createCallbackResolver({property: 'hidden'})) + const [prepareReadOnlyState] = useState(() => createCallbackResolver({property: 'readOnly'})) + const [prepareFormState] = useState(() => createPrepareFormState()) - const reconcileFieldGroupState = useMemo(() => { + const [reconcileFieldGroupState] = useState(() => { let last: StateTree<string> | undefined return (state: StateTree<string> | undefined) => { const result = immutableReconcile(last ?? null, state) last = result return result } - }, []) + }) const reconciledFieldGroupState = useMemo(() => { return reconcileFieldGroupState(fieldGroupState) }, [fieldGroupState, reconcileFieldGroupState]) - const reconcileCollapsedPaths = useMemo(() => { + const [reconcileCollapsedPaths] = useState(() => { let last: StateTree<boolean> | undefined return (state: StateTree<boolean> | undefined) => { const result = immutableReconcile(last ?? null, state) last = result return result } - }, []) + }) const reconciledCollapsedPaths = useMemo( () => reconcileCollapsedPaths(collapsedPaths), [collapsedPaths, reconcileCollapsedPaths], ) - const reconcileCollapsedFieldsets = useMemo(() => { + const [reconcileCollapsedFieldsets] = useState(() => { let last: StateTree<boolean> | undefined return (state: StateTree<boolean> | undefined) => { const result = immutableReconcile(last ?? null, state) last = result return result } - }, []) + }) const reconciledCollapsedFieldsets = useMemo( () => reconcileCollapsedFieldsets(collapsedFieldSets), [collapsedFieldSets, reconcileCollapsedFieldsets], diff --git a/packages/sanity/src/core/form/studio/FormBuilder.test.tsx b/packages/sanity/src/core/form/studio/FormBuilder.test.tsx index 86ac5c75b11..8b80e8a88ba 100644 --- a/packages/sanity/src/core/form/studio/FormBuilder.test.tsx +++ b/packages/sanity/src/core/form/studio/FormBuilder.test.tsx @@ -2,7 +2,7 @@ import {type SanityClient} from '@sanity/client' import {defineType, type Path} from '@sanity/types' import {render} from '@testing-library/react' -import {useMemo} from 'react' +import {useMemo, useState} from 'react' import {beforeEach, describe, expect, it, type Mock, vi} from 'vitest' import {createMockSanityClient} from '../../../../test/mocks/mockSanityClient' @@ -77,7 +77,7 @@ describe('FormBuilder', () => { throw new Error('schema type is not an object') } - const patchChannel = useMemo(() => createPatchChannel(), []) + const [patchChannel] = useState(() => createPatchChannel()) const formState = useFormState({ schemaType, @@ -174,7 +174,7 @@ describe('FormBuilder', () => { throw new Error('schema type is not an object') } - const patchChannel = useMemo(() => createPatchChannel(), []) + const [patchChannel] = useState(() => createPatchChannel()) const formState = useFormState({ schemaType, diff --git a/packages/sanity/src/core/form/studio/assetSource/shared/AssetDeleteDialog.tsx b/packages/sanity/src/core/form/studio/assetSource/shared/AssetDeleteDialog.tsx index a85e03fbb44..e81a4750a3d 100644 --- a/packages/sanity/src/core/form/studio/assetSource/shared/AssetDeleteDialog.tsx +++ b/packages/sanity/src/core/form/studio/assetSource/shared/AssetDeleteDialog.tsx @@ -5,7 +5,7 @@ import {useMemo} from 'react' import {Dialog} from '../../../../../ui-components' import {LoadingBlock} from '../../../../components/loadingBlock' -import {useReferringDocuments} from '../../../../hooks/useReferringDocuments' +import {useLegacyReferringDocuments} from '../../../../hooks/useReferringDocuments' import {useTranslation} from '../../../../i18n' import {AssetUsageList} from './AssetUsageList' import {ConfirmMessage} from './ConfirmMessage' @@ -25,7 +25,7 @@ export function AssetDeleteDialog({ onClose, onDelete, }: UsageDialogProps) { - const {isLoading, referringDocuments} = useReferringDocuments(asset._id) + const {isLoading, referringDocuments} = useLegacyReferringDocuments(asset._id) const publishedDocuments = useMemo(() => { const drafts = referringDocuments.reduce<string[]>( diff --git a/packages/sanity/src/core/form/studio/assetSource/shared/AssetUsageDialog.tsx b/packages/sanity/src/core/form/studio/assetSource/shared/AssetUsageDialog.tsx index 6c925afe2a6..829d7720928 100644 --- a/packages/sanity/src/core/form/studio/assetSource/shared/AssetUsageDialog.tsx +++ b/packages/sanity/src/core/form/studio/assetSource/shared/AssetUsageDialog.tsx @@ -3,7 +3,7 @@ import {useMemo} from 'react' import {Dialog} from '../../../../../ui-components' import {LoadingBlock} from '../../../../components/loadingBlock' -import {useReferringDocuments} from '../../../../hooks/useReferringDocuments' +import {useLegacyReferringDocuments} from '../../../../hooks/useReferringDocuments' import {useTranslation} from '../../../../i18n' import {AssetUsageList} from './AssetUsageList' @@ -14,7 +14,7 @@ export interface UsageDialogProps { } export function AssetUsageDialog({asset, assetType, onClose}: UsageDialogProps) { - const {isLoading, referringDocuments} = useReferringDocuments(asset._id) + const {isLoading, referringDocuments} = useLegacyReferringDocuments(asset._id) const publishedDocuments = useMemo(() => { const drafts = referringDocuments.reduce<string[]>( diff --git a/packages/sanity/src/core/form/studio/assetSource/shared/DefaultSource.tsx b/packages/sanity/src/core/form/studio/assetSource/shared/DefaultSource.tsx index 260d6d55e2f..bd091673972 100644 --- a/packages/sanity/src/core/form/studio/assetSource/shared/DefaultSource.tsx +++ b/packages/sanity/src/core/form/studio/assetSource/shared/DefaultSource.tsx @@ -105,7 +105,7 @@ const DefaultAssetSource = function DefaultAssetSource( ) { const client = useClient(DEFAULT_STUDIO_CLIENT_OPTIONS) const versionedClient = useMemo(() => client.withConfig({apiVersion: '2023-02-14'}), [client]) - const _elementId = useRef(`default-asset-source-${uniqueId()}`) + const [_elementId] = useState(() => `default-asset-source-${uniqueId()}`) const currentPageNumber = useRef(0) const {t} = useTranslation() const fetch$ = useRef<Subscription>() @@ -229,7 +229,7 @@ const DefaultAssetSource = function DefaultAssetSource( context: assetType, }) } - id={_elementId.current} + id={_elementId} onClickOutside={handleClose} onClose={handleClose} ref={ref} diff --git a/packages/sanity/src/core/form/studio/contexts/FormCallbacks.tsx b/packages/sanity/src/core/form/studio/contexts/FormCallbacks.tsx index 8b86d6613c0..2f4a854c94a 100644 --- a/packages/sanity/src/core/form/studio/contexts/FormCallbacks.tsx +++ b/packages/sanity/src/core/form/studio/contexts/FormCallbacks.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/no-unused-prop-types */ import {type Path} from '@sanity/types' -import {memo, type ReactNode, useCallback, useContext, useMemo, useRef} from 'react' +import {memo, type ReactNode, useCallback, useContext, useEffect, useMemo, useRef} from 'react' import {FormCallbacksContext} from 'sanity/_singletons' import {type OnPathFocusPayload} from '../..' @@ -23,7 +23,9 @@ export const FormCallbacksProvider = memo(function FormCallbacksProvider( props: FormCallbacksValue & {children: ReactNode}, ) { const ref = useRef<FormCallbacksValue>(props) - ref.current = props + useEffect(() => { + ref.current = props + }, [props]) const transformPatches = useCallback( (patches: FormPatch[]) => { diff --git a/packages/sanity/src/core/form/studio/contexts/Presence.tsx b/packages/sanity/src/core/form/studio/contexts/Presence.tsx index 85dcaad5186..5aade46b5eb 100644 --- a/packages/sanity/src/core/form/studio/contexts/Presence.tsx +++ b/packages/sanity/src/core/form/studio/contexts/Presence.tsx @@ -13,6 +13,7 @@ export function PresenceProvider(props: {presence: FormNodePresence[]; children: <PresenceContext.Provider value={props.presence}>{props.children}</PresenceContext.Provider> ) } +PresenceProvider.displayName = 'PresenceProvider' export function useFormFieldPresence(): FormNodePresence[] { const ctx = useContext(PresenceContext) diff --git a/packages/sanity/src/core/form/studio/defaults.ts b/packages/sanity/src/core/form/studio/defaults.tsx similarity index 68% rename from packages/sanity/src/core/form/studio/defaults.ts rename to packages/sanity/src/core/form/studio/defaults.tsx index 4998d8f07c8..d08b7319225 100644 --- a/packages/sanity/src/core/form/studio/defaults.ts +++ b/packages/sanity/src/core/form/studio/defaults.tsx @@ -1,5 +1,3 @@ -import {createElement} from 'react' - import {Preview} from '../../preview/components/Preview' import { type RenderAnnotationCallback, @@ -20,35 +18,41 @@ import {defaultResolveItemComponent} from './inputResolver/itemResolver' /** @internal */ export const defaultRenderAnnotation: RenderAnnotationCallback = (props) => { - return createElement(defaultResolveAnnotationComponent(props.schemaType), props) + const Annotation = defaultResolveAnnotationComponent(props.schemaType) + return <Annotation {...props} /> } /** @internal */ export const defaultRenderBlock: RenderBlockCallback = (props) => { - return createElement(defaultResolveBlockComponent(props.schemaType), props) + const Block = defaultResolveBlockComponent(props.schemaType) + return <Block {...props} /> } /** @internal */ export const defaultRenderInlineBlock: RenderBlockCallback = (props) => { - return createElement(defaultResolveInlineBlockComponent(props.schemaType), props) + const InlineBlock = defaultResolveInlineBlockComponent(props.schemaType) + return <InlineBlock {...props} /> } /** @internal */ export const defaultRenderField: RenderFieldCallback = (props) => { - return createElement(defaultResolveFieldComponent(props.schemaType), props) + const Field = defaultResolveFieldComponent(props.schemaType) + return <Field {...props} /> } /** @internal */ export const defaultRenderInput: RenderInputCallback = (props) => { - return createElement(defaultResolveInputComponent(props.schemaType), props) + const Input = defaultResolveInputComponent(props.schemaType) + return <Input {...props} /> } /** @internal */ export const defaultRenderItem: RenderItemCallback = (props) => { - return createElement(defaultResolveItemComponent(props.schemaType), props) + const Item = defaultResolveItemComponent(props.schemaType) + return <Item {...props} /> } /** @internal */ export const defaultRenderPreview: RenderPreviewCallback = (props) => { - return createElement(Preview, props) + return <Preview {...props} /> } diff --git a/packages/sanity/src/core/form/studio/inputs/client-adapters/assets.ts b/packages/sanity/src/core/form/studio/inputs/client-adapters/assets.ts index 1e51152ec43..0c0adbd7e18 100644 --- a/packages/sanity/src/core/form/studio/inputs/client-adapters/assets.ts +++ b/packages/sanity/src/core/form/studio/inputs/client-adapters/assets.ts @@ -1,7 +1,7 @@ import {type ProgressEvent, type SanityAssetDocument, type SanityClient} from '@sanity/client' import {type FileAsset, type ImageAsset} from '@sanity/types' -import {Observable, of as observableOf, of} from 'rxjs' -import {catchError, map, mergeMap, retry, switchMap} from 'rxjs/operators' +import {Observable, of as observableOf} from 'rxjs' +import {catchError, map, mergeMap} from 'rxjs/operators' import {type DocumentPreviewStore} from '../../../../preview' import {type UploadOptions} from '../../uploads/types' @@ -84,43 +84,17 @@ export const uploadFileAsset = (client: SanityClient, file: File | Blob, options */ // note: there's currently 100% overlap between the ImageAsset document and the FileAsset documents as per interface required by the image and file input function observeAssetDoc(documentPreviewStore: DocumentPreviewStore, id: string) { - return documentPreviewStore - .observePaths({_type: 'reference', _ref: id}, [ - 'originalFilename', - 'url', - 'metadata', - 'label', - 'title', - 'description', - 'creditLine', - 'source', - 'size', - ]) - .pipe( - /** - * In some cases when uploading large media file we are getting an stale `null` response from content lake when fetching the reference that was just uploaded, - * making the UI not to react as it should. - * This retry logic is added to handle the case where the asset is not found in the initial fetch to the documentPreviewStore but it will eventually be found, - * because the asset has been just added. - * It has the downside that if this is being used to check if an asset exists, it will retry 5 times before returning null. - */ - switchMap((result) => { - // If the result is null, throw an error to trigger retry - if (result === null) { - throw new Error(`No asset found in documentPreviewStore with id: ${id}`) - } - // If the result is not null, return the result - return of(result) - }), - retry({ - count: 5, - delay: 1000, - }), - catchError((err) => { - console.error('Final error after retries, asset not found in documentPreviewStore:', err) - return of(null) // Return null if the asset is not found - }), - ) + return documentPreviewStore.observePaths({_type: 'reference', _ref: id}, [ + 'originalFilename', + 'url', + 'metadata', + 'label', + 'title', + 'description', + 'creditLine', + 'source', + 'size', + ]) } export function observeImageAsset(documentPreviewStore: DocumentPreviewStore, id: string) { diff --git a/packages/sanity/src/core/form/studio/inputs/crossDatasetReference/StudioCrossDatasetReferenceInput.tsx b/packages/sanity/src/core/form/studio/inputs/crossDatasetReference/StudioCrossDatasetReferenceInput.tsx index 141bafddad2..80310a4ac43 100644 --- a/packages/sanity/src/core/form/studio/inputs/crossDatasetReference/StudioCrossDatasetReferenceInput.tsx +++ b/packages/sanity/src/core/form/studio/inputs/crossDatasetReference/StudioCrossDatasetReferenceInput.tsx @@ -7,7 +7,7 @@ import { type SanityDocument, } from '@sanity/types' import {get} from '@sanity/util/paths' -import {useCallback, useMemo, useRef} from 'react' +import {useCallback, useEffect, useMemo, useRef} from 'react' import {from, throwError} from 'rxjs' import {catchError, mergeMap} from 'rxjs/operators' @@ -58,7 +58,9 @@ export type StudioCrossDatasetReferenceInputProps = ObjectInputProps< function useValueRef<T>(value: T): {current: T} { const ref = useRef(value) - ref.current = value + useEffect(() => { + ref.current = value + }, [value]) return ref } diff --git a/packages/sanity/src/core/form/studio/inputs/reference/StudioReferenceInput.tsx b/packages/sanity/src/core/form/studio/inputs/reference/StudioReferenceInput.tsx index 87c0a47b329..41fecc15ee3 100644 --- a/packages/sanity/src/core/form/studio/inputs/reference/StudioReferenceInput.tsx +++ b/packages/sanity/src/core/form/studio/inputs/reference/StudioReferenceInput.tsx @@ -5,6 +5,7 @@ import { type ForwardedRef, forwardRef, useCallback, + useEffect, useMemo, useRef, } from 'react' @@ -39,7 +40,9 @@ export type StudioReferenceInputProps = ObjectInputProps<Reference, ReferenceSch function useValueRef<T>(value: T): {current: T} { const ref = useRef(value) - ref.current = value + useEffect(() => { + ref.current = value + }, [value]) return ref } diff --git a/packages/sanity/src/core/form/studio/tree-editing/components/TreeEditingDialog.tsx b/packages/sanity/src/core/form/studio/tree-editing/components/TreeEditingDialog.tsx index 9af821f3c6f..a88bd29fa95 100644 --- a/packages/sanity/src/core/form/studio/tree-editing/components/TreeEditingDialog.tsx +++ b/packages/sanity/src/core/form/studio/tree-editing/components/TreeEditingDialog.tsx @@ -61,7 +61,7 @@ const StyledDialog = styled(Dialog)(({theme}: {theme: Theme}) => { ` }) -const MotionFlex = motion(Flex) +const MotionFlex = motion.create(Flex) interface TreeEditingDialogProps { onPathFocus: (path: Path) => void diff --git a/packages/sanity/src/core/form/studio/tree-editing/components/layout/TreeEditingLayout.tsx b/packages/sanity/src/core/form/studio/tree-editing/components/layout/TreeEditingLayout.tsx index dc3c002f877..6eb8ee384db 100644 --- a/packages/sanity/src/core/form/studio/tree-editing/components/layout/TreeEditingLayout.tsx +++ b/packages/sanity/src/core/form/studio/tree-editing/components/layout/TreeEditingLayout.tsx @@ -30,10 +30,10 @@ export const TreeEditingLayout = memo(function TreeEditingLayout( items, onPathSelect, selectedPath, - setScrollElement, + setScrollElement: setParentScrollElement, title, } = props - const scrollElementRef = useRef<HTMLDivElement | null>(null) + const [scrollElement, setScrollElement] = useState<HTMLDivElement | null>(null) const containerElementRef = useRef<HTMLDivElement | null>(null) const [open, setOpen] = useState<boolean>(false) @@ -42,11 +42,10 @@ export const TreeEditingLayout = memo(function TreeEditingLayout( const handleSetScrollElementRef = useCallback( (el: HTMLDivElement | null) => { - scrollElementRef.current = el - - setScrollElement?.(el) + setScrollElement(el) + setParentScrollElement?.(el) }, - [setScrollElement], + [setParentScrollElement], ) return ( @@ -75,7 +74,7 @@ export const TreeEditingLayout = memo(function TreeEditingLayout( {children && ( <VirtualizerScrollInstanceProvider containerElement={containerElementRef} - scrollElement={scrollElementRef.current} + scrollElement={scrollElement} > <Container width={1} diff --git a/packages/sanity/src/core/form/studio/tree-editing/components/layout/TreeEditingLayoutSidebar.tsx b/packages/sanity/src/core/form/studio/tree-editing/components/layout/TreeEditingLayoutSidebar.tsx index e510a571715..529bac9bede 100644 --- a/packages/sanity/src/core/form/studio/tree-editing/components/layout/TreeEditingLayoutSidebar.tsx +++ b/packages/sanity/src/core/form/studio/tree-editing/components/layout/TreeEditingLayoutSidebar.tsx @@ -23,7 +23,7 @@ const SidebarCard = styled(Card)` flex-direction: column; ` -const SidebarStack = styled(motion(Stack))` +const SidebarStack = styled(motion.create(Stack))` overflow-x: hidden; ` diff --git a/packages/sanity/src/core/hooks/index.ts b/packages/sanity/src/core/hooks/index.ts index 2632e9e0d00..f519f320d2e 100644 --- a/packages/sanity/src/core/hooks/index.ts +++ b/packages/sanity/src/core/hooks/index.ts @@ -11,6 +11,7 @@ export * from './useGlobalCopyPasteElementHandler' export * from './useListFormat' export * from './useNumberFormat' export * from './useProjectId' +export {type DocumentField, useReferringDocuments} from './useReferringDocuments' export * from './useRelativeTime' export * from './useSchema' export * from './useSyncState' diff --git a/packages/sanity/src/core/hooks/useGlobalCopyPasteElementHandler.ts b/packages/sanity/src/core/hooks/useGlobalCopyPasteElementHandler.ts index a9c5d0e4ca1..2793d842f49 100644 --- a/packages/sanity/src/core/hooks/useGlobalCopyPasteElementHandler.ts +++ b/packages/sanity/src/core/hooks/useGlobalCopyPasteElementHandler.ts @@ -1,7 +1,8 @@ import {type Path} from '@sanity/types' import {isHotkey} from 'is-hotkey-esm' -import {useCallback, useEffect, useRef} from 'react' +import {useEffect} from 'react' import {type FormDocumentValue} from 'sanity' +import {useEffectEvent} from 'use-effect-event' import {isFileTargetElement} from '../form/inputs/common/fileTarget/fileTarget' import {useCopyPaste} from '../studio/copyPaste' @@ -23,55 +24,44 @@ export function useGlobalCopyPasteElementHandler({ element, focusPath, }: GlobalCopyPasteElementHandler): void { - const focusPathRef = useRef<Path>(focusPath || []) - const valueRef = useRef(value) - valueRef.current = value - - useEffect(() => { - focusPathRef.current = focusPath || [] - }, [focusPath]) - const {onCopy, onPaste} = useCopyPaste() - const handleKeydown = useCallback( - (event: KeyboardEvent) => { - const targetElement = event.target - - if (isCopyHotKey(event)) { - // We will skip handling this event if you have focus on an native editable element - if ( - isNativeEditableElement(targetElement as HTMLElement) || - hasSelection() || - isEmptyFocusPath(focusPathRef.current) - ) { - return - } + const handleKeydown = useEffectEvent((event: KeyboardEvent) => { + const targetElement = event.target - event.preventDefault() - event.stopPropagation() - onCopy(focusPathRef.current, valueRef.current, { - context: {source: 'keyboardShortcut'}, - }) + if (isCopyHotKey(event)) { + // We will skip handling this event if you have focus on an native editable element + if ( + isNativeEditableElement(targetElement as HTMLElement) || + hasSelection() || + isEmptyFocusPath(focusPath!) + ) { + return } - if (isPasteHotKey(event)) { - if ( - isNativeEditableElement(targetElement as HTMLElement) || - isEmptyFocusPath(focusPathRef.current) || - isFileTargetElement(targetElement as HTMLElement) - ) { - return - } + event.preventDefault() + event.stopPropagation() + onCopy(focusPath!, value, { + context: {source: 'keyboardShortcut'}, + }) + } - event.stopPropagation() - event.preventDefault() - onPaste(focusPathRef.current, valueRef.current, { - context: {source: 'keyboardShortcut'}, - }) + if (isPasteHotKey(event)) { + if ( + isNativeEditableElement(targetElement as HTMLElement) || + isEmptyFocusPath(focusPath!) || + isFileTargetElement(targetElement as HTMLElement) + ) { + return } - }, - [onCopy, onPaste], - ) + + event.stopPropagation() + event.preventDefault() + onPaste(focusPath!, value, { + context: {source: 'keyboardShortcut'}, + }) + } + }) useEffect(() => { element?.addEventListener('keydown', handleKeydown) diff --git a/packages/sanity/src/core/hooks/useReferringDocuments.ts b/packages/sanity/src/core/hooks/useReferringDocuments.ts index 42fd48b9eb2..bf89292e9a5 100644 --- a/packages/sanity/src/core/hooks/useReferringDocuments.ts +++ b/packages/sanity/src/core/hooks/useReferringDocuments.ts @@ -5,37 +5,75 @@ import {map, startWith} from 'rxjs/operators' import {useDocumentStore} from '../store' -interface ReferringDocumentsState { +interface ReferringDocumentsState<Doc> { isLoading: boolean - referringDocuments: SanityDocument[] + referringDocuments: Doc[] } +/** @beta */ +export type DocumentField = Exclude<keyof SanityDocument, number> -const INITIAL_STATE: ReferringDocumentsState = {referringDocuments: [], isLoading: true} +const INITIAL_STATE: ReferringDocumentsState<never> = {referringDocuments: [], isLoading: true} +const DEFAULT_FIELDS: DocumentField[] = ['_id', '_type'] /** - * @internal - * @param id - the id to search for referring documents for + * @beta + * Subscribe to a live-updating list document referring to the document of the passed ID + * A new list of document will be emitted every time a document refers or no longer refers to the document of the given ID + * + * ## Gotcha + * The returned list of referring documents is not extensive, will only return the 101 first documents. + * + * ## Gotcha + * For every component that calls this hook, a new listener connection will be made to the backed. + * + * Make sure call this hook sparingly + * @param id - id of document to search for referring documents for + * @param fields - which fields to return for each document (defaults to _id and _type). Pass an empty array to return full documents */ -export function useReferringDocuments(id: string): ReferringDocumentsState { +export function useReferringDocuments<DocumentType extends SanityDocument>( + id: string, + fields: DocumentField[] = DEFAULT_FIELDS, +) { const documentStore = useDocumentStore() + + const projection = useMemo(() => { + return fields.length === 0 ? '' : fields.join(',') + }, [fields]) + const observable = useMemo( () => documentStore .listenQuery( - '*[references($docId)] [0...101]', + `*[references($docId)] [0...101]${projection}`, {docId: id}, {tag: 'use-referring-documents'}, ) .pipe( map( - (docs: SanityDocument[]): ReferringDocumentsState => ({ + (docs: DocumentType[]): ReferringDocumentsState<DocumentType> => ({ referringDocuments: docs, isLoading: false, }), ), startWith(INITIAL_STATE), ), - [documentStore, id], + [documentStore, id, projection], ) return useObservable(observable, INITIAL_STATE) } + +const EMPTY_FIELDS: never[] = [] +/** + * Kept for backwards compat + * - useReferringDocuments(id) will select `{_id, _type}` from returned documents, + * - while this hook will return full documents + * + * Internal callers of this hook should migrate over to useReferringDocuments + * @deprecated - replaced by useReferringDocuments(id) but kept for backwards compatibility + * @internal + * @param id - id of document to search for referring documents for + */ +// eslint-disable-next-line camelcase +export function useLegacyReferringDocuments(id: string): ReferringDocumentsState<SanityDocument> { + return useReferringDocuments(id, EMPTY_FIELDS) +} diff --git a/packages/sanity/src/core/hooks/useRelativeTime.ts b/packages/sanity/src/core/hooks/useRelativeTime.ts index 796b6e3e27f..86f175d092c 100644 --- a/packages/sanity/src/core/hooks/useRelativeTime.ts +++ b/packages/sanity/src/core/hooks/useRelativeTime.ts @@ -48,16 +48,22 @@ export interface RelativeTimeOptions { /** @internal */ export function useRelativeTime(time: Date | string, options: RelativeTimeOptions = {}): string { - const resolved = useFormatRelativeTime(time, options) - - const [, forceUpdate] = useReducer((x) => x + 1, 0) + const [now, updateNow] = useReducer( + // We don't care about the action input, every update should use the current time as the new state + () => Date.now(), + // Since we use the third argument of `useReducer`, this `null` doesn't end up anywhere + null, + // By using the lazy init we ensure that `Date.now()` is only called once during init, and then only when `updateNow` is called, instead of on every render + () => Date.now(), + ) + const resolved = useFormatRelativeTime(time, options.relativeTo || now, options) useEffect(() => { let timerId: number | null function tick(interval: number) { timerId = window.setTimeout(() => { - forceUpdate() + updateNow() // avoid pile-up of setInterval callbacks, // e.g. schedule the next update at `refreshInterval` *after* the previous one finishes timerId = window.setTimeout(() => tick(interval), interval) @@ -73,12 +79,16 @@ export function useRelativeTime(time: Date | string, options: RelativeTimeOption clearTimeout(timerId) } } - }, [forceUpdate, resolved.refreshInterval]) + }, [resolved.refreshInterval]) return resolved.timestamp } -function useFormatRelativeTime(date: Date | string, opts: RelativeTimeOptions = {}): TimeSpec { +function useFormatRelativeTime( + date: Date | string, + now: Date | number, + opts: Omit<RelativeTimeOptions, 'relativeTo'> = {}, +): TimeSpec { const {t} = useTranslation() const currentLocale = useCurrentLocale().id @@ -119,12 +129,11 @@ function useFormatRelativeTime(date: Date | string, opts: RelativeTimeOptions = } } - const now = opts.relativeTo || Date.now() const diffMonths = differenceInMonths(now, parsedDate) const diffYears = differenceInYears(now, parsedDate) if (diffMonths || diffYears) { - if (opts.minimal && diffYears === 0) { + if (minimal && diffYears === 0) { // same year return { timestamp: intlCache @@ -134,7 +143,7 @@ function useFormatRelativeTime(date: Date | string, opts: RelativeTimeOptions = } } - if (opts.minimal) { + if (minimal) { return { timestamp: intlCache .dateTimeFormat(currentLocale, {...DATE_ONLY_FORMAT, timeZone}) diff --git a/packages/sanity/src/core/i18n/Translate.tsx b/packages/sanity/src/core/i18n/Translate.tsx index a35d9f27fd3..218d312f32e 100644 --- a/packages/sanity/src/core/i18n/Translate.tsx +++ b/packages/sanity/src/core/i18n/Translate.tsx @@ -1,5 +1,5 @@ import {type TFunction} from 'i18next' -import {type ComponentType, createElement, type ReactNode, useMemo} from 'react' +import {type ComponentType, type ReactNode, useMemo} from 'react' import {useListFormat} from '../hooks/useListFormat' import {type CloseTagToken, simpleParser, type TextToken, type Token} from './simpleParser' @@ -182,14 +182,10 @@ function render( const children = tail.slice(0, nextCloseIdx) as TextToken[] const remaining = tail.slice(nextCloseIdx + 1) - return Component ? ( - <> - <Component>{render(children, values, componentMap, formatters)}</Component> - {render(remaining, values, componentMap, formatters)} - </> - ) : ( + const As = Component ? Component : head.name + return ( <> - {createElement(head.name, {}, render(children, values, componentMap, formatters))} + <As>{render(children, values, componentMap, formatters)}</As> {render(remaining, values, componentMap, formatters)} </> ) diff --git a/packages/sanity/src/core/presence/overlay/RegionsWithIntersections.tsx b/packages/sanity/src/core/presence/overlay/RegionsWithIntersections.tsx index 13d4310e452..df84877b637 100644 --- a/packages/sanity/src/core/presence/overlay/RegionsWithIntersections.tsx +++ b/packages/sanity/src/core/presence/overlay/RegionsWithIntersections.tsx @@ -3,11 +3,13 @@ import { forwardRef, type ReactNode, useCallback, + useLayoutEffect, useMemo, useRef, useState, } from 'react' +import {resizeObserver} from '../../util/resizeObserver' import { DEBUG, INTERSECTION_ELEMENT_PADDING, @@ -86,6 +88,17 @@ export const RegionsWithIntersections = forwardRef(function RegionsWithIntersect setIntersections((current) => ({...current, [id]: entry})) }, []) + const [overlayWidth, setOverlayWidth] = useState(0) + useLayoutEffect(() => { + if (!overlayRef.current) return undefined + + setOverlayWidth(overlayRef.current.offsetWidth) + + return resizeObserver.observe(overlayRef.current, (event) => { + setOverlayWidth(event.contentRect.width) + }) + }, []) + const top = intersections['::top'] const bottom = intersections['::bottom'] const regionsWithIntersectionDetails: RegionWithIntersectionDetails[] = useMemo( @@ -154,8 +167,7 @@ export const RegionsWithIntersections = forwardRef(function RegionsWithIntersect /> <div>{children}</div> <OverlayWrapper ref={overlayRef}> - {overlayRef.current && - render(regionsWithIntersectionDetails, overlayRef.current.offsetWidth)} + {overlayWidth && render(regionsWithIntersectionDetails, overlayWidth)} </OverlayWrapper> {regions.map((region) => { const forceWidth = region.rect.width === 0 diff --git a/packages/sanity/src/core/preview/components/PreviewLoader.tsx b/packages/sanity/src/core/preview/components/PreviewLoader.tsx index 42145d6bc30..e4689fa83c0 100644 --- a/packages/sanity/src/core/preview/components/PreviewLoader.tsx +++ b/packages/sanity/src/core/preview/components/PreviewLoader.tsx @@ -1,11 +1,4 @@ -import { - type ComponentType, - createElement, - type CSSProperties, - type ReactElement, - useMemo, - useState, -} from 'react' +import {type ComponentType, type CSSProperties, type ReactElement, useMemo, useState} from 'react' import {type PreviewProps} from '../../components' import {type RenderPreviewCallbackProps} from '../../form' @@ -31,7 +24,7 @@ export function PreviewLoader( const { layout, value, - component, + component: Component, style: styleProp, schemaType, skipVisibilityCheck, @@ -87,15 +80,15 @@ export function PreviewLoader( return ( <div ref={setElement} style={style}> - {createElement(component, { - ...restProps, - ...(preview?.value || {}), - media, - error: preview?.error, - isPlaceholder: preview?.isLoading, - layout, - schemaType, - })} + <Component + {...restProps} + {...(preview?.value || {})} + media={media} + error={preview?.error} + isPlaceholder={preview?.isLoading} + layout={layout} + schemaType={schemaType} + /> </div> ) } diff --git a/packages/sanity/src/core/preview/components/SanityDefaultPreview.tsx b/packages/sanity/src/core/preview/components/SanityDefaultPreview.tsx index 94b325d9135..fede5fcce5c 100644 --- a/packages/sanity/src/core/preview/components/SanityDefaultPreview.tsx +++ b/packages/sanity/src/core/preview/components/SanityDefaultPreview.tsx @@ -5,9 +5,9 @@ import {type SanityImageSource} from '@sanity/image-url/lib/types/types' import {type ImageUrlFitMode} from '@sanity/types' import { type ComponentType, - createElement, type ElementType, isValidElement, + memo, type ReactElement, type ReactNode, useCallback, @@ -37,8 +37,10 @@ export interface SanityDefaultPreviewProps extends Omit<PreviewProps, 'renderDef * Used in cases where no custom preview component is provided * @internal * */ -export function SanityDefaultPreview(props: SanityDefaultPreviewProps): ReactElement { - const {icon, layout, media: mediaProp, imageUrl, title, tooltip, ...restProps} = props +export const SanityDefaultPreview = memo(function SanityDefaultPreview( + props: SanityDefaultPreviewProps, +): ReactElement { + const {icon: Icon, layout, media: mediaProp, imageUrl, title, tooltip, ...restProps} = props const client = useClient(DEFAULT_STUDIO_CLIENT_OPTIONS) const imageBuilder = useMemo(() => imageUrlBuilder(client), [client]) @@ -50,6 +52,8 @@ export function SanityDefaultPreview(props: SanityDefaultPreviewProps): ReactEle dimensions: {width?: number; height?: number; fit: ImageUrlFitMode; dpr?: number} }) => { const {dimensions} = options + const width = dimensions.width || 100 + const height = dimensions.height || 100 // Handle sanity image return ( @@ -61,8 +65,8 @@ export function SanityDefaultPreview(props: SanityDefaultPreviewProps): ReactEle .image( mediaProp as SanityImageSource /*will only enter this code path if it's compatible*/, ) - .width(dimensions.width || 100) - .height(dimensions.height || 100) + .width(width) + .height(height) .fit(dimensions.fit) .dpr(dimensions.dpr || 1) .url() || '' @@ -74,11 +78,11 @@ export function SanityDefaultPreview(props: SanityDefaultPreviewProps): ReactEle ) const renderIcon = useCallback(() => { - return createElement(icon || FallbackIcon) - }, [icon]) + return Icon ? <Icon /> : <FallbackIcon /> + }, [Icon]) const media = useMemo(() => { - if (icon === false) { + if (Icon === false) { // Explicitly disabled return false } @@ -108,7 +112,7 @@ export function SanityDefaultPreview(props: SanityDefaultPreviewProps): ReactEle // Render fallback icon return renderIcon - }, [icon, imageUrl, mediaProp, renderIcon, renderMedia, title]) + }, [Icon, imageUrl, mediaProp, renderIcon, renderMedia, title]) const previewProps: Omit<PreviewProps, 'renderDefault'> = useMemo( () => ({ @@ -120,12 +124,11 @@ export function SanityDefaultPreview(props: SanityDefaultPreviewProps): ReactEle [media, restProps, title], ) - const layoutComponent = _previewComponents[layout || 'default'] + const LayoutComponent = _previewComponents[layout || 'default'] as ComponentType< + Omit<PreviewProps, 'renderDefault'> + > - const children = createElement( - layoutComponent as ComponentType<Omit<PreviewProps, 'renderDefault'>>, - previewProps, - ) + const children = <LayoutComponent {...previewProps} /> if (tooltip) { return ( @@ -142,4 +145,5 @@ export function SanityDefaultPreview(props: SanityDefaultPreviewProps): ReactEle } return children -} +}) +SanityDefaultPreview.displayName = 'Memo(SanityDefaultPreview)' diff --git a/packages/sanity/src/core/preview/observeFields.ts b/packages/sanity/src/core/preview/observeFields.ts index 95cf5500d9c..905a138446f 100644 --- a/packages/sanity/src/core/preview/observeFields.ts +++ b/packages/sanity/src/core/preview/observeFields.ts @@ -7,7 +7,7 @@ import { fromEvent, merge, type Observable, - of as observableOf, + of, timer, } from 'rxjs' import { @@ -100,20 +100,20 @@ export function createObserveFields(options: { return listen(id).pipe( switchMap((event) => { if (event.type === 'connected' || event.visibility === 'query') { - return fetchDocumentPathsFast(id, fields as any).pipe( + return fetchDocumentPathsFast(id, fields).pipe( mergeMap((result) => { return concat( - observableOf(result), - result === undefined // hack: if we get undefined as result here it can be because the document has + of(result), + result === null // hack: if we get undefined as result here it can be because the document has ? // just been created and is not yet indexed. We therefore need to wait a bit // and then re-fetch. - fetchDocumentPathsSlow(id, fields as any) + fetchDocumentPathsSlow(id, fields) : [], ) }), ) } - return fetchDocumentPathsSlow(id, fields as any) + return fetchDocumentPathsSlow(id, fields) }), ) } @@ -157,7 +157,7 @@ export function createObserveFields(options: { // Note: `undefined` means the memo has not been set, while `null` means the memo is explicitly set to null (e.g. we did fetch, but got null back) let latest: T | undefined | null = undefined const changes$ = merge( - defer(() => (latest === undefined ? EMPTY : observableOf(latest))), + defer(() => (latest === undefined ? EMPTY : of(latest))), (apiConfig ? (crossDatasetListenFields(id, fields, apiConfig) as any) : currentDatasetListenFields(id, fields)) as Observable<T>, diff --git a/packages/sanity/src/core/scheduledPublishing/hooks/useTimeZone.tsx b/packages/sanity/src/core/scheduledPublishing/hooks/useTimeZone.tsx index e321aba0f48..115f972ab95 100644 --- a/packages/sanity/src/core/scheduledPublishing/hooks/useTimeZone.tsx +++ b/packages/sanity/src/core/scheduledPublishing/hooks/useTimeZone.tsx @@ -1,7 +1,7 @@ import {useToast} from '@sanity/ui' import {getTimeZones} from '@vvo/tzdb' import {formatInTimeZone, utcToZonedTime, zonedTimeToUtc} from 'date-fns-tz' -import {useCallback, useEffect, useMemo, useState} from 'react' +import {useCallback, useEffect, useState} from 'react' import ToastDescription from '../components/toastDescription/ToastDescription' import {DATE_FORMAT, LOCAL_STORAGE_TZ_KEY} from '../constants' @@ -55,8 +55,7 @@ function getStoredTimeZone(): NormalizedTimeZone { } const useTimeZone = () => { - const initialTimeZone = useMemo(() => getStoredTimeZone(), []) - const [timeZone, setTimeZone] = useState<NormalizedTimeZone>(initialTimeZone) + const [timeZone, setTimeZone] = useState<NormalizedTimeZone>(() => getStoredTimeZone()) const toast = useToast() useEffect(() => { diff --git a/packages/sanity/src/core/scheduledPublishing/plugin/index.ts b/packages/sanity/src/core/scheduledPublishing/plugin/index.ts index 41e5ea053ec..769a636fe51 100644 --- a/packages/sanity/src/core/scheduledPublishing/plugin/index.ts +++ b/packages/sanity/src/core/scheduledPublishing/plugin/index.ts @@ -50,6 +50,7 @@ export const scheduledPublishing = definePlugin({ icon: CalendarIcon, component: Tool, router: route.create('/', [route.create('/state/:state'), route.create('/date/:date')]), + __internalApplicationType: 'sanity/scheduled-publishing', }, ] }, diff --git a/packages/sanity/src/core/store/_legacy/ResourceCacheProvider.tsx b/packages/sanity/src/core/store/_legacy/ResourceCacheProvider.tsx index c6b28cb9c7d..234feb7096f 100644 --- a/packages/sanity/src/core/store/_legacy/ResourceCacheProvider.tsx +++ b/packages/sanity/src/core/store/_legacy/ResourceCacheProvider.tsx @@ -1,4 +1,4 @@ -import {type ReactNode, useContext, useMemo} from 'react' +import {type ReactNode, useContext, useState} from 'react' import {ResourceCacheContext} from 'sanity/_singletons' import {createMultiKeyWeakMap, type MultiKeyWeakMap} from './createMultiKeyWeakMap' @@ -16,7 +16,7 @@ export interface ResourceCacheProviderProps { /** @internal */ export function ResourceCacheProvider({children}: ResourceCacheProviderProps) { - const resourceCache = useMemo((): ResourceCache => { + const [resourceCache] = useState((): ResourceCache => { const namespaces = new Map<string, MultiKeyWeakMap>() // this is used to replace the `null` values in any `dependencies` so that @@ -41,7 +41,7 @@ export function ResourceCacheProvider({children}: ResourceCacheProviderProps) { namespaceMap.set(dependenciesWithoutNull, value) }, } - }, []) + }) return ( <ResourceCacheContext.Provider value={resourceCache}>{children}</ResourceCacheContext.Provider> diff --git a/packages/sanity/src/core/store/_legacy/datastores.ts b/packages/sanity/src/core/store/_legacy/datastores.ts index f69be4ae70d..ad930c2412b 100644 --- a/packages/sanity/src/core/store/_legacy/datastores.ts +++ b/packages/sanity/src/core/store/_legacy/datastores.ts @@ -20,7 +20,7 @@ import {fetchFeatureToggle} from './document/document-pair/utils/fetchFeatureTog import {type OutOfSyncError} from './document/utils/sequentializeListenerEvents' import {createGrantsStore, type GrantsStore} from './grants' import {createHistoryStore, type HistoryStore} from './history' -import {__tmp_wrap_presenceStore, type PresenceStore} from './presence/presence-store' +import {createPresenceStore, type PresenceStore} from './presence/presence-store' import {createProjectStore, type ProjectStore} from './project' import {useResourceCache} from './ResourceCacheProvider' import {createUserStore, type UserStore} from './user' @@ -231,7 +231,7 @@ export function usePresenceStore(): PresenceStore { resourceCache.get<PresenceStore>({ namespace: 'presenceStore', dependencies: [bifur, connectionStatusStore, userStore], - }) || __tmp_wrap_presenceStore({bifur, connectionStatusStore, userStore}) + }) || createPresenceStore({bifur, connectionStatusStore, userStore}) resourceCache.set({ namespace: 'presenceStore', diff --git a/packages/sanity/src/core/store/_legacy/grants/templatePermissions.ts b/packages/sanity/src/core/store/_legacy/grants/templatePermissions.ts index 77cfd4f2812..7672348019b 100644 --- a/packages/sanity/src/core/store/_legacy/grants/templatePermissions.ts +++ b/packages/sanity/src/core/store/_legacy/grants/templatePermissions.ts @@ -1,4 +1,5 @@ import {type InitialValueResolverContext, type Schema} from '@sanity/types' +import {useMemo} from 'react' import {combineLatest, defer, from, type Observable, of} from 'rxjs' import {concatMap, map, switchMap, toArray} from 'rxjs/operators' @@ -162,11 +163,25 @@ export function useTemplatePermissions({ const grantsStore = useGrantsStore() const initialValueContext = useInitialValueResolverContext() - return useTemplatePermissionsFromHookFactory({ - templateItems, - grantsStore: rest.grantsStore || grantsStore, - schema: rest.schema || schema, - templates: rest.templates || templates, - context: initialValueContext, - }) + return useTemplatePermissionsFromHookFactory( + useMemo( + () => ({ + templateItems, + grantsStore: rest.grantsStore || grantsStore, + schema: rest.schema || schema, + templates: rest.templates || templates, + context: initialValueContext, + }), + [ + grantsStore, + initialValueContext, + rest.grantsStore, + rest.schema, + rest.templates, + schema, + templateItems, + templates, + ], + ), + ) } diff --git a/packages/sanity/src/core/store/_legacy/presence/presence-store.ts b/packages/sanity/src/core/store/_legacy/presence/presence-store.ts index ab1e2de08f2..24eb2abca43 100644 --- a/packages/sanity/src/core/store/_legacy/presence/presence-store.ts +++ b/packages/sanity/src/core/store/_legacy/presence/presence-store.ts @@ -114,7 +114,7 @@ function setSessionId(id: string) { export const SESSION_ID = getSessionId() || setSessionId(generate()) /** @internal */ -export function __tmp_wrap_presenceStore(context: { +export function createPresenceStore(context: { bifur: BifurClient connectionStatusStore: ConnectionStatusStore userStore: UserStore diff --git a/packages/sanity/src/core/store/_legacy/presence/useDocumentPresence.tsx b/packages/sanity/src/core/store/_legacy/presence/useDocumentPresence.tsx index 26a74f56b75..d7b04588d06 100644 --- a/packages/sanity/src/core/store/_legacy/presence/useDocumentPresence.tsx +++ b/packages/sanity/src/core/store/_legacy/presence/useDocumentPresence.tsx @@ -1,19 +1,19 @@ -import {useEffect, useState} from 'react' +import {startTransition, useEffect, useReducer} from 'react' +import {useObservable} from 'react-rx' +import {of} from 'rxjs' import {usePresenceStore} from '../datastores' import {type DocumentPresence} from './types' +const initial: DocumentPresence[] = [] +const fallback = of(initial) + /** @internal */ export function useDocumentPresence(documentId: string): DocumentPresence[] { - const presenceStore = usePresenceStore() - const [presence, setPresence] = useState<DocumentPresence[]>([]) + const [mounted, mount] = useReducer(() => true, false) + // Using `startTransition` here ensures that rapid re-renders that affect the deps used by `usePresenceStore` delay the transition to `mounted=true`, thus avoiding creating websocket connections that will be closed immediately. + useEffect(() => startTransition(mount), []) - useEffect(() => { - const subscription = presenceStore.documentPresence(documentId).subscribe(setPresence) - return () => { - subscription.unsubscribe() - } - }, [documentId, presenceStore]) - - return presence + const presenceStore = usePresenceStore() + return useObservable(mounted ? presenceStore.documentPresence(documentId) : fallback, initial) } diff --git a/packages/sanity/src/core/store/_legacy/presence/useGlobalPresence.tsx b/packages/sanity/src/core/store/_legacy/presence/useGlobalPresence.tsx index 928976cfaab..694f7a565d0 100644 --- a/packages/sanity/src/core/store/_legacy/presence/useGlobalPresence.tsx +++ b/packages/sanity/src/core/store/_legacy/presence/useGlobalPresence.tsx @@ -1,20 +1,19 @@ -import {useEffect, useState} from 'react' +import {startTransition, useEffect, useReducer} from 'react' +import {useObservable} from 'react-rx' +import {of} from 'rxjs' import {usePresenceStore} from '../datastores' import {type GlobalPresence} from './types' +const initial: GlobalPresence[] = [] +const fallback = of(initial) + /** @internal */ export function useGlobalPresence(): GlobalPresence[] { - const [presence, setPresence] = useState<GlobalPresence[]>([]) - const presenceStore = usePresenceStore() - - useEffect(() => { - const subscription = presenceStore.globalPresence$.subscribe(setPresence) + const [mounted, mount] = useReducer(() => true, false) + // Using `startTransition` here ensures that rapid re-renders that affect the deps used by `usePresenceStore` delay the transition to `mounted=true`, thus avoiding creating websocket connections that will be closed immediately. + useEffect(() => startTransition(mount), []) - return () => { - subscription.unsubscribe() - } - }, [presenceStore]) - - return presence + const presenceStore = usePresenceStore() + return useObservable(mounted ? presenceStore.globalPresence$ : fallback, initial) } diff --git a/packages/sanity/src/core/studio/colorScheme.tsx b/packages/sanity/src/core/studio/colorScheme.tsx index c9ebcef0b37..c37fd87902d 100644 --- a/packages/sanity/src/core/studio/colorScheme.tsx +++ b/packages/sanity/src/core/studio/colorScheme.tsx @@ -12,6 +12,7 @@ import {ColorSchemeSetValueContext, ColorSchemeValueContext} from 'sanity/_singl import {type TFunction} from '../i18n' import {type StudioThemeColorSchemeKey} from '../theme/types' +import {getSnapshot, setSnapshot, subscribe} from './colorSchemeStore' /** @internal */ function useSystemScheme(): ThemeColorSchemeKey { @@ -78,33 +79,13 @@ export function ColorSchemeLocalStorageProvider({ children, onSchemeChange, }: Pick<ColorSchemeProviderProps, 'children' | 'onSchemeChange'>) { - const store = useMemo(() => { - let snapshot: StudioThemeColorSchemeKey - const subscribers = new Set<() => void>() - - return { - subscribe: (onStoreChange: () => void) => { - if (!snapshot) { - snapshot = getScheme(localStorage.getItem(LOCAL_STORAGE_KEY)) || 'system' - } - subscribers.add(onStoreChange) - return () => { - subscribers.delete(onStoreChange) - } - }, - getSnapshot: () => snapshot, - setSnapshot: (nextScheme: StudioThemeColorSchemeKey) => { - snapshot = getScheme(nextScheme) - for (const subscription of subscribers) { - subscription() - } - }, - // Only called during server-side rendering, and hydration if using hydrateRoot - // https://beta.reactjs.org/apis/react/useSyncExternalStore#adding-support-for-server-rendering - getServerSnapshot: () => 'system', - } - }, []) - const scheme = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getServerSnapshot) + const scheme = useSyncExternalStore<StudioThemeColorSchemeKey>( + subscribe, + getSnapshot, + // Only called during server-side rendering, and hydration if using hydrateRoot + // https://beta.reactjs.org/apis/react/useSyncExternalStore#adding-support-for-server-rendering + () => 'system', + ) useEffect(() => { if (typeof onSchemeChange === 'function') { @@ -114,7 +95,7 @@ export function ColorSchemeLocalStorageProvider({ }, [onSchemeChange, scheme]) return ( - <ColorSchemeSetValueContext.Provider value={store.setSnapshot}> + <ColorSchemeSetValueContext.Provider value={setSnapshot}> <ColorSchemeValueContext.Provider value={scheme}> <ColorThemeProvider scheme={scheme}>{children}</ColorThemeProvider> </ColorSchemeValueContext.Provider> @@ -122,16 +103,6 @@ export function ColorSchemeLocalStorageProvider({ ) } -function getScheme(scheme: unknown): StudioThemeColorSchemeKey { - switch (scheme) { - case 'dark': - case 'light': - return scheme - default: - return 'system' - } -} - /** * If the `scheme` prop is provided we don't need to setup any logic to handle localStorage * @internal @@ -210,7 +181,7 @@ export function useColorSchemeOptions( ) { const scheme = useColorSchemeInternalValue() - return useMemo(() => { + return useMemo<ColorSchemeOption[]>(() => { return [ { title: t('user-menu.color-scheme.system-title'), @@ -236,6 +207,6 @@ export function useColorSchemeOptions( onSelect: () => setScheme('light'), icon: SunIcon, }, - ] satisfies ColorSchemeOption[] + ] }, [scheme, setScheme, t]) } diff --git a/packages/sanity/src/core/studio/colorSchemeStore.ts b/packages/sanity/src/core/studio/colorSchemeStore.ts new file mode 100644 index 00000000000..e3e56cf4514 --- /dev/null +++ b/packages/sanity/src/core/studio/colorSchemeStore.ts @@ -0,0 +1,39 @@ +import {type StudioThemeColorSchemeKey} from '../theme/types' + +function getScheme(scheme: unknown): StudioThemeColorSchemeKey { + switch (scheme) { + case 'dark': + case 'light': + return scheme + default: + return 'system' + } +} + +/** @internal */ +export const LOCAL_STORAGE_KEY = 'sanityStudio:ui:colorScheme' + +let snapshot: StudioThemeColorSchemeKey +const subscribers = new Set<() => void>() + +/** @internal */ +export const subscribe = (onStoreChange: () => void) => { + if (!snapshot) { + snapshot = getScheme(localStorage.getItem(LOCAL_STORAGE_KEY)) || 'system' + } + subscribers.add(onStoreChange) + return (): void => { + subscribers.delete(onStoreChange) + } +} +/** @internal */ +export function getSnapshot(): StudioThemeColorSchemeKey { + return snapshot +} +/** @internal */ +export function setSnapshot(nextScheme: StudioThemeColorSchemeKey): void { + snapshot = getScheme(nextScheme) + for (const subscription of subscribers) { + subscription() + } +} diff --git a/packages/sanity/src/core/studio/components/navbar/StudioActiveToolLayout.tsx b/packages/sanity/src/core/studio/components/navbar/StudioActiveToolLayout.tsx index ec2e6421e08..83431a425ac 100644 --- a/packages/sanity/src/core/studio/components/navbar/StudioActiveToolLayout.tsx +++ b/packages/sanity/src/core/studio/components/navbar/StudioActiveToolLayout.tsx @@ -1,5 +1,3 @@ -import {createElement} from 'react' - import {type Tool} from '../../../config' interface StudioActiveToolLayoutProps { @@ -8,5 +6,6 @@ interface StudioActiveToolLayoutProps { export function StudioActiveToolLayout(props: StudioActiveToolLayoutProps) { const {activeTool} = props - return createElement(activeTool.component, {tool: activeTool}) + const Component = activeTool.component + return <Component tool={activeTool} /> } diff --git a/packages/sanity/src/core/studio/components/navbar/navDrawer/NavDrawer.tsx b/packages/sanity/src/core/studio/components/navbar/navDrawer/NavDrawer.tsx index bdaaea1e8e2..3acd47846d6 100644 --- a/packages/sanity/src/core/studio/components/navbar/navDrawer/NavDrawer.tsx +++ b/packages/sanity/src/core/studio/components/navbar/navDrawer/NavDrawer.tsx @@ -53,7 +53,7 @@ const Root = styled(Layer)` height: 100%; ` -const BackdropMotion = styled(motion(Card))` +const BackdropMotion = styled(motion.create(Card))` position: absolute; top: 0; left: 0; @@ -62,7 +62,7 @@ const BackdropMotion = styled(motion(Card))` background: var(--card-shadow-penumbra-color); ` -const InnerCardMotion = styled(motion(Card))` +const InnerCardMotion = styled(motion.create(Card))` position: relative; pointer-events: all; flex-direction: column; diff --git a/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenu.tsx b/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenu.tsx index 195934f3c62..053df58f28a 100644 --- a/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenu.tsx +++ b/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenu.tsx @@ -85,7 +85,8 @@ export function PresenceMenu() { focused={focusedId === item.user.id} key={item.user.id} onFocus={handleItemFocus} - presence={item} + locations={item.locations} + user={item.user} /> ))} diff --git a/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenuItem.tsx b/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenuItem.tsx index 60828024ad8..dd11e19eb3f 100644 --- a/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenuItem.tsx +++ b/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenuItem.tsx @@ -1,6 +1,6 @@ import * as PathUtils from '@sanity/util/paths' import {orderBy} from 'lodash' -import {type ForwardedRef, forwardRef, memo, useCallback, useEffect, useMemo, useState} from 'react' +import {memo, useCallback, useEffect, useState} from 'react' import {IntentLink} from 'sanity/router' import {MenuItem} from '../../../../../ui-components' @@ -11,19 +11,15 @@ import {type GlobalPresence} from '../../../../store' interface PresenceListRowProps { focused: boolean onFocus: (id: string) => void - presence: GlobalPresence + locations: GlobalPresence['locations'] + user: GlobalPresence['user'] } export const PresenceMenuItem = memo(function PresenceMenuItem(props: PresenceListRowProps) { - const {presence, focused, onFocus} = props + const {locations, user, focused, onFocus} = props const [menuItemElement, setMenuItemElement] = useState<HTMLElement | null>(null) const {t} = useTranslation() - const lastActiveLocation = orderBy(presence.locations || [], ['lastActiveAt'], ['desc']).find( - (location) => location.documentId, - ) - const hasLink = Boolean(lastActiveLocation?.documentId) - /** * This is a workaround to keep focus on the selected menu item * when the list of users in the menu is updated @@ -40,42 +36,47 @@ export const PresenceMenuItem = memo(function PresenceMenuItem(props: PresenceLi }, [menuItemElement, focused]) const handleFocus = useCallback(() => { - onFocus(presence.user.id) - }, [onFocus, presence.user.id]) + onFocus(user.id) + }, [onFocus, user.id]) - const LinkComponent = useMemo( - () => - // eslint-disable-next-line @typescript-eslint/no-shadow - forwardRef(function LinkComponent(linkProps, ref: ForwardedRef<HTMLAnchorElement>) { - if (!lastActiveLocation?.path) return null - - return ( - <IntentLink - {...linkProps} - intent="edit" - params={{ - id: lastActiveLocation?.documentId, - path: PathUtils.toString(lastActiveLocation?.path), - }} - ref={ref} - /> - ) - }), - [lastActiveLocation], + const lastActiveLocation = orderBy(locations || [], ['lastActiveAt'], ['desc']).find( + (location) => location.documentId, ) + const hasLink = Boolean(lastActiveLocation?.documentId) + + if (lastActiveLocation) { + return ( + <MenuItem + as={IntentLink} + // @ts-expect-error - `intent` is valid when using `IntentLink` + intent="edit" + params={{ + id: lastActiveLocation.documentId, + path: PathUtils.toString(lastActiveLocation.path), + }} + // Shared props + data-as="a" + onFocus={handleFocus} + preview={<UserAvatar size={1} user={user} />} + ref={setMenuItemElement} + text={user.displayName} + /> + ) + } return ( <MenuItem - as={lastActiveLocation ? LinkComponent : 'div'} - data-as="a" + as="div" disabled={!hasLink} - onFocus={handleFocus} - preview={<UserAvatar key={presence.user.id} size={1} user={presence.user} />} - ref={setMenuItemElement} - text={presence.user.displayName} tooltipProps={ hasLink ? undefined : {content: t('presence.not-in-a-document'), placement: 'left'} } + // Shared props + data-as="a" + onFocus={handleFocus} + preview={<UserAvatar size={1} user={user} />} + ref={setMenuItemElement} + text={user.displayName} /> ) }) diff --git a/packages/sanity/src/core/studio/components/navbar/search/components/SearchPopover.tsx b/packages/sanity/src/core/studio/components/navbar/search/components/SearchPopover.tsx index 7f3fa2f83c9..7d7e36ca836 100644 --- a/packages/sanity/src/core/studio/components/navbar/search/components/SearchPopover.tsx +++ b/packages/sanity/src/core/studio/components/navbar/search/components/SearchPopover.tsx @@ -4,7 +4,6 @@ import {useRef, useState} from 'react' import FocusLock from 'react-focus-lock' import {styled} from 'styled-components' -import {useTranslation} from '../../../../../i18n' import {supportsTouch} from '../../../../../util' import { POPOVER_INPUT_PADDING, @@ -53,7 +52,7 @@ const OVERLAY_VARIANTS: Variants = { const Y_POSITION = 12 // vh -const MotionOverlay = styled(motion(Card))` +const MotionOverlay = styled(motion.create(Card))` background-color: var(--card-backdrop-color); bottom: 0; left: 0; @@ -62,7 +61,7 @@ const MotionOverlay = styled(motion(Card))` top: 0; ` -const SearchMotionCard = styled(motion(Card))` +const SearchMotionCard = styled(motion.create(Card))` display: flex !important; flex-direction: column; left: 50%; @@ -88,10 +87,9 @@ export function SearchPopover({ }: SearchPopoverProps) { const [inputElement, setInputElement] = useState<HTMLInputElement | null>(null) - const popoverElement = useRef<HTMLElement | null>(null) + const popoverElement = useRef<HTMLDivElement | null>(null) const {isTopLayer, zIndex} = useLayer() - const {t} = useTranslation() const { onClose: onSearchClose, diff --git a/packages/sanity/src/core/studio/components/navbar/search/components/filters/Filters.tsx b/packages/sanity/src/core/studio/components/navbar/search/components/filters/Filters.tsx index c4a4c082ee2..ee073d593bc 100644 --- a/packages/sanity/src/core/studio/components/navbar/search/components/filters/Filters.tsx +++ b/packages/sanity/src/core/studio/components/navbar/search/components/filters/Filters.tsx @@ -1,5 +1,5 @@ import {Flex} from '@sanity/ui' -import {useCallback, useEffect, useRef} from 'react' +import {useCallback, useEffect, useState} from 'react' import {Button} from '../../../../../../../ui-components' import {useTranslation} from '../../../../../../i18n' @@ -27,7 +27,7 @@ export function Filters({showTypeFilter = true}: {showTypeFilter?: boolean}) { } = useSearchState() const {t} = useTranslation() - const isMounted = useRef(false) + const [isMounted, setIsMounted] = useState(false) const handleClear = useCallback(() => { if (showTypeFilter) dispatch({type: 'TERMS_TYPES_CLEAR'}) @@ -37,7 +37,7 @@ export function Filters({showTypeFilter = true}: {showTypeFilter?: boolean}) { const clearFiltersButtonVisible = filters.length > 0 || (showTypeFilter && types.length > 0) useEffect(() => { - isMounted.current = true + setIsMounted(true) }, []) const lastAddedFilterKey = lastAddedFilter && getFilterKey(lastAddedFilter) @@ -62,7 +62,7 @@ export function Filters({showTypeFilter = true}: {showTypeFilter?: boolean}) { return ( <FilterButton filter={filter} - initialOpen={isMounted.current && lastAddedFilterKey === key} + initialOpen={isMounted && lastAddedFilterKey === key} key={key} /> ) diff --git a/packages/sanity/src/core/studio/components/navbar/search/components/filters/common/FilterIcon.tsx b/packages/sanity/src/core/studio/components/navbar/search/components/filters/common/FilterIcon.tsx index 3d2b21c02cc..49cff31b7dc 100644 --- a/packages/sanity/src/core/studio/components/navbar/search/components/filters/common/FilterIcon.tsx +++ b/packages/sanity/src/core/studio/components/navbar/search/components/filters/common/FilterIcon.tsx @@ -1,5 +1,4 @@ import {UnknownIcon} from '@sanity/icons' -import {createElement} from 'react' import {useSearchState} from '../../../contexts/search/useSearchState' import {getFilterDefinition} from '../../../definitions/filters' @@ -14,9 +13,9 @@ export function FilterIcon({filter}: FilterIconProps) { state: {definitions}, } = useSearchState() - const icon = getFilterDefinition(definitions.filters, filter.filterName)?.icon - if (icon) { - return createElement(icon) + const Icon = getFilterDefinition(definitions.filters, filter.filterName)?.icon + if (Icon) { + return <Icon /> } return <UnknownIcon /> } diff --git a/packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/inputs/date/CommonDateRange.tsx b/packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/inputs/date/CommonDateRange.tsx index 0798cdac1cb..b5c04ebe4a4 100644 --- a/packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/inputs/date/CommonDateRange.tsx +++ b/packages/sanity/src/core/studio/components/navbar/search/components/filters/filter/inputs/date/CommonDateRange.tsx @@ -1,6 +1,6 @@ import {Flex, Stack} from '@sanity/ui' import {addDays} from 'date-fns' -import {useCallback, useMemo} from 'react' +import {useCallback, useState} from 'react' import {useTranslation} from '../../../../../../../../../i18n' import {useSearchState} from '../../../../../contexts/search/useSearchState' @@ -29,8 +29,8 @@ export function CommonDateRangeInput({ * For placeholder values: Use the current date for the end date input, and an arbitrary date * in the past (e.g. -7 days from now) for the start date input. */ - const placeholderStartDate = useMemo(() => addDays(new Date(), PLACEHOLDER_START_DATE_OFFSET), []) - const placeholderEndDate = useMemo(() => new Date(), []) + const [placeholderStartDate] = useState(() => addDays(new Date(), PLACEHOLDER_START_DATE_OFFSET)) + const [placeholderEndDate] = useState(() => new Date()) const handleDatePickerChange = useCallback( ({date, endDate}: {date?: Date | null; endDate?: Date | null}) => { diff --git a/packages/sanity/src/core/studio/components/navbar/search/components/searchResults/SearchResults.tsx b/packages/sanity/src/core/studio/components/navbar/search/components/searchResults/SearchResults.tsx index 00ebc2da93d..f1500153f9f 100644 --- a/packages/sanity/src/core/studio/components/navbar/search/components/searchResults/SearchResults.tsx +++ b/packages/sanity/src/core/studio/components/navbar/search/components/searchResults/SearchResults.tsx @@ -1,5 +1,5 @@ import {Card, Flex} from '@sanity/ui' -import {useCallback} from 'react' +import {type MouseEvent, useCallback} from 'react' import {styled} from 'styled-components' import {CommandList, type CommandListRenderItemCallback} from '../../../../../../components' @@ -48,12 +48,18 @@ export function SearchResults({disableIntentLink, inputElement, onItemSelect}: S /** * Add current search to recent searches, trigger child item click and close search */ - const handleSearchResultClick = useCallback(() => { - if (recentSearchesStore) { - recentSearchesStore.addSearch(terms, filters) - } - onClose?.() - }, [filters, onClose, recentSearchesStore, terms]) + const handleSearchResultClick = useCallback( + (e: MouseEvent<HTMLElement>) => { + if (recentSearchesStore) { + recentSearchesStore.addSearch(terms, filters) + } + // We don't want to close the search if they are opening their result in a new tab + if (!e.metaKey && !e.ctrlKey) { + onClose?.() + } + }, + [filters, onClose, recentSearchesStore, terms], + ) const handleEndReached = useCallback(() => { dispatch({type: 'PAGE_INCREMENT'}) diff --git a/packages/sanity/src/core/studio/components/navbar/search/components/searchResults/item/SearchResultItem.tsx b/packages/sanity/src/core/studio/components/navbar/search/components/searchResults/item/SearchResultItem.tsx index 3ba76c2b2da..90506e4a83a 100644 --- a/packages/sanity/src/core/studio/components/navbar/search/components/searchResults/item/SearchResultItem.tsx +++ b/packages/sanity/src/core/studio/components/navbar/search/components/searchResults/item/SearchResultItem.tsx @@ -19,7 +19,7 @@ interface SearchResultItemProps extends ResponsiveMarginProps, ResponsivePadding documentId: string documentType: string layout?: GeneralPreviewLayoutKey - onClick?: () => void + onClick?: (e: MouseEvent<HTMLElement>) => void onItemSelect?: ItemSelectHandler } @@ -58,7 +58,7 @@ export function SearchResultItem({ if (!disableIntentLink) { onIntentClick(e) } - onClick?.() + onClick?.(e) }, [onItemSelect, documentId, documentType, disableIntentLink, onClick, onIntentClick], ) diff --git a/packages/sanity/src/core/studio/components/navbar/workspace/WorkspacePreview.tsx b/packages/sanity/src/core/studio/components/navbar/workspace/WorkspacePreview.tsx index 4041b7a954a..21aaae46749 100644 --- a/packages/sanity/src/core/studio/components/navbar/workspace/WorkspacePreview.tsx +++ b/packages/sanity/src/core/studio/components/navbar/workspace/WorkspacePreview.tsx @@ -1,6 +1,6 @@ import {CheckmarkIcon} from '@sanity/icons' import {Box, Flex, Stack, Text} from '@sanity/ui' -import {type ComponentType, createElement, isValidElement, type ReactNode, useMemo} from 'react' +import {type ComponentType, isValidElement, type ReactNode, useMemo} from 'react' import {isValidElementType} from 'react-is' import {styled} from 'styled-components' @@ -37,9 +37,9 @@ export const WorkspacePreviewIcon = ({ return <Media $size={size}>{iconComponent}</Media> } -const createIcon = (icon: ComponentType | ReactNode) => { - if (isValidElementType(icon)) return createElement(icon) - if (isValidElement(icon)) return icon +const createIcon = (Icon: ComponentType | ReactNode) => { + if (isValidElementType(Icon)) return <Icon /> + if (isValidElement(Icon)) return Icon return undefined } diff --git a/packages/sanity/src/core/studio/studioAnnouncements/StudioAnnouncementsDialog.tsx b/packages/sanity/src/core/studio/studioAnnouncements/StudioAnnouncementsDialog.tsx index db4da472a72..9ae088476bc 100644 --- a/packages/sanity/src/core/studio/studioAnnouncements/StudioAnnouncementsDialog.tsx +++ b/packages/sanity/src/core/studio/studioAnnouncements/StudioAnnouncementsDialog.tsx @@ -36,12 +36,13 @@ const DialogHeader = styled(Grid)` background: var(--card-bg-color); ` -const FloatingButton = styled(Button)` +const FloatingButtonBox = styled(Box)` position: absolute; top: 12px; right: 24px; z-index: 2; ` +const FloatingButton = styled(Button)`` interface AnnouncementProps { announcement: StudioAnnouncementDocument @@ -193,15 +194,17 @@ export function StudioAnnouncementsDialog({ {index < announcements.length - 1 && <Divider parentRef={dialogRef} />} </Fragment> ))} - <FloatingButton - aria-label={t('announcement.dialog.close-label')} - icon={CloseIcon} - mode="bleed" - onClick={onClose} - tooltipProps={{ - content: t('announcement.dialog.close'), - }} - /> + <FloatingButtonBox> + <FloatingButton + aria-label={t('announcement.dialog.close-label')} + icon={CloseIcon} + mode="bleed" + onClick={onClose} + tooltipProps={{ + content: t('announcement.dialog.close'), + }} + /> + </FloatingButtonBox> </Root> </Dialog> ) diff --git a/packages/sanity/src/core/tasks/components/activity/TasksActivityLog.tsx b/packages/sanity/src/core/tasks/components/activity/TasksActivityLog.tsx index 6c8198515b5..47a201db008 100644 --- a/packages/sanity/src/core/tasks/components/activity/TasksActivityLog.tsx +++ b/packages/sanity/src/core/tasks/components/activity/TasksActivityLog.tsx @@ -37,7 +37,7 @@ const VARIANTS: Variants = { visible: {opacity: 1, x: 0}, } -const MotionStack = styled(motion(Stack))`` +const MotionStack = styled(motion.create(Stack))`` interface TasksActivityLogProps { onChange: (patch: FormPatch | PatchEvent | FormPatch[]) => void diff --git a/packages/sanity/src/core/tasks/components/form/tasksFormBuilder/useTasksFormBuilder.ts b/packages/sanity/src/core/tasks/components/form/tasksFormBuilder/useTasksFormBuilder.ts index 3bef232bf03..9a5d1cc6ae9 100644 --- a/packages/sanity/src/core/tasks/components/form/tasksFormBuilder/useTasksFormBuilder.ts +++ b/packages/sanity/src/core/tasks/components/form/tasksFormBuilder/useTasksFormBuilder.ts @@ -1,5 +1,5 @@ import {type ObjectSchemaType, type Path} from '@sanity/types' -import {useCallback, useMemo, useRef, useState} from 'react' +import {useCallback, useEffect, useRef, useState} from 'react' import { createPatchChannel, @@ -83,10 +83,11 @@ export function useTasksFormBuilder(options: TasksFormBuilderOptions): TasksForm const patchRef = useRef<(event: PatchEvent) => void>(() => { throw new Error('Nope') }) - - patchRef.current = (event: PatchEvent) => { - patch.execute(toMutationPatches(event.patches), initialValue) - } + useEffect(() => { + patchRef.current = (event: PatchEvent) => { + patch.execute(toMutationPatches(event.patches), initialValue) + } + }, [initialValue, patch]) const handleChange = useCallback((event: PatchEvent) => patchRef.current(event), []) @@ -112,7 +113,7 @@ export function useTasksFormBuilder(options: TasksFormBuilderOptions): TasksForm const ready = editState.ready && connectionState === 'connected' - const patchChannel = useMemo(() => createPatchChannel(), []) + const [patchChannel] = useState(() => createPatchChannel()) if (formState === null || !ready) { return {loading: true} } diff --git a/packages/sanity/src/core/tasks/plugin/TasksStudioActiveToolLayout.tsx b/packages/sanity/src/core/tasks/plugin/TasksStudioActiveToolLayout.tsx index f4d82cad8dd..c30e2f7fa19 100644 --- a/packages/sanity/src/core/tasks/plugin/TasksStudioActiveToolLayout.tsx +++ b/packages/sanity/src/core/tasks/plugin/TasksStudioActiveToolLayout.tsx @@ -28,7 +28,7 @@ const RootFlex = styled(Flex)(({theme}) => { ` }) -const SidebarMotionLayer = styled(motion(Layer))(({theme}) => { +const SidebarMotionLayer = styled(motion.create(Layer))(({theme}) => { const media = theme.sanity.media return css` diff --git a/packages/sanity/src/core/templates/__tests__/resolve.test.ts b/packages/sanity/src/core/templates/__tests__/resolve.test.ts index 9b7efc803b9..8048507f7be 100644 --- a/packages/sanity/src/core/templates/__tests__/resolve.test.ts +++ b/packages/sanity/src/core/templates/__tests__/resolve.test.ts @@ -30,28 +30,32 @@ const mockConfigContext: InitialValueResolverContext = { } as InitialValueResolverContext describe('resolveInitialValue', () => { - test('serializes builders', () => { - expect(resolveInitialValue(schema, example, {}, mockConfigContext)).resolves.toMatchObject({ + test('serializes builders', async () => { + await expect( + resolveInitialValue(schema, example, {}, mockConfigContext), + ).resolves.toMatchObject({ title: 'here', }) }) - test('works with raw templates', () => { - expect(resolveInitialValue(schema, example, {}, mockConfigContext)).resolves.toMatchObject({ + test('works with raw templates', async () => { + await expect( + resolveInitialValue(schema, example, {}, mockConfigContext), + ).resolves.toMatchObject({ title: 'here', }) }) - test('throws on missing template `value` prop', () => { - expect( + test('throws on missing template `value` prop', async () => { + await expect( resolveInitialValue(schema, omit(example, ['value']) as Template, {}, mockConfigContext), ).rejects.toMatchObject({ message: 'Template "author" has invalid "value" property', }) }) - test('throws on non-function/non-object template `value` prop', () => { - expect( + test('throws on non-function/non-object template `value` prop', async () => { + await expect( resolveInitialValue(schema, {...example, value: []}, {}, mockConfigContext), ).rejects.toMatchObject({ message: @@ -59,8 +63,8 @@ describe('resolveInitialValue', () => { }) }) - test('throws on wrong `_type` prop', () => { - expect( + test('throws on wrong `_type` prop', async () => { + await expect( resolveInitialValue(schema, {...example, value: {_type: 'foo'}}, {}, mockConfigContext), ).rejects.toMatchObject({ message: @@ -68,8 +72,8 @@ describe('resolveInitialValue', () => { }) }) - test('throws on unknown prop in reference', () => { - expect( + test('throws on unknown prop in reference', async () => { + await expect( resolveInitialValue( schema, {...example, value: {bestFriend: {_ref: 'grrm', name: 'GRRM'}}}, @@ -82,8 +86,8 @@ describe('resolveInitialValue', () => { }) }) - test('throws on unknown props in reference', () => { - expect( + test('throws on unknown props in reference', async () => { + await expect( resolveInitialValue( schema, {...example, value: {bestFriend: {_ref: 'grrm', name: 'GRRM', age: 72}}}, @@ -96,8 +100,8 @@ describe('resolveInitialValue', () => { }) }) - test('allows setting known reference properties', () => { - expect( + test('allows setting known reference properties', async () => { + await expect( resolveInitialValue( schema, { @@ -124,8 +128,8 @@ describe('resolveInitialValue', () => { }) }) - test('allows setting _dataset on cross-dataset references', () => { - expect( + test('allows setting _dataset on cross-dataset references', async () => { + await expect( resolveInitialValue( schema, { @@ -152,16 +156,16 @@ describe('resolveInitialValue', () => { }) }) - test('should call sync value resolvers', () => { - expect( + test('should call sync value resolvers', async () => { + await expect( resolveInitialValue(schema, {...example, value: () => example.value}, {}, mockConfigContext), ).resolves.toMatchObject({ title: 'here', }) }) - test('should call async value resolvers', () => { - expect( + test('should call async value resolvers', async () => { + await expect( resolveInitialValue( schema, { @@ -176,8 +180,8 @@ describe('resolveInitialValue', () => { }) }) - test('throws on wrong value type resolved', () => { - expect( + test('throws on wrong value type resolved', async () => { + await expect( resolveInitialValue(schema, {...example, value: () => null}, {}, mockConfigContext), ).rejects.toMatchObject({ message: @@ -188,8 +192,8 @@ describe('resolveInitialValue', () => { // todo: we should validate based on schema type here and reenable this test // Currently the initial value validator is not schema aware and fails if resolved initial value is missing _type // but this doesn't account for fields of type object, which is a valid case for omitting _type. - test.skip('throws on values with sub-objects missing `_type`', () => { - expect( + test.skip('throws on values with sub-objects missing `_type`', async () => { + await expect( resolveInitialValue( schema, { @@ -204,8 +208,8 @@ describe('resolveInitialValue', () => { }) }) - test('applies missing `_type` to references', () => { - expect( + test('applies missing `_type` to references', async () => { + await expect( resolveInitialValue( schema, { diff --git a/packages/sanity/src/core/util/createHookFromObservableFactory.ts b/packages/sanity/src/core/util/createHookFromObservableFactory.ts index cd43e54af5e..cca6a1ba49a 100644 --- a/packages/sanity/src/core/util/createHookFromObservableFactory.ts +++ b/packages/sanity/src/core/util/createHookFromObservableFactory.ts @@ -3,8 +3,6 @@ import {useObservable} from 'react-rx' import {concat, type Observable, of} from 'rxjs' import {catchError, distinctUntilChanged, map, scan, switchMap} from 'rxjs/operators' -import {useUnique} from './useUnique' - /** @internal */ export type LoadingTuple<T> = [T, boolean] @@ -43,16 +41,14 @@ export function createHookFromObservableFactory<T, TArg = void>( const initialLoadingTuple: LoadingTuple<T | undefined> = [initialValue, true] const initialResult = {type: 'tuple', tuple: initialLoadingTuple} as const - return function useLoadableFromCreateLoadable(_arg: TArg) { - // @todo refactor callsites to make use of useMemo so that this hook can be removed - const memoArg = useUnique(_arg) + return function useLoadableFromCreateLoadable(arg: TArg) { const observable = useMemo( () => - of(memoArg).pipe( - switchMap((arg) => + of(arg).pipe( + switchMap((_arg) => concat( of({type: 'loading'} as const), - observableFactory(arg).pipe(map((value) => ({type: 'value', value}) as const)), + observableFactory(_arg).pipe(map((value) => ({type: 'value', value}) as const)), ), ), scan(([prevValue], next): LoadingTuple<T | undefined> => { @@ -67,7 +63,7 @@ export function createHookFromObservableFactory<T, TArg = void>( map((tuple) => ({type: 'tuple', tuple}) as const), catchError((error) => of({type: 'error', error} as const)), ), - [memoArg], + [arg], ) const result = useObservable(observable, initialResult) diff --git a/packages/sanity/src/core/util/useUnique.ts b/packages/sanity/src/core/util/useUnique.ts index e8950c7558d..a767dcc8da8 100644 --- a/packages/sanity/src/core/util/useUnique.ts +++ b/packages/sanity/src/core/util/useUnique.ts @@ -1,5 +1,5 @@ import {isEqual} from 'lodash' -import {useRef} from 'react' +import {useState} from 'react' /** * This React hook should be considered an escape hatch – to make sure that a value is the same @@ -9,11 +9,12 @@ import {useRef} from 'react' * @internal */ export function useUnique<ValueType>(value: ValueType): ValueType { - const valueRef = useRef<ValueType>(value) + const [previous, setPrevious] = useState(value) - if (!isEqual(valueRef.current, value)) { - valueRef.current = value + if (!isEqual(previous, value)) { + setPrevious(value) + return value } - return valueRef.current + return previous } diff --git a/packages/sanity/src/router/RouteScope.tsx b/packages/sanity/src/router/RouteScope.tsx index aff8ed1d887..f9d9bece7d3 100644 --- a/packages/sanity/src/router/RouteScope.tsx +++ b/packages/sanity/src/router/RouteScope.tsx @@ -1,5 +1,5 @@ /* eslint-disable camelcase */ -import {type ReactElement, type ReactNode, useCallback, useMemo, useRef} from 'react' +import {type ReactElement, type ReactNode, useCallback, useEffect, useMemo, useRef} from 'react' import {RouterContext} from 'sanity/_singletons' import {type NavigateOptions, type RouterContextValue, type RouterState} from './types' @@ -63,15 +63,16 @@ export interface RouteScopeProps { * } * ``` */ -export function RouteScope(props: RouteScopeProps): ReactElement { +export const RouteScope = function RouteScope(props: RouteScopeProps): ReactElement { const {children, scope, __unsafe_disableScopedSearchParams} = props const parentRouter = useRouter() const {resolvePathFromState: parent_resolvePathFromState, navigate: parent_navigate} = parentRouter const parentStateRef = useRef(parentRouter.state) - - parentStateRef.current = parentRouter.state + useEffect(() => { + parentStateRef.current = parentRouter.state + }, [parentRouter.state]) const resolveNextParentState = useCallback( (_nextState: RouterState) => { @@ -115,3 +116,4 @@ export function RouteScope(props: RouteScopeProps): ReactElement { return <RouterContext.Provider value={childRouter}>{children}</RouterContext.Provider> } +RouteScope.displayName = 'RouteScope' diff --git a/packages/sanity/src/router/RouterProvider.tsx b/packages/sanity/src/router/RouterProvider.tsx index 2b80bbfcd56..bc782525ced 100644 --- a/packages/sanity/src/router/RouterProvider.tsx +++ b/packages/sanity/src/router/RouterProvider.tsx @@ -49,7 +49,7 @@ export interface RouterProviderProps { * import {useCallback, useMemo} from 'react' * * function Root() { - * const router = useMemo(() => route.create('/'), []) + * const [router] = useState(() => route.create('/')) * * const [state, setState] = useState<RouterState>({}) * diff --git a/packages/sanity/src/structure/components/confirmDeleteDialog/ConfirmDeleteDialogBody.tsx b/packages/sanity/src/structure/components/confirmDeleteDialog/ConfirmDeleteDialogBody.tsx index 8dab14b816c..bb323030731 100644 --- a/packages/sanity/src/structure/components/confirmDeleteDialog/ConfirmDeleteDialogBody.tsx +++ b/packages/sanity/src/structure/components/confirmDeleteDialog/ConfirmDeleteDialogBody.tsx @@ -7,7 +7,6 @@ import { } from '@sanity/icons' import {Box, Card, Flex, Stack, Text, useToast} from '@sanity/ui' import {useCallback} from 'react' -import CopyToClipboard from 'react-copy-to-clipboard' import {SanityDefaultPreview, Translate, useSchema, useTranslation} from 'sanity' import {Button} from '../../../ui-components' @@ -232,28 +231,36 @@ export function ConfirmDeleteDialogBody({ {documentId || 'unavailable'} </Text> {documentId && ( - <CopyToClipboard - text={documentId} + <Button + mode="bleed" + icon={CopyIcon} + tooltipProps={{ + content: t( + 'confirm-delete-dialog.cdr-table.copy-id-button.tooltip', + ), + }} // eslint-disable-next-line react/jsx-no-bind - onCopy={() => { - toast.push({ - title: t( - 'confirm-delete-dialog.cdr-table.id-copied-toast.title', - ), - status: 'success', - }) + onClick={() => { + navigator.clipboard + .writeText(documentId) + .then(() => { + toast.push({ + status: 'success', + title: t( + 'confirm-delete-dialog.cdr-table.id-copied-toast.title', + ), + }) + }) + .catch(() => { + toast.push({ + status: 'error', + title: t( + 'confirm-delete-dialog.cdr-table.id-copied-toast.title-failed', + ), + }) + }) }} - > - <Button - mode="bleed" - icon={CopyIcon} - tooltipProps={{ - content: t( - 'confirm-delete-dialog.cdr-table.copy-id-button.tooltip', - ), - }} - /> - </CopyToClipboard> + /> )} </DocumentIdFlex> </td> diff --git a/packages/sanity/src/structure/components/pane/PaneLayout.tsx b/packages/sanity/src/structure/components/pane/PaneLayout.tsx index 31545e633ba..9e84e683d35 100644 --- a/packages/sanity/src/structure/components/pane/PaneLayout.tsx +++ b/packages/sanity/src/structure/components/pane/PaneLayout.tsx @@ -28,7 +28,7 @@ export function PaneLayout( Omit<HTMLProps<HTMLDivElement>, 'as' | 'height' | 'ref' | 'wrap'>, ) { const {children, minWidth, onCollapse, onExpand, ...restProps} = props - const controller = useMemo(() => createPaneLayoutController(), []) + const [controller] = useState(() => createPaneLayoutController()) const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null) const rootRect = useElementRect(rootElement) const width = rootRect?.width || 0 diff --git a/packages/sanity/src/structure/components/pane/__workshop__/ResizeStory.tsx b/packages/sanity/src/structure/components/pane/__workshop__/ResizeStory.tsx index cd360897a7d..0b95357becd 100644 --- a/packages/sanity/src/structure/components/pane/__workshop__/ResizeStory.tsx +++ b/packages/sanity/src/structure/components/pane/__workshop__/ResizeStory.tsx @@ -17,7 +17,7 @@ const PaneLayoutRoot = styled(Flex)` export default function ResizeStory() { const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null) - const controller = useMemo(() => createPaneLayoutController(), []) + const [controller] = useState(() => createPaneLayoutController()) const collapsed = false const [state, setState] = useState<PaneLayoutState>({ expandedElement: null, diff --git a/packages/sanity/src/structure/i18n/resources.ts b/packages/sanity/src/structure/i18n/resources.ts index d95552f1ae9..395b94f19d7 100644 --- a/packages/sanity/src/structure/i18n/resources.ts +++ b/packages/sanity/src/structure/i18n/resources.ts @@ -194,6 +194,8 @@ const structureLocaleStrings = defineLocalesResources('structure', { 'confirm-delete-dialog.cdr-table.document-id.label': 'Document ID', /** The toast title when the copy button has been clicked */ 'confirm-delete-dialog.cdr-table.id-copied-toast.title': 'Copied document ID to clipboard!', + /** The toast title when the copy button has been clicked but copying failed */ + 'confirm-delete-dialog.cdr-table.id-copied-toast.title-failed': 'Failed to copy document ID', /** The header for the project ID column in the list of cross-dataset references found */ 'confirm-delete-dialog.cdr-table.project-id.label': 'Project ID', /** The text in the "Delete anyway" button in the confirm delete dialog that confirms the action */ diff --git a/packages/sanity/src/structure/panes/document/DocumentInspectorMenuItemsResolver.tsx b/packages/sanity/src/structure/panes/document/DocumentInspectorMenuItemsResolver.tsx index bd5a925c59a..92b9aab83e8 100644 --- a/packages/sanity/src/structure/panes/document/DocumentInspectorMenuItemsResolver.tsx +++ b/packages/sanity/src/structure/panes/document/DocumentInspectorMenuItemsResolver.tsx @@ -1,4 +1,4 @@ -import {memo, useCallback, useEffect, useMemo, useRef, useState} from 'react' +import {memo, useCallback, useEffect, useMemo, useState} from 'react' import {type DocumentInspector, type DocumentInspectorMenuItem, useUnique} from 'sanity' interface DocumentInspectorMenuItemsResolverProps { @@ -18,36 +18,26 @@ export function DocumentInspectorMenuItemsResolver(props: DocumentInspectorMenuI const {documentId, documentType, inspectors, onMenuItems} = props const len = inspectors.length - const lenRef = useRef(len) - const [menuItems, setMenuItems] = useState<DocumentInspectorMenuItem[]>(() => Array.from(new Array(len)), ) - const menuItemsRef = useRef(menuItems) - useEffect(() => { - if (lenRef.current !== len) { + if (menuItems.length !== len) { const newFieldActions = Array.from(new Array(len)) for (let i = 0; i < len; i++) { - newFieldActions[i] = menuItemsRef.current[i] + newFieldActions[i] = menuItems[i] } - lenRef.current = len - - setMenuItems(() => { - menuItemsRef.current = newFieldActions - return newFieldActions - }) + setMenuItems(newFieldActions) } - }, [len]) + }, [len, menuItems]) const setMenuItem = useCallback((index: number, node: DocumentInspectorMenuItem) => { setMenuItems((prev) => { const next = [...prev] next[index] = node - menuItemsRef.current = next return next }) }, []) @@ -79,6 +69,7 @@ export function DocumentInspectorMenuItemsResolver(props: DocumentInspectorMenuI </> ) } +DocumentInspectorMenuItemsResolver.displayName = 'DocumentInspectorMenuItemsResolver' function defineInspectorMenuItemComponent({ documentId, diff --git a/packages/sanity/src/structure/panes/document/DocumentPaneProvider.tsx b/packages/sanity/src/structure/panes/document/DocumentPaneProvider.tsx index 5d87215c090..ff193f70c79 100644 --- a/packages/sanity/src/structure/panes/document/DocumentPaneProvider.tsx +++ b/packages/sanity/src/structure/panes/document/DocumentPaneProvider.tsx @@ -93,6 +93,7 @@ export const DocumentPaneProvider = memo((props: DocumentPaneProviderProps) => { inspectors: inspectorsResolver, }, } = useSource() + const telemetry = useTelemetry() const presenceStore = usePresenceStore() const paneRouter = usePaneRouter() const setPaneParams = paneRouter.setParams @@ -371,14 +372,22 @@ export const DocumentPaneProvider = memo((props: DocumentPaneProviderProps) => { const patchRef = useRef<(event: PatchEvent) => void>(() => { throw new Error('Nope') }) - - patchRef.current = (event: PatchEvent) => { - // when creating a new draft - if (!editState.draft && !editState.published && !editState.version) { - telemetry.log(CreatedDraft) + useEffect(() => { + patchRef.current = (event: PatchEvent) => { + // when creating a new draft + if (!editState.draft && !editState.published && !editState.version) { + telemetry.log(CreatedDraft) + } + patch.execute(toMutationPatches(event.patches), initialValue.value) } - patch.execute(toMutationPatches(event.patches), initialValue.value) - } + }, [ + editState.draft, + editState.published, + editState.version, + initialValue.value, + patch, + telemetry, + ]) const handleChange = useCallback((event: PatchEvent) => patchRef.current(event), []) @@ -485,8 +494,6 @@ export const DocumentPaneProvider = memo((props: DocumentPaneProviderProps) => { [inspectOpen, params, setPaneParams], ) - const telemetry = useTelemetry() - const handleMenuAction = useCallback( (item: PaneMenuItem) => { if (item.action === 'production-preview' && previewUrl) { @@ -672,7 +679,9 @@ export const DocumentPaneProvider = memo((props: DocumentPaneProviderProps) => { }, [documentId, documentType, schemaType, handleChange, setDocumentMeta]) const formStateRef = useRef(formState) - formStateRef.current = formState + useEffect(() => { + formStateRef.current = formState + }, [formState]) const setOpenPath = useCallback( (path: Path) => { diff --git a/packages/sanity/src/structure/panes/document/documentInspector/DocumentInspectorPanel.tsx b/packages/sanity/src/structure/panes/document/documentInspector/DocumentInspectorPanel.tsx index 019d2b2b012..8dec4b1cbb7 100644 --- a/packages/sanity/src/structure/panes/document/documentInspector/DocumentInspectorPanel.tsx +++ b/packages/sanity/src/structure/panes/document/documentInspector/DocumentInspectorPanel.tsx @@ -1,5 +1,5 @@ import {Box} from '@sanity/ui' -import {createElement, type ReactElement, useCallback} from 'react' +import {type ReactElement, useCallback} from 'react' import {usePane} from '../../../components' import {useStructureTool} from '../../../useStructureTool' @@ -25,11 +25,10 @@ export function DocumentInspectorPanel(props: DocumentInspectorPanelProps): Reac if (collapsed || !inspector) return null - const element = createElement(inspector.component, { - onClose: handleClose, - documentId, - documentType, - }) + const Component = inspector.component + const element = ( + <Component onClose={handleClose} documentId={documentId} documentType={documentType} /> + ) if (features.resizablePanes) { return ( diff --git a/packages/sanity/src/structure/panes/document/documentPanel/DocumentPanel.tsx b/packages/sanity/src/structure/panes/document/documentPanel/DocumentPanel.tsx index c5673393afd..0e79a8d4a52 100644 --- a/packages/sanity/src/structure/panes/document/documentPanel/DocumentPanel.tsx +++ b/packages/sanity/src/structure/panes/document/documentPanel/DocumentPanel.tsx @@ -1,5 +1,5 @@ import {BoundaryElementProvider, Box, Flex, PortalProvider, usePortal} from '@sanity/ui' -import {createElement, useEffect, useMemo, useRef, useState} from 'react' +import {useEffect, useMemo, useRef, useState} from 'react' import { isReleaseScheduledOrScheduling, type ReleaseDocument, @@ -74,7 +74,7 @@ export const DocumentPanel = function DocumentPanel(props: DocumentPanelProps) { const {collapsed} = usePane() const parentPortal = usePortal() const {features} = useStructureTool() - const portalRef = useRef<HTMLDivElement | null>(null) + const [_portalElement, setPortalElement] = useState<HTMLDivElement | null>(null) const [documentScrollElement, setDocumentScrollElement] = useState<HTMLDivElement | null>(null) const formContainerElement = useRef<HTMLDivElement | null>(null) @@ -87,7 +87,7 @@ export const DocumentPanel = function DocumentPanel(props: DocumentPanelProps) { // Use a local portal container when split panes is supported const portalElement: HTMLElement | null = features.splitPanes - ? portalRef.current || parentPortal.element + ? _portalElement || parentPortal.element : parentPortal.element // Calculate the height of the header @@ -101,23 +101,25 @@ export const DocumentPanel = function DocumentPanel(props: DocumentPanelProps) { const formViewHidden = activeView.type !== 'form' - const activeViewNode = useMemo( - () => - activeView.type === 'component' && - activeView.component && - createElement(activeView.component, { - document: { - draft: editState?.draft || null, - displayed: displayed || value, - historical: displayed, - published: editState?.published || null, - }, - documentId, - options: activeView.options, - schemaType, - }), - [activeView, displayed, documentId, editState?.draft, editState?.published, schemaType, value], - ) + const activeViewNode = useMemo(() => { + if (activeView.type === 'component' && activeView.component) { + const ActiveViewComponent = activeView.component + return ( + <ActiveViewComponent + document={{ + draft: editState?.draft || null, + displayed: displayed || value, + historical: displayed, + published: editState?.published || null, + }} + documentId={documentId} + options={activeView.options} + schemaType={schemaType} + /> + ) + } + return false + }, [activeView, displayed, documentId, editState?.draft, editState?.published, schemaType, value]) const isLiveEdit = isLiveEditEnabled(schemaType) @@ -231,7 +233,7 @@ export const DocumentPanel = function DocumentPanel(props: DocumentPanelProps) { {inspectDialog} - <div data-testid="document-panel-portal" ref={portalRef} /> + <div data-testid="document-panel-portal" ref={setPortalElement} /> </VirtualizerScrollInstanceProvider> </BoundaryElementProvider> </PortalProvider> @@ -251,3 +253,4 @@ export const DocumentPanel = function DocumentPanel(props: DocumentPanelProps) { </PaneContent> ) } +DocumentPanel.displayName = 'DocumentPanel' diff --git a/packages/sanity/src/structure/panes/document/documentPanel/documentViews/FormView.tsx b/packages/sanity/src/structure/panes/document/documentPanel/documentViews/FormView.tsx index 71f82067282..640ed7a7c2d 100644 --- a/packages/sanity/src/structure/panes/document/documentPanel/documentViews/FormView.tsx +++ b/packages/sanity/src/structure/panes/document/documentPanel/documentViews/FormView.tsx @@ -63,7 +63,7 @@ export const FormView = forwardRef<HTMLDivElement, FormViewProps>(function FormV // nodes about both remote and local patches. // - Used by the Portable Text input to modify selections. // - Used by `withDocument` to reset value. - const patchChannel = useMemo(() => createPatchChannel(), []) + const [patchChannel] = useState(() => createPatchChannel()) const isLocked = false //TODO: editState?.transactionSyncLock?.enabled const {t} = useTranslation(structureLocaleNamespace) diff --git a/packages/sanity/src/structure/panes/document/documentPanel/header/DocumentPanelHeader.tsx b/packages/sanity/src/structure/panes/document/documentPanel/header/DocumentPanelHeader.tsx index f24f553a423..ea360ff0d60 100644 --- a/packages/sanity/src/structure/panes/document/documentPanel/header/DocumentPanelHeader.tsx +++ b/packages/sanity/src/structure/panes/document/documentPanel/header/DocumentPanelHeader.tsx @@ -1,7 +1,6 @@ import {ArrowLeftIcon, CloseIcon, SplitVerticalIcon} from '@sanity/icons' import {Flex} from '@sanity/ui' import { - createElement, type ForwardedRef, forwardRef, memo, @@ -148,12 +147,14 @@ export const DocumentPanelHeader = memo( <Flex align="center" gap={1}> {unstable_languageFilter.length > 0 && ( <> - {unstable_languageFilter.map((languageFilterComponent, idx) => { - return createElement(languageFilterComponent, { - // eslint-disable-next-line react/no-array-index-key - key: `language-filter-${idx}`, - schemaType, - }) + {unstable_languageFilter.map((LanguageFilterComponent, idx) => { + return ( + <LanguageFilterComponent + // eslint-disable-next-line react/no-array-index-key + key={`language-filter-${idx}`} + schemaType={schemaType} + /> + ) })} </> )} diff --git a/packages/sanity/src/structure/panes/document/inspectDialog/InspectDialog.tsx b/packages/sanity/src/structure/panes/document/inspectDialog/InspectDialog.tsx index 74639d54bce..ce1777aeb80 100644 --- a/packages/sanity/src/structure/panes/document/inspectDialog/InspectDialog.tsx +++ b/packages/sanity/src/structure/panes/document/inspectDialog/InspectDialog.tsx @@ -1,4 +1,4 @@ -import JSONInspector from '@rexxars/react-json-inspector' +import {JsonInspector} from '@rexxars/react-json-inspector' import {type SanityDocument} from '@sanity/types' import {Card, Code, Flex, TabList, TabPanel} from '@sanity/ui' import {useCallback} from 'react' @@ -106,7 +106,7 @@ export function InspectDialog(props: InspectDialogProps) { > {viewMode === VIEW_MODE_PARSED && ( <JSONInspectorWrapper> - <JSONInspector + <JsonInspector data={value} isExpanded={isExpanded} onClick={toggleExpanded} diff --git a/packages/sanity/src/structure/panes/document/inspectors/validation/ValidationInspector.tsx b/packages/sanity/src/structure/panes/document/inspectors/validation/ValidationInspector.tsx index 535d74b3e62..d223f1cb63c 100644 --- a/packages/sanity/src/structure/panes/document/inspectors/validation/ValidationInspector.tsx +++ b/packages/sanity/src/structure/panes/document/inspectors/validation/ValidationInspector.tsx @@ -12,7 +12,7 @@ import { type ValidationMarker, } from '@sanity/types' import {Box, Card, type CardTone, Flex, Stack, Text} from '@sanity/ui' -import {createElement, type ErrorInfo, Fragment, useCallback, useMemo, useState} from 'react' +import {type ErrorInfo, Fragment, useCallback, useMemo, useState} from 'react' import {type DocumentInspectorProps, useTranslation} from 'sanity' import {ErrorBoundary} from '../../../../../ui-components' @@ -92,6 +92,7 @@ function ValidationCard(props: { const {marker, onOpen, schemaType, value} = props const handleOpen = useCallback(() => onOpen(marker.path), [marker, onOpen]) const [errorInfo, setErrorInfo] = useState<{error: Error; info: ErrorInfo} | null>(null) + const Icon = MARKER_ICON[marker.level] return ( <ErrorBoundary onCatch={setErrorInfo}> @@ -112,7 +113,9 @@ function ValidationCard(props: { > <Flex align="flex-start" gap={3}> <Box flex="none"> - <Text size={1}>{createElement(MARKER_ICON[marker.level])}</Text> + <Text size={1}> + <Icon /> + </Text> </Box> <Stack flex={1} space={2}> diff --git a/packages/sanity/src/structure/panes/document/keyboardShortcuts/DocumentActionShortcuts.tsx b/packages/sanity/src/structure/panes/document/keyboardShortcuts/DocumentActionShortcuts.tsx index dba8a419a85..de7cfee2ebd 100644 --- a/packages/sanity/src/structure/panes/document/keyboardShortcuts/DocumentActionShortcuts.tsx +++ b/packages/sanity/src/structure/panes/document/keyboardShortcuts/DocumentActionShortcuts.tsx @@ -1,6 +1,5 @@ import {isHotkey} from 'is-hotkey-esm' import { - createElement, type ElementType, type HTMLProps, memo, @@ -34,7 +33,7 @@ const KeyboardShortcutResponder = memo(function KeyboardShortcutResponder( const { actionsBoxElement, activeIndex, - as = 'div', + as: As = 'div', children, id, onActionStart, @@ -75,23 +74,15 @@ const KeyboardShortcutResponder = memo(function KeyboardShortcutResponder( [onActionStart, onKeyDown, states], ) - return createElement( - as, - { - id, - onKeyDown: handleKeyDown, - tabIndex: -1, - ...rest, - ref: rootRef, - }, - [ - children, - activeAction && activeAction.dialog && ( + return ( + <As id={id} onKeyDown={handleKeyDown} tabIndex={-1} {...rest} ref={rootRef}> + {children} + {activeAction && activeAction.dialog && ( <LegacyLayerProvider zOffset="paneFooter"> <ActionStateDialog dialog={activeAction.dialog} referenceElement={actionsBoxElement} /> </LegacyLayerProvider> - ), - ], + )} + </As> ) }) diff --git a/packages/sanity/src/structure/panes/document/statusBar/RevisionStatusLine.tsx b/packages/sanity/src/structure/panes/document/statusBar/RevisionStatusLine.tsx index 702e5f19331..18a586bbd05 100644 --- a/packages/sanity/src/structure/panes/document/statusBar/RevisionStatusLine.tsx +++ b/packages/sanity/src/structure/panes/document/statusBar/RevisionStatusLine.tsx @@ -1,7 +1,6 @@ import {RestoreIcon} from '@sanity/icons' import {Box, Flex, Text} from '@sanity/ui' import {format} from 'date-fns' -import {createElement} from 'react' import {Translate, useTranslation} from 'sanity' import {styled} from 'styled-components' @@ -24,7 +23,6 @@ export function RevisionStatusLine(): JSX.Element { const message = { name: 'revision', - icon: RestoreIcon, text: date ? ( <Translate t={t} @@ -41,7 +39,9 @@ export function RevisionStatusLine(): JSX.Element { <> <Flex flex={1} gap={3} padding={2}> <Box flex="none"> - <Text size={1}>{createElement(message.icon)}</Text> + <Text size={1}> + <RestoreIcon /> + </Text> </Box> <Box flex={1}> <StatusText size={1} textOverflow="ellipsis"> diff --git a/packages/sanity/src/structure/panes/document/timeline/timelineItem.tsx b/packages/sanity/src/structure/panes/document/timeline/timelineItem.tsx index ec61577cce7..5849372ebf9 100644 --- a/packages/sanity/src/structure/panes/document/timeline/timelineItem.tsx +++ b/packages/sanity/src/structure/panes/document/timeline/timelineItem.tsx @@ -1,7 +1,7 @@ import {Box, Card, Flex, Skeleton, Stack, Text} from '@sanity/ui' // eslint-disable-next-line camelcase import {getTheme_v2, type ThemeColorAvatarColorKey} from '@sanity/ui/theme' -import {createElement, type MouseEvent, useCallback, useMemo} from 'react' +import {type MouseEvent, useCallback, useMemo} from 'react' import { AvatarSkeleton, type ChunkType, @@ -115,7 +115,7 @@ export function TimelineItem({ }: TimelineItemProps) { const {t} = useTranslation('studio') const {type, endTimestamp: timestamp} = chunk - const iconComponent = getTimelineEventIconComponent(type) + const IconComponent = getTimelineEventIconComponent(type) const authorUserIds = Array.from(chunk.authors) const collaboratorsUsersIds = collaborators ? Array.from(collaborators) : [] const isSelectable = type !== 'delete' @@ -159,7 +159,7 @@ export function TimelineItem({ <div style={{position: 'relative'}}> <UserAvatarStack maxLength={3} userIds={authorUserIds} size={2} /> <IconBox align="center" justify="center" $color={TIMELINE_ITEM_EVENT_TONE[type]}> - <Text size={0}>{iconComponent && createElement(iconComponent)}</Text> + <Text size={0}>{IconComponent && <IconComponent />}</Text> </IconBox> </div> <Stack space={2}> diff --git a/packages/sanity/src/structure/panes/documentList/PaneContainer.tsx b/packages/sanity/src/structure/panes/documentList/PaneContainer.tsx index 92d18add010..f88b583865b 100644 --- a/packages/sanity/src/structure/panes/documentList/PaneContainer.tsx +++ b/packages/sanity/src/structure/panes/documentList/PaneContainer.tsx @@ -1,6 +1,6 @@ import {Card, Code} from '@sanity/ui' import {isEqual} from 'lodash' -import {memo, useMemo, useRef} from 'react' +import {memo, useMemo, useState} from 'react' import { EMPTY_ARRAY, type GeneralDocumentListLayoutKey, @@ -49,11 +49,12 @@ const addSelectedStateToMenuItems = (options: { } export function useShallowUnique<ValueType>(value: ValueType): ValueType { - const valueRef = useRef<ValueType>(value) - if (!shallowEquals(valueRef.current, value)) { - valueRef.current = value + const [previous, setPrevious] = useState<ValueType>(value) + if (!shallowEquals(previous, value)) { + setPrevious(value) + return value } - return valueRef.current + return previous } /** @@ -146,3 +147,4 @@ export const PaneContainer = memo(function PaneContainer( </SourceProvider> ) }) +PaneContainer.displayName = 'Memo(PaneContainer)' diff --git a/packages/sanity/src/structure/panes/documentList/useDocumentList.ts b/packages/sanity/src/structure/panes/documentList/useDocumentList.ts index 0c8b686ccda..a328703d1b3 100644 --- a/packages/sanity/src/structure/panes/documentList/useDocumentList.ts +++ b/packages/sanity/src/structure/panes/documentList/useDocumentList.ts @@ -1,5 +1,5 @@ import {observableCallback} from 'observable-callback' -import {useMemo} from 'react' +import {useMemo, useState} from 'react' import {useObservable} from 'react-rx' import {concat, fromEvent, merge, of} from 'rxjs' import { @@ -83,8 +83,8 @@ export function useDocumentList(opts: UseDocumentListOpts): UseDocumentListHookV [searchFilter, paramsProp], ) - const [onRetry$, onRetry] = useMemo(() => observableCallback(), []) - const [onFetchFullList$, onLoadFullList] = useMemo(() => observableCallback(), []) + const [[onRetry$, onRetry]] = useState(() => observableCallback()) + const [[onFetchFullList$, onLoadFullList]] = useState(() => observableCallback()) const queryResults$ = useMemo(() => { const listenSearchQueryArgs = { diff --git a/packages/sanity/src/structure/panes/userComponent/UserComponentPane.tsx b/packages/sanity/src/structure/panes/userComponent/UserComponentPane.tsx index 40272f51e29..62cb29aa4bc 100644 --- a/packages/sanity/src/structure/panes/userComponent/UserComponentPane.tsx +++ b/packages/sanity/src/structure/panes/userComponent/UserComponentPane.tsx @@ -1,4 +1,4 @@ -import {createElement, isValidElement, useState} from 'react' +import {isValidElement, useState} from 'react' import {isValidElementType} from 'react-is' import {useI18nText} from 'sanity' @@ -17,7 +17,7 @@ export function UserComponentPane(props: UserComponentPaneProps) { const {index, pane, paneKey, ...restProps} = props const { child, - component, + component: UserComponent, menuItems, menuItemGroups, // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -40,18 +40,19 @@ export function UserComponentPane(props: UserComponentPaneProps) { /> <UserComponentPaneContent> - {isValidElementType(component) && - createElement(component, { - ...restProps, - ...restPane, + {isValidElementType(UserComponent) && ( + <UserComponent + {...restProps} + {...restPane} // NOTE: here we're utilizing the function form of refs so setting // the ref causes a re-render for `UserComponentPaneHeader` - ...({ref: setRef} as any), - child: child as any, // @todo: Fix typings - paneKey, - })} - - {isValidElement(component) && component} + ref={setRef as any} + // @ts-expect-error - @TODO Fix typings + child={child} + paneKey={paneKey} + /> + )} + {isValidElement(UserComponent) && UserComponent} </UserComponentPaneContent> </Pane> ) diff --git a/packages/sanity/src/structure/structureResolvers/useResolvedPanes.ts b/packages/sanity/src/structure/structureResolvers/useResolvedPanes.ts index b13ca6f82a5..7a87f290ee5 100644 --- a/packages/sanity/src/structure/structureResolvers/useResolvedPanes.ts +++ b/packages/sanity/src/structure/structureResolvers/useResolvedPanes.ts @@ -30,7 +30,7 @@ export interface Panes { } function useRouterPanesStream() { - const routerStateSubject = useMemo(() => new ReplaySubject<RouterState>(1), []) + const [routerStateSubject] = useState(() => new ReplaySubject<RouterState>(1)) const routerPanes$ = useMemo( () => routerStateSubject diff --git a/packages/sanity/src/structure/structureTool.ts b/packages/sanity/src/structure/structureTool.ts index 0f192d78b29..678547e9508 100644 --- a/packages/sanity/src/structure/structureTool.ts +++ b/packages/sanity/src/structure/structureTool.ts @@ -116,6 +116,7 @@ export const structureTool = definePlugin<StructureToolOptions | void>((options) controlsDocumentTitle: true, options, router, + __internalApplicationType: 'sanity/structure', }, ], diff --git a/packages/sanity/src/structure/useStructureTool.ts b/packages/sanity/src/structure/useStructureTool.ts index 07a411582d8..a13ac1505d9 100644 --- a/packages/sanity/src/structure/useStructureTool.ts +++ b/packages/sanity/src/structure/useStructureTool.ts @@ -6,7 +6,6 @@ import {type StructureToolContextValue} from './types' /** @internal */ export function useStructureTool(): StructureToolContextValue { const structureTool = useContext(StructureToolContext) - if (!structureTool) throw new Error(`StructureTool: missing context value`) return structureTool diff --git a/packages/sanity/src/ui-components/menuItem/MenuItem.tsx b/packages/sanity/src/ui-components/menuItem/MenuItem.tsx index 5b322de0763..952ba655302 100644 --- a/packages/sanity/src/ui-components/menuItem/MenuItem.tsx +++ b/packages/sanity/src/ui-components/menuItem/MenuItem.tsx @@ -9,7 +9,6 @@ import { Text, } from '@sanity/ui' import { - createElement, forwardRef, type HTMLProps, isValidElement, @@ -92,8 +91,8 @@ export const MenuItem = forwardRef(function MenuItem( children: childrenProp, disabled, hotkeys, - icon, - iconRight, + icon: Icon, + iconRight: IconRight, preview = null, renderMenuItem, text, @@ -118,11 +117,11 @@ export const MenuItem = forwardRef(function MenuItem( </Flex> </PreviewWrapper> )} - {icon && ( + {Icon && ( <Box paddingRight={1}> <Text size={FONT_SIZE}> - {isValidElement(icon) && icon} - {isValidElementType(icon) && createElement(icon)} + {isValidElement(Icon) && Icon} + {isValidElementType(Icon) && <Icon />} </Text> </Box> )} @@ -142,7 +141,7 @@ export const MenuItem = forwardRef(function MenuItem( )} </Stack> )} - {(badgeText || hotkeys || iconRight) && ( + {(badgeText || hotkeys || IconRight) && ( <Flex align="center" gap={3} marginLeft={3}> {hotkeys && <Hotkeys keys={hotkeys} style={{marginTop: -4, marginBottom: -4}} />} @@ -152,10 +151,10 @@ export const MenuItem = forwardRef(function MenuItem( </Badge> )} - {iconRight && ( + {IconRight && ( <Text size={FONT_SIZE}> - {isValidElement(iconRight) && iconRight} - {isValidElementType(iconRight) && createElement(iconRight)} + {isValidElement(IconRight) && IconRight} + {isValidElementType(IconRight) && <IconRight />} </Text> )} </Flex> @@ -166,12 +165,12 @@ export const MenuItem = forwardRef(function MenuItem( preview, disabled, __unstable_space, - icon, + Icon, text, __unstable_subtitle, badgeText, hotkeys, - iconRight, + IconRight, ]) const renderWrapper = useCallback<ConditionalWrapperRenderWrapperCallback>( diff --git a/perf/efps/package.json b/perf/efps/package.json index 269829dc51a..0f64c5b9339 100644 --- a/perf/efps/package.json +++ b/perf/efps/package.json @@ -23,7 +23,7 @@ "@types/serve-handler": "^6.1.4", "@types/yargs": "^17.0.7", "@vitejs/plugin-react": "^4.3.4", - "babel-plugin-react-compiler": "19.0.0-beta-df7b47d-20241124", + "babel-plugin-react-compiler": "19.0.0-beta-201e55d-20241215", "chalk": "^4.1.2", "cli-table3": "^0.6.5", "dotenv": "^16.0.3", @@ -31,7 +31,7 @@ "ora": "^8.0.1", "playwright": "^1.46.1", "react": "^18.3.1", - "react-compiler-runtime": "19.0.0-beta-37ed2a7-20241206", + "react-compiler-runtime": "19.0.0-beta-201e55d-20241215", "react-dom": "^18.3.1", "rollup-plugin-sourcemaps": "^0.6.3", "sanity": "workspace:*", diff --git a/perf/studio/package.json b/perf/studio/package.json index 106106f8f8e..7f535e60c14 100644 --- a/perf/studio/package.json +++ b/perf/studio/package.json @@ -1,6 +1,6 @@ { "name": "perf-studio", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "Sanity Studio with various test cases for tracking performance", "license": "MIT", @@ -14,9 +14,9 @@ "start": "sanity start --port 3300" }, "dependencies": { - "babel-plugin-react-compiler": "19.0.0-beta-37ed2a7-20241206", + "babel-plugin-react-compiler": "19.0.0-beta-201e55d-20241215", "react": "^18.3.1", - "react-compiler-runtime": "19.0.0-beta-37ed2a7-20241206", + "react-compiler-runtime": "19.0.0-beta-201e55d-20241215", "react-dom": "^18.3.1", "sanity": "workspace:*", "styled-components": "^6.1.0" diff --git a/perf/tests/package.json b/perf/tests/package.json index 84f331ff5d9..a71939acf4d 100644 --- a/perf/tests/package.json +++ b/perf/tests/package.json @@ -1,6 +1,6 @@ { "name": "sanity-perf-tests", - "version": "3.67.1", + "version": "3.68.1", "private": true, "description": "Sanity Studio perf tests", "license": "MIT", @@ -32,6 +32,6 @@ "esbuild": "0.21.5", "ts-node": "^10.9.2", "typescript": "5.7.2", - "vitest": "^2.1.1" + "vitest": "^2.1.8" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 669deba9945..8920359f903 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: specifier: ^0.11.1 version: 0.11.1(debug@4.4.0) '@sanity/pkg-utils': - specifier: 6.12.0 - version: 6.12.0(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(debug@4.4.0)(typescript@5.7.2) + specifier: 6.12.2 + version: 6.12.2(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(typescript@5.7.2) '@sanity/prettier-config': specifier: ^1.0.3 version: 1.0.3(prettier@3.4.2) @@ -57,11 +57,11 @@ importers: specifier: 0.0.1-alpha.1 version: 0.0.1-alpha.1 '@sanity/tsdoc': - specifier: 1.0.150 - version: 1.0.150(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react-is@19.0.0-rc.1)(react@19.0.0-rc-f994737d14-20240522)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522))(terser@5.37.0)(yaml@2.6.1) + specifier: 1.0.153 + version: 1.0.153(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.2)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react-is@19.0.0-rc.1)(react@19.0.0-rc-f994737d14-20240522)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522))(terser@5.37.0)(yaml@2.6.1) '@sanity/ui': - specifier: ^2.10.9 - version: 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react-is@19.0.0-rc.1)(react@19.0.0-rc-f994737d14-20240522)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)) + specifier: ^2.10.12 + version: 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react-is@19.0.0-rc.1)(react@19.0.0-rc-f994737d14-20240522)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)) '@sanity/uuid': specifier: ^3.0.2 version: 3.0.2 @@ -73,10 +73,10 @@ importers: version: 4.17.13 '@types/node': specifier: ^22.10.0 - version: 22.10.1 + version: 22.10.2 '@types/react': specifier: ^18.3.12 - version: 18.3.14 + version: 18.3.17 '@types/semver': specifier: ^7.5.6 version: 7.5.8 @@ -91,7 +91,7 @@ importers: version: 7.18.0(eslint@8.57.1)(typescript@5.7.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0)) + version: 4.3.4(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) cac: specifier: ^6.7.12 version: 6.7.14 @@ -121,7 +121,7 @@ importers: version: 9.1.0(eslint@8.57.1) eslint-config-sanity: specifier: ^7.1.2 - version: 7.1.3(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1) + version: 7.1.3(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1) eslint-config-turbo: specifier: ^2.1.2 version: 2.3.3(eslint@8.57.1) @@ -130,7 +130,7 @@ importers: version: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-plugin-boundaries: specifier: ^4.2.2 - version: 4.2.2(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + version: 4.2.2(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) eslint-plugin-import: specifier: ^2.30.0 version: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) @@ -141,8 +141,8 @@ importers: specifier: ^7.36.1 version: 7.37.2(eslint@8.57.1) eslint-plugin-react-compiler: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206(eslint@8.57.1) + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215(eslint@8.57.1) eslint-plugin-react-hooks: specifier: ^4.6.2 version: 4.6.2(eslint@8.57.1) @@ -175,7 +175,7 @@ importers: version: 4.1.0 lerna: specifier: ^8.1.9 - version: 8.1.9(@swc-node/register@1.10.9(@swc/core@1.10.1)(typescript@5.7.2))(@swc/core@1.10.1)(babel-plugin-macros@3.1.0)(encoding@0.1.13) + version: 8.1.9(@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2))(@swc/core@1.10.1(@swc/helpers@0.5.15))(babel-plugin-macros@3.1.0)(encoding@0.1.13) lint-staged: specifier: ^12.1.2 version: 12.5.0(enquirer@2.3.6) @@ -210,20 +210,20 @@ importers: specifier: ^7.3.5 version: 7.6.3 turbo: - specifier: ^2.3.0 + specifier: ^2.3.3 version: 2.3.3 typescript: specifier: 5.7.2 version: 5.7.2 vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.10.1)(terser@5.37.0) + version: 5.4.11(@types/node@22.10.2)(terser@5.37.0) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0)) + version: 4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) vitest: - specifier: ^2.1.1 - version: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2)(jsdom@25.0.1)(terser@5.37.0) yargs: specifier: ^17.3.0 version: 17.3.0 @@ -233,11 +233,11 @@ importers: dev/design-studio: dependencies: '@sanity/icons': - specifier: ^3.5.2 - version: 3.5.2(react@18.3.1) + specifier: ^3.5.5 + version: 3.5.5(react@18.3.1) '@sanity/ui': - specifier: ^2.10.9 - version: 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + specifier: ^2.10.12 + version: 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.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.3.1 version: 18.3.1 @@ -254,8 +254,8 @@ importers: dev/embedded-studio: dependencies: '@sanity/ui': - specifier: ^2.10.9 - version: 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + specifier: ^2.10.12 + version: 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.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.3.1 version: 18.3.1 @@ -270,20 +270,20 @@ importers: version: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@types/react': - specifier: ^18.3.14 - version: 18.3.14 + specifier: ^18.3.17 + version: 18.3.17 '@types/react-dom': - specifier: ^18.3.3 - version: 18.3.3(@types/react@18.3.14) + specifier: ^18.3.5 + version: 18.3.5(@types/react@18.3.17) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0)) + version: 4.3.4(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) typescript: specifier: 5.7.2 version: 5.7.2 vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.10.1)(terser@5.37.0) + version: 5.4.11(@types/node@22.10.2)(terser@5.37.0) dev/page-building-studio: dependencies: @@ -291,14 +291,14 @@ importers: specifier: workspace:* version: link:../../packages/@sanity/vision babel-plugin-react-compiler: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206 + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215 react: specifier: ^18.2.0 version: 18.3.1 react-compiler-runtime: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215(react@18.3.1) react-dom: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) @@ -333,14 +333,14 @@ importers: dev/starter-studio: dependencies: babel-plugin-react-compiler: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206 + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215 react: specifier: ^18.3.1 version: 18.3.1 react-compiler-runtime: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215(react@18.3.1) react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) @@ -370,28 +370,28 @@ importers: dependencies: '@sanity/color-input': specifier: ^4.0.1 - version: 4.0.1(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 4.0.2(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@sanity/google-maps-input': specifier: ^4.0.0 - version: 4.0.1(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 4.1.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@sanity/icons': - specifier: ^3.5.2 - version: 3.5.2(react@18.3.1) + specifier: ^3.5.5 + version: 3.5.5(react@18.3.1) '@sanity/ui': - specifier: ^2.10.9 - version: 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + specifier: ^2.10.12 + version: 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@sanity/vision': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../../packages/@sanity/vision babel-plugin-react-compiler: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206 + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215 react: specifier: ^18.3.1 version: 18.3.1 react-compiler-runtime: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215(react@18.3.1) react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) @@ -403,10 +403,10 @@ importers: version: 5.0.0(@emotion/is-prop-valid@1.3.1)(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) sanity-plugin-media: specifier: ^2.3.1 - version: 2.3.2(@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 2.3.2(@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) sanity-plugin-mux-input: specifier: ^2.2.1 - version: 2.4.0(@emotion/is-prop-valid@1.3.1)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 2.4.0(@emotion/is-prop-valid@1.3.1)(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) sanity-test-studio: specifier: workspace:* version: link:../test-studio @@ -418,7 +418,7 @@ importers: dependencies: '@sanity/code-input': specifier: ^5.0.0 - version: 5.0.0(@babel/runtime@7.26.0)(@codemirror/theme-one-dark@6.1.2)(@emotion/is-prop-valid@1.3.1)(@lezer/common@1.2.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 5.1.2(@babel/runtime@7.26.0)(@codemirror/theme-one-dark@6.1.2)(@emotion/is-prop-valid@1.3.1)(codemirror@6.0.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) react: specifier: ^18.3.1 version: 18.3.1 @@ -438,11 +438,11 @@ importers: specifier: workspace:* version: link:../../packages/@sanity/vision babel-plugin-react-compiler: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206 + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215 next: - specifier: 15.0.4 - version: 15.0.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) + specifier: 15.1.1 + version: 15.1.1(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) react: specifier: rc version: 19.0.0-rc.1 @@ -468,16 +468,16 @@ importers: dev/test-studio: dependencies: '@portabletext/editor': - specifier: ^1.15.3 - version: 1.15.3(@sanity/block-tools@packages+@sanity+block-tools)(@sanity/schema@packages+@sanity+schema)(@sanity/types@packages+@sanity+types)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + specifier: ^1.16.3 + version: 1.16.4(@sanity/block-tools@packages+@sanity+block-tools)(@sanity/schema@packages+@sanity+schema)(@sanity/types@packages+@sanity+types)(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@portabletext/react': specifier: ^3.0.0 version: 3.2.0(react@18.3.1) '@sanity/assist': specifier: ^3.0.2 - version: 3.0.8(@emotion/is-prop-valid@1.3.1)(@sanity/mutator@packages+@sanity+mutator)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 3.0.9(@emotion/is-prop-valid@1.3.1)(@sanity/mutator@packages+@sanity+mutator)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@sanity/block-tools': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../../packages/@sanity/block-tools '@sanity/client': specifier: ^6.24.1 @@ -487,13 +487,13 @@ importers: version: 3.0.6 '@sanity/color-input': specifier: ^4.0.1 - version: 4.0.1(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 4.0.2(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@sanity/google-maps-input': specifier: ^4.0.0 - version: 4.0.1(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 4.1.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@sanity/icons': - specifier: ^3.5.2 - version: 3.5.2(react@18.3.1) + specifier: ^3.5.5 + version: 3.5.5(react@18.3.1) '@sanity/image-url': specifier: ^1.0.2 version: 1.1.0 @@ -523,19 +523,19 @@ importers: version: 2.0.5(@sanity/client@6.24.1) '@sanity/react-loader': specifier: ^1.10.27 - version: 1.10.28(react@18.3.1) + version: 1.10.30(react@18.3.1) '@sanity/tsdoc': - specifier: 1.0.150 - version: 1.0.150(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.37.0)(yaml@2.6.1) + specifier: 1.0.153 + version: 1.0.153(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.37.0)(yaml@2.6.1) '@sanity/types': specifier: workspace:* version: link:../../packages/@sanity/types '@sanity/ui': - specifier: ^2.10.9 - version: 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + specifier: ^2.10.12 + version: 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@sanity/ui-workshop': specifier: ^1.0.0 - version: 1.2.11(@sanity/icons@3.5.2(react@18.3.1))(@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/node@22.10.1)(react-dom@18.3.1(react@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))(terser@5.37.0) + version: 1.2.11(@sanity/icons@3.5.5(react@18.3.1))(@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/node@22.10.2)(react-dom@18.3.1(react@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))(terser@5.37.0) '@sanity/util': specifier: workspace:* version: link:../../packages/@sanity/util @@ -546,8 +546,8 @@ importers: specifier: workspace:* version: link:../../packages/@sanity/vision '@sanity/visual-editing': - specifier: 2.10.6 - version: 2.10.6(@sanity/client@6.24.1)(next@15.0.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.10.10 + version: 2.10.10(@sanity/client@6.24.1)(next@15.1.1(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@turf/helpers': specifier: ^6.0.1 version: 6.5.0 @@ -576,8 +576,8 @@ importers: specifier: ^18.3.1 version: 18.3.1 react-compiler-runtime: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215(react@18.3.1) react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) @@ -595,26 +595,29 @@ importers: version: link:../../packages/sanity sanity-plugin-hotspot-array: specifier: ^2.0.0 - version: 2.1.2(@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 2.1.2(@emotion/is-prop-valid@1.3.1)(@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) sanity-plugin-markdown: specifier: ^5.0.0 version: 5.0.0(@emotion/is-prop-valid@1.3.1)(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) sanity-plugin-media: specifier: ^2.3.1 - version: 2.3.2(@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 2.3.2(@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) sanity-plugin-mux-input: specifier: ^2.2.1 - version: 2.4.0(@emotion/is-prop-valid@1.3.1)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 2.4.0(@emotion/is-prop-valid@1.3.1)(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) styled-components: specifier: ^6.1.11 version: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: + '@million/lint': + specifier: 1.0.14 + version: 1.0.14(encoding@0.1.13)(rollup@4.28.1) babel-plugin-react-compiler: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206 + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215 vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.10.1)(terser@5.37.0) + version: 5.4.11(@types/node@22.10.2)(terser@5.37.0) examples/blog-studio: dependencies: @@ -649,11 +652,11 @@ importers: examples/ecommerce-studio: dependencies: '@sanity/cli': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../../packages/@sanity/cli '@sanity/ui': - specifier: ^2.10.9 - version: 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + specifier: ^2.10.12 + version: 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.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.3.1 version: 18.3.1 @@ -674,7 +677,7 @@ importers: dependencies: '@sanity/google-maps-input': specifier: ^4.0.0 - version: 4.0.1(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 4.1.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) react: specifier: ^18.3.1 version: 18.3.1 @@ -700,8 +703,8 @@ importers: specifier: workspace:* version: link:../dev-aliases vitest: - specifier: ^2.1.1 - version: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2)(jsdom@25.0.1)(terser@5.37.0) packages/@repo/test-exports: dependencies: @@ -754,11 +757,11 @@ importers: packages/@sanity/block-tools: dependencies: '@sanity/types': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../types '@types/react': specifier: ^18.3.5 - version: 18.3.14 + version: 18.3.17 get-random-values-esm: specifier: 1.0.2 version: 1.0.2 @@ -773,7 +776,7 @@ importers: specifier: workspace:* version: link:../../@repo/test-config '@sanity/schema': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../schema '@types/jsdom': specifier: ^20.0.0 @@ -786,13 +789,13 @@ importers: version: 0.1.2 '@vitest/coverage-v8': specifier: ^2.1.1 - version: 2.1.8(vitest@2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0)) + version: 2.1.8(vitest@2.1.8(@types/node@22.10.2)(jsdom@23.2.0)(terser@5.37.0)) jsdom: specifier: ^23.0.1 version: 23.2.0 vitest: - specifier: ^2.1.1 - version: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2)(jsdom@23.2.0)(terser@5.37.0) packages/@sanity/cli: dependencies: @@ -803,13 +806,16 @@ importers: specifier: ^6.24.1 version: 6.24.1(debug@4.4.0) '@sanity/codegen': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../codegen '@sanity/telemetry': specifier: ^0.7.7 version: 0.7.9(react@19.0.0-rc-f994737d14-20240522) + '@sanity/template-validator': + specifier: ^1.0.2 + version: 1.0.3(@types/babel__core@7.20.5)(@types/node@22.10.2)(debug@4.4.0) '@sanity/util': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../util chalk: specifier: ^4.1.2 @@ -847,9 +853,6 @@ importers: validate-npm-package-name: specifier: ^3.0.0 version: 3.0.0 - yaml: - specifier: ^2.6.1 - version: 2.6.1 devDependencies: '@repo/package.config': specifier: workspace:* @@ -862,7 +865,7 @@ importers: version: 3.0.1 '@rollup/plugin-node-resolve': specifier: ^15.2.3 - version: 15.3.0(rollup@4.28.1) + version: 15.3.1(rollup@4.28.1) '@sanity/eslint-config-studio': specifier: ^4.0.0 version: 4.0.0(eslint@8.57.1)(typescript@5.7.2) @@ -898,7 +901,7 @@ importers: version: 1.2.5 '@types/node': specifier: ^22.10.0 - version: 22.10.1 + version: 22.10.2 '@types/semver': specifier: ^7.5.6 version: 7.5.8 @@ -1000,10 +1003,10 @@ importers: version: 6.2.1 vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.10.1)(terser@5.37.0) + version: 5.4.11(@types/node@22.10.2)(terser@5.37.0) vitest: - specifier: ^2.1.1 - version: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2)(jsdom@25.0.1)(terser@5.37.0) which: specifier: ^2.0.2 version: 2.0.2 @@ -1057,7 +1060,7 @@ importers: version: 4.2.0 zod: specifier: ^3.22.4 - version: 3.23.8 + version: 3.24.1 devDependencies: '@repo/package.config': specifier: workspace:* @@ -1084,8 +1087,8 @@ importers: specifier: ^5.0.10 version: 5.0.10 vitest: - specifier: ^2.1.1 - version: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2)(jsdom@25.0.1)(terser@5.37.0) packages/@sanity/diff: dependencies: @@ -1109,10 +1112,10 @@ importers: specifier: ^0.11.1 version: 0.11.1(debug@4.4.0) '@sanity/types': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../types '@sanity/util': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../util arrify: specifier: ^2.0.1 @@ -1136,9 +1139,6 @@ importers: '@repo/test-config': specifier: workspace:* version: link:../../@repo/test-config - '@types/arrify': - specifier: ^2.0.1 - version: 2.0.5 '@types/debug': specifier: ^4.1.12 version: 4.1.12 @@ -1146,8 +1146,8 @@ importers: specifier: ^5.0.10 version: 5.0.10 vitest: - specifier: ^2.1.1 - version: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2)(jsdom@25.0.1)(terser@5.37.0) packages/@sanity/mutator: dependencies: @@ -1155,7 +1155,7 @@ importers: specifier: ^3.1.1 version: 3.1.1 '@sanity/types': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../types '@sanity/uuid': specifier: ^3.0.1 @@ -1183,8 +1183,8 @@ importers: specifier: ^5.0.10 version: 5.0.10 vitest: - specifier: ^2.1.1 - version: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2)(jsdom@25.0.1)(terser@5.37.0) packages/@sanity/schema: dependencies: @@ -1192,11 +1192,11 @@ importers: specifier: ^3.0.0 version: 3.0.0 '@sanity/types': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../types arrify: - specifier: ^1.0.1 - version: 1.0.1 + specifier: ^2.0.1 + version: 2.0.1 groq-js: specifier: ^1.14.2 version: 1.14.2 @@ -1220,11 +1220,8 @@ importers: specifier: workspace:* version: link:../../@repo/test-config '@sanity/icons': - specifier: ^3.5.2 - version: 3.5.2(react@19.0.0-rc-f994737d14-20240522) - '@types/arrify': - specifier: ^1.0.4 - version: 1.0.4 + specifier: ^3.5.5 + version: 3.5.5(react@19.0.0-rc-f994737d14-20240522) '@types/lodash': specifier: ^4.17.7 version: 4.17.13 @@ -1233,13 +1230,13 @@ importers: version: 1.13.0 '@types/react': specifier: ^18.3.12 - version: 18.3.14 + version: 18.3.17 rimraf: specifier: ^5.0.10 version: 5.0.10 vitest: - specifier: ^2.1.1 - version: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2)(jsdom@25.0.1)(terser@5.37.0) packages/@sanity/types: dependencies: @@ -1248,7 +1245,7 @@ importers: version: 6.24.1(debug@4.4.0) '@types/react': specifier: ^18.3.5 - version: 18.3.14 + version: 18.3.17 devDependencies: '@repo/package.config': specifier: workspace:* @@ -1261,7 +1258,7 @@ importers: version: 1.0.16(@emotion/is-prop-valid@1.3.1)(@sanity/types@packages+@sanity+types)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1)) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.0.3(@types/node@22.10.1)(terser@5.37.0)(yaml@2.6.1)) + version: 4.3.4(vite@6.0.3(@types/node@22.10.2)(terser@5.37.0)(yaml@2.6.1)) react: specifier: ^18.3.1 version: 18.3.1 @@ -1269,8 +1266,8 @@ importers: specifier: ^5.0.10 version: 5.0.10 vitest: - specifier: ^2.1.1 - version: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2)(jsdom@25.0.1)(terser@5.37.0) packages/@sanity/util: dependencies: @@ -1278,7 +1275,7 @@ importers: specifier: ^6.24.1 version: 6.24.1(debug@4.4.0) '@sanity/types': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../types get-random-values-esm: specifier: 1.0.2 @@ -1300,14 +1297,14 @@ importers: specifier: ^5.0.10 version: 5.0.10 vitest: - specifier: ^2.1.1 - version: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2)(jsdom@25.0.1)(terser@5.37.0) packages/@sanity/vision: dependencies: '@codemirror/autocomplete': specifier: ^6.1.0 - version: 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3) + version: 6.18.4 '@codemirror/commands': specifier: ^6.0.1 version: 6.7.1 @@ -1316,7 +1313,7 @@ importers: version: 6.2.2 '@codemirror/language': specifier: ^6.2.1 - version: 6.10.6 + version: 6.10.7 '@codemirror/search': specifier: ^6.0.1 version: 6.5.8 @@ -1325,7 +1322,7 @@ importers: version: 6.5.0 '@codemirror/view': specifier: ^6.1.1 - version: 6.35.3 + version: 6.36.0 '@juggle/resize-observer': specifier: ^3.3.1 version: 3.4.0 @@ -1333,23 +1330,23 @@ importers: specifier: ^1.0.0 version: 1.2.1 '@rexxars/react-json-inspector': - specifier: ^8.0.1 - version: 8.0.1(react@18.3.1) + specifier: ^9.0.1 + version: 9.0.1(react@18.3.1) '@rexxars/react-split-pane': - specifier: ^0.1.93 - version: 0.1.93(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1) + specifier: ^1.0.0 + version: 1.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1) '@sanity/color': specifier: ^3.0.0 version: 3.0.6 '@sanity/icons': - specifier: ^3.5.2 - version: 3.5.2(react@18.3.1) + specifier: ^3.5.5 + version: 3.5.5(react@18.3.1) '@sanity/ui': - specifier: ^2.10.9 - version: 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1)) + specifier: ^2.10.12 + version: 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1)) '@uiw/react-codemirror': specifier: ^4.11.4 - version: 4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3))(@codemirror/language@6.10.6)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.35.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1) + version: 4.23.7(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.4)(@codemirror/language@6.10.7)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.36.0)(codemirror@6.0.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1) is-hotkey-esm: specifier: ^1.0.0 version: 1.0.0 @@ -1366,8 +1363,8 @@ importers: specifier: ^5.1.1 version: 5.1.1 react-compiler-runtime: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215(react@18.3.1) devDependencies: '@repo/package.config': specifier: workspace:* @@ -1406,8 +1403,8 @@ importers: specifier: ^4.17.7 version: 4.17.13 babel-plugin-react-compiler: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206 + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215 react: specifier: ^18.3.1 version: 18.3.1 @@ -1421,7 +1418,7 @@ importers: packages/create-sanity: dependencies: '@sanity/cli': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../@sanity/cli resolve-pkg: specifier: ^2.0.0 @@ -1451,14 +1448,14 @@ importers: specifier: ^3.3.1 version: 3.4.0 '@portabletext/editor': - specifier: ^1.15.3 - version: 1.15.3(@sanity/block-tools@packages+@sanity+block-tools)(@sanity/schema@packages+@sanity+schema)(@sanity/types@packages+@sanity+types)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + specifier: ^1.16.3 + version: 1.16.4(@sanity/block-tools@packages+@sanity+block-tools)(@sanity/schema@packages+@sanity+schema)(@sanity/types@packages+@sanity+types)(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@portabletext/react': specifier: ^3.0.0 version: 3.2.0(react@18.3.1) '@rexxars/react-json-inspector': - specifier: ^8.0.1 - version: 8.0.1(react@18.3.1) + specifier: ^9.0.1 + version: 9.0.1(react@18.3.1) '@sanity/asset-utils': specifier: ^2.0.6 version: 2.2.1 @@ -1466,10 +1463,10 @@ importers: specifier: ^0.4.1 version: 0.4.1 '@sanity/block-tools': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../@sanity/block-tools '@sanity/cli': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../@sanity/cli '@sanity/client': specifier: ^6.24.1 @@ -1478,7 +1475,7 @@ importers: specifier: ^3.0.0 version: 3.0.6 '@sanity/diff': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../@sanity/diff '@sanity/diff-match-patch': specifier: ^3.1.1 @@ -1490,8 +1487,8 @@ importers: specifier: ^3.41.1 version: 3.41.1 '@sanity/icons': - specifier: ^3.5.2 - version: 3.5.2(react@18.3.1) + specifier: ^3.5.5 + version: 3.5.5(react@18.3.1) '@sanity/image-url': specifier: ^1.0.2 version: 1.1.0 @@ -1505,44 +1502,41 @@ importers: specifier: ^2.1.4 version: 2.1.13(@sanity/color@3.0.6)(react@18.3.1) '@sanity/migrate': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../@sanity/migrate '@sanity/mutator': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../@sanity/mutator '@sanity/presentation': specifier: 1.19.8-release.0 version: 1.19.8-release.0(@emotion/is-prop-valid@1.3.1)(@sanity/color@3.0.6)(debug@4.4.0)(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)) '@sanity/schema': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../@sanity/schema '@sanity/telemetry': specifier: ^0.7.7 version: 0.7.9(react@18.3.1) '@sanity/types': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../@sanity/types '@sanity/ui': - specifier: ^2.10.9 - version: 2.10.9(@emotion/is-prop-valid@1.3.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)) + specifier: ^2.10.12 + version: 2.10.12(@emotion/is-prop-valid@1.3.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)) '@sanity/util': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../@sanity/util '@sanity/uuid': specifier: ^3.0.1 version: 3.0.2 '@sentry/react': specifier: ^8.33.0 - version: 8.42.0(react@18.3.1) + version: 8.46.0(react@18.3.1) '@tanstack/react-table': specifier: ^8.16.0 - version: 8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 8.20.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-virtual': - specifier: 3.0.0-beta.54 - version: 3.0.0-beta.54(react@18.3.1) - '@types/react-copy-to-clipboard': - specifier: ^5.0.2 - version: 5.0.7 + specifier: ^3.11.2 + version: 3.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/react-is': specifier: ^18.3.0 version: 18.3.1 @@ -1560,13 +1554,13 @@ importers: version: 0.0.6 '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0)) + version: 4.3.4(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) archiver: specifier: ^7.0.0 version: 7.0.1 arrify: - specifier: ^1.0.1 - version: 1.0.1 + specifier: ^2.0.1 + version: 2.0.1 async-mutex: specifier: ^0.4.1 version: 0.4.1 @@ -1613,8 +1607,8 @@ importers: specifier: ^4.0.0 version: 4.0.1 framer-motion: - specifier: 11.0.8 - version: 11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^11.15.0 + version: 11.15.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) get-it: specifier: ^8.6.5 version: 8.6.5(debug@4.4.0) @@ -1636,6 +1630,9 @@ importers: is-hotkey-esm: specifier: ^1.0.0 version: 1.0.0 + isomorphic-dompurify: + specifier: ^2.19.0 + version: 2.19.0 jsdom: specifier: ^23.0.1 version: 23.2.0 @@ -1703,17 +1700,14 @@ importers: specifier: ^3.4.1 version: 3.4.1 react-compiler-runtime: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) - react-copy-to-clipboard: - specifier: ^5.0.4 - version: 5.1.0(react@18.3.1) + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215(react@18.3.1) react-fast-compare: specifier: ^3.2.0 version: 3.2.2 react-focus-lock: - specifier: ^2.8.1 - version: 2.13.2(@types/react@18.3.14)(react@18.3.1) + specifier: ^2.13.5 + version: 2.13.5(@types/react@18.3.17)(react@18.3.1) react-i18next: specifier: 14.0.2 version: 14.0.2(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1724,8 +1718,8 @@ importers: specifier: ^2.1.6 version: 2.2.0(react@18.3.1) react-rx: - specifier: ^4.1.8 - version: 4.1.8(react@18.3.1)(rxjs@7.8.1) + specifier: ^4.1.10 + version: 4.1.10(react@18.3.1)(rxjs@7.8.1) read-pkg-up: specifier: ^7.0.1 version: 7.0.1 @@ -1785,14 +1779,14 @@ importers: version: 1.4.0(react@18.3.1) vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.10.1)(terser@5.37.0) + version: 5.4.11(@types/node@22.10.2)(terser@5.37.0) yargs: specifier: ^17.3.0 version: 17.3.0 devDependencies: '@playwright/experimental-ct-react': specifier: 1.49.1 - version: 1.49.1(@types/node@22.10.1)(terser@5.37.0)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0)) + version: 1.49.1(@types/node@22.10.2)(terser@5.37.0)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) '@playwright/test': specifier: 1.49.1 version: 1.49.1 @@ -1806,38 +1800,35 @@ importers: specifier: workspace:* version: link:../@repo/test-config '@sanity/codegen': - specifier: 3.67.1 + specifier: 3.68.1 version: link:../@sanity/codegen '@sanity/generate-help-url': specifier: ^3.0.0 version: 3.0.0 '@sanity/pkg-utils': - specifier: 6.12.0 - version: 6.12.0(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(debug@4.4.0)(typescript@5.7.2) + specifier: 6.12.2 + version: 6.12.2(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(debug@4.4.0)(typescript@5.7.2) '@sanity/tsdoc': - specifier: 1.0.150 - version: 1.0.150(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(debug@4.4.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.37.0)(yaml@2.6.1) + specifier: 1.0.153 + version: 1.0.153(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(debug@4.4.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.37.0)(yaml@2.6.1) '@sanity/ui-workshop': specifier: ^1.2.11 - version: 1.2.11(@sanity/icons@3.5.2(react@18.3.1))(@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.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)))(@types/node@22.10.1)(react-dom@18.3.1(react@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))(terser@5.37.0) + version: 1.2.11(@sanity/icons@3.5.5(react@18.3.1))(@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.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)))(@types/node@22.10.2)(react-dom@18.3.1(react@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))(terser@5.37.0) '@sentry/types': specifier: ^8.12.0 - version: 8.42.0 + version: 8.46.0 '@testing-library/jest-dom': specifier: ^6.4.8 version: 6.6.3 '@testing-library/react': specifier: ^15.0.6 - version: 15.0.7(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 15.0.7(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^13.5.0 version: 13.5.0(@testing-library/dom@10.4.0) '@types/archiver': specifier: ^6.0.2 version: 6.0.3 - '@types/arrify': - specifier: ^1.0.4 - version: 1.0.4 '@types/configstore': specifier: ^5.0.1 version: 5.0.1 @@ -1855,16 +1846,16 @@ importers: version: 2.0.0 '@types/node': specifier: ^22.10.0 - version: 22.10.1 + version: 22.10.2 '@types/raf': specifier: ^3.4.0 version: 3.4.3 '@types/react': specifier: ^18.3.12 - version: 18.3.14 + version: 18.3.17 '@types/react-dom': specifier: ^18.3.1 - version: 18.3.3(@types/react@18.3.14) + version: 18.3.5(@types/react@18.3.17) '@types/refractor': specifier: ^3.0.0 version: 3.4.1 @@ -1881,8 +1872,8 @@ importers: specifier: 6.137.0 version: 6.137.0 babel-plugin-react-compiler: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206 + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215 blob-polyfill: specifier: ^9.0.20240710 version: 9.0.20240710 @@ -1906,7 +1897,7 @@ importers: version: 2.2.5(react@18.3.1) vitest: specifier: 2.1.1 - version: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + version: 2.1.1(@types/node@22.10.2)(jsdom@23.2.0)(terser@5.37.0) packages/sanity/fixtures/examples/prj-with-react-18: dependencies: @@ -1951,13 +1942,13 @@ importers: version: 6.24.1(debug@4.4.0) '@swc-node/register': specifier: ^1.10.9 - version: 1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.13))(@swc/types@0.1.17)(typescript@5.7.2) + version: 1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2) '@types/react': specifier: ^18.3.12 - version: 18.3.14 + version: 18.3.17 '@types/react-dom': specifier: ^18.3.1 - version: 18.3.3(@types/react@18.3.14) + version: 18.3.5(@types/react@18.3.17) '@types/serve-handler': specifier: ^6.1.4 version: 6.1.4 @@ -1966,10 +1957,10 @@ importers: version: 17.0.33 '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0)) + version: 4.3.4(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) babel-plugin-react-compiler: - specifier: 19.0.0-beta-df7b47d-20241124 - version: 19.0.0-beta-df7b47d-20241124 + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215 chalk: specifier: ^4.1.2 version: 4.1.2 @@ -1992,14 +1983,14 @@ importers: specifier: ^18.3.1 version: 18.3.1 react-compiler-runtime: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215(react@18.3.1) react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) rollup-plugin-sourcemaps: specifier: ^0.6.3 - version: 0.6.3(@types/node@22.10.1)(rollup@4.28.1) + version: 0.6.3(@types/node@22.10.2)(rollup@4.28.1) sanity: specifier: workspace:* version: link:../../packages/sanity @@ -2011,7 +2002,7 @@ importers: version: 0.7.4 vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.10.1)(terser@5.37.0) + version: 5.4.11(@types/node@22.10.2)(terser@5.37.0) yargs: specifier: 17.3.0 version: 17.3.0 @@ -2019,14 +2010,14 @@ importers: perf/studio: dependencies: babel-plugin-react-compiler: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206 + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215 react: specifier: ^18.3.1 version: 18.3.1 react-compiler-runtime: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + specifier: 19.0.0-beta-201e55d-20241215 + version: 19.0.0-beta-201e55d-20241215(react@18.3.1) react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) @@ -2075,19 +2066,19 @@ importers: version: 4.17.13 '@types/node': specifier: ^18.15.3 - version: 18.19.67 + version: 18.19.68 esbuild: specifier: 0.21.5 version: 0.21.5 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.10.1)(@types/node@18.19.67)(typescript@5.7.2) + version: 10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@18.19.68)(typescript@5.7.2) typescript: specifier: 5.7.2 version: 5.7.2 vitest: - specifier: ^2.1.1 - version: 2.1.1(@types/node@18.19.67)(jsdom@23.2.0)(terser@5.37.0) + specifier: ^2.1.8 + version: 2.1.8(@types/node@18.19.68)(jsdom@25.0.1)(terser@5.37.0) packages: @@ -2097,6 +2088,9 @@ packages: '@actions/exec@1.1.1': resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} + '@actions/github@6.0.0': + resolution: {integrity: sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==} + '@actions/http-client@2.2.3': resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} @@ -2110,9 +2104,17 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@antfu/ni@0.21.12': + resolution: {integrity: sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==} + hasBin: true + '@asamuzakjp/dom-selector@2.0.2': resolution: {integrity: sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==} + '@axiomhq/js@1.0.0-rc.3': + resolution: {integrity: sha512-Zm10TczcMLounWqC42nMkXQ7XKLqjzLrd5ia022oBKDUZqAFVg2y9d1quQVNV4FlXyg9MKDdfMjpKQRmzEGaog==} + engines: {node: '>=16'} + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -2680,6 +2682,10 @@ packages: resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + '@babel/types@7.26.3': resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} @@ -2687,13 +2693,19 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@codemirror/autocomplete@6.18.3': - resolution: {integrity: sha512-1dNIOmiM0z4BIBwxmxEfA1yoxh1MF/6KPBbh20a5vphGV0ictKlgQsbJs6D6SkR6iJpGbpwRsa6PFMNlg9T9pQ==} - peerDependencies: - '@codemirror/language': ^6.0.0 - '@codemirror/state': ^6.0.0 - '@codemirror/view': ^6.0.0 - '@lezer/common': ^1.0.0 + '@clack/core@0.3.5': + resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} + + '@clack/prompts@0.7.0': + resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} + bundledDependencies: + - is-unicode-supported + + '@clack/prompts@0.8.2': + resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==} + + '@codemirror/autocomplete@6.18.4': + resolution: {integrity: sha512-sFAphGQIqyQZfP2ZBsSHV7xQvo9Py0rV0dW7W3IMRdS+zDuNb2l3no78CvUaWKGfzFjI4FTrLdUSj86IGb2hRA==} '@codemirror/commands@6.7.1': resolution: {integrity: sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==} @@ -2722,8 +2734,8 @@ packages: '@codemirror/lang-sql@6.8.0': resolution: {integrity: sha512-aGLmY4OwGqN3TdSx3h6QeA1NrvaYtF7kkoWR/+W7/JzB0gQtJ+VJxewlnE3+VImhA4WVlhmkJr109PefOOhjLg==} - '@codemirror/language@6.10.6': - resolution: {integrity: sha512-KrsbdCnxEztLVbB5PycWXFxas4EOyk/fPAfruSOnDDppevQgid2XZ+KbJ9u+fDikP/e7MW7HPBTvTb8JlZK9vA==} + '@codemirror/language@6.10.7': + resolution: {integrity: sha512-aOswhVOLYhMNeqykt4P7+ukQSpGL0ynZYaEyFDVHE7fl2xgluU3yuE9MdgYNfw6EmaNidoFMIQ2iTh1ADrnT6A==} '@codemirror/legacy-modes@6.4.2': resolution: {integrity: sha512-HsvWu08gOIIk303eZQCal4H4t65O/qp1V4ul4zVa3MHK5FJ0gz3qz3O55FIkm+aQUcshUOjBx38t2hPiJwW5/g==} @@ -2740,8 +2752,8 @@ packages: '@codemirror/theme-one-dark@6.1.2': resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==} - '@codemirror/view@6.35.3': - resolution: {integrity: sha512-ScY7L8+EGdPl4QtoBiOzE4FELp7JmNUsBvgBcCakXWM2uiv/K89VAzU3BMDscf0DsACLvTKePbd5+cFDTcei6g==} + '@codemirror/view@6.36.0': + resolution: {integrity: sha512-aMePDnkNNKE8dSOo1w689xYa3dijREbRajiRcgjSGc2TWN7MTdE+9pm5fxwdz0C4D9Di1VZomrn2M+xDe7tTVg==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -2859,6 +2871,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -2883,6 +2901,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -2907,6 +2931,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -2931,6 +2961,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -2955,6 +2991,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -2979,6 +3021,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -3003,6 +3051,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -3027,6 +3081,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -3051,6 +3111,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -3075,6 +3141,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -3099,6 +3171,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -3123,6 +3201,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -3147,6 +3231,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -3171,6 +3261,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -3195,6 +3291,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -3219,6 +3321,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -3243,6 +3351,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -3267,6 +3381,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -3297,6 +3417,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -3321,6 +3447,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -3345,6 +3477,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -3369,6 +3507,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -3393,6 +3537,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -3458,6 +3608,12 @@ packages: resolution: {integrity: sha512-H41bPL2cMfSi4EEnFzKvg7XSb7T67ocSXrmF7MPjfgFB0L6CKGzfIYJheAZi1iqXjz6XaCT1OBf6HCG5vDBTOQ==} engines: {node: '>=14'} + '@hono/node-server@1.13.7': + resolution: {integrity: sha512-kTfUMsoloVKtRA2fLiGSd9qBddmru9KadNyhJCwgKBxTiNkaAJEwkVN9KV/rS4HtmmNRtUh6P+YpmjRMl0d9vQ==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + '@hookform/resolvers@3.9.1': resolution: {integrity: sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==} peerDependencies: @@ -3612,8 +3768,8 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -3676,11 +3832,11 @@ packages: '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - '@microsoft/api-extractor-model@7.30.0': - resolution: {integrity: sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug==} + '@microsoft/api-extractor-model@7.30.1': + resolution: {integrity: sha512-CTS2PlASJHxVY8hqHORVb1HdECWOEMcMnM6/kDkPr0RZapAFSIHhg9D4jxuE8g+OWYHtPc10LCpmde5pylTRlA==} - '@microsoft/api-extractor@7.48.0': - resolution: {integrity: sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ==} + '@microsoft/api-extractor@7.48.1': + resolution: {integrity: sha512-HN9Osa1WxqLM66RaqB5nPAadx+nTIQmY/XtkFdaJvusjG8Tus++QqZtD7KPZDSkhEMGHsYeSyeU8qUzCDUXPjg==} hasBin: true '@microsoft/tsdoc-config@0.17.0': @@ -3695,6 +3851,14 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + '@million/install@1.0.14': + resolution: {integrity: sha512-xZvj4AEHc5hyn8RCiLl9dYNqggj2fa0lgNvUkCiJyhRJPNE2hZrUa/Ka0Weu82VpBaO//zujG0YErk7osjNXPA==} + hasBin: true + + '@million/lint@1.0.14': + resolution: {integrity: sha512-u6/kglVwZRu5+GMmtkNlGLqJVkgTl0TtM+hLa9rBg7pldx+5NG5bk45NvL37uZmAr2Xfa1C6qHb7GrFwfP372g==} + hasBin: true + '@mux/mux-player-react@2.9.1': resolution: {integrity: sha512-1BpMs1J7P+d+/QCf9/mkTk/NPYR6sOskR4Ih0uFZjDAqNUN7/C9Q0FEJ6hF3sFXwAXo50RhnfCzsC5uYx3QHbA==} peerDependencies: @@ -3720,6 +3884,106 @@ packages: '@mux/upchunk@3.4.0': resolution: {integrity: sha512-ZaX4u6xRhmgB4UAmw0lvO0LB1LddbRgSILkjRDnk1F4QDtkCOuY9nOh550TNI7uKYcf6HZQax7QXst6EkpjiyQ==} + '@napi-rs/nice-android-arm-eabi@1.0.1': + resolution: {integrity: sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/nice-android-arm64@1.0.1': + resolution: {integrity: sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/nice-darwin-arm64@1.0.1': + resolution: {integrity: sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/nice-darwin-x64@1.0.1': + resolution: {integrity: sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/nice-freebsd-x64@1.0.1': + resolution: {integrity: sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/nice-linux-arm-gnueabihf@1.0.1': + resolution: {integrity: sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/nice-linux-arm64-gnu@1.0.1': + resolution: {integrity: sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-arm64-musl@1.0.1': + resolution: {integrity: sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-ppc64-gnu@1.0.1': + resolution: {integrity: sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/nice-linux-riscv64-gnu@1.0.1': + resolution: {integrity: sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/nice-linux-s390x-gnu@1.0.1': + resolution: {integrity: sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/nice-linux-x64-gnu@1.0.1': + resolution: {integrity: sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-linux-x64-musl@1.0.1': + resolution: {integrity: sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-win32-arm64-msvc@1.0.1': + resolution: {integrity: sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/nice-win32-ia32-msvc@1.0.1': + resolution: {integrity: sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/nice-win32-x64-msvc@1.0.1': + resolution: {integrity: sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/nice@1.0.1': + resolution: {integrity: sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==} + engines: {node: '>= 10'} + '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} @@ -3729,8 +3993,8 @@ packages: '@next/env@14.2.20': resolution: {integrity: sha512-JfDpuOCB0UBKlEgEy/H6qcBSzHimn/YWjUHzKl1jMeUO+QVRdzmTTl8gFJaNO87c8DXmVKhFCtwxQ9acqB3+Pw==} - '@next/env@15.0.4': - resolution: {integrity: sha512-WNRvtgnRVDD4oM8gbUcRc27IAhaL4eXQ/2ovGbgLnPGUvdyDr8UdXP4Q/IBDdAdojnD2eScryIDirv0YUCjUVw==} + '@next/env@15.1.1': + resolution: {integrity: sha512-ldU8IpUqxa87LsWyMh8eIqAzejt8+ZuEsdtCV+fpDog++cBO5b/PWaI7wQQwun8LKJeFFpnY4kv/6r+/dCON6A==} '@next/swc-darwin-arm64@14.2.20': resolution: {integrity: sha512-WDfq7bmROa5cIlk6ZNonNdVhKmbCv38XteVFYsxea1vDJt3SnYGgxLGMTXQNfs5OkFvAhmfKKrwe7Y0Hs+rWOg==} @@ -3738,8 +4002,8 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.0.4': - resolution: {integrity: sha512-QecQXPD0yRHxSXWL5Ff80nD+A56sUXZG9koUsjWJwA2Z0ZgVQfuy7gd0/otjxoOovPVHR2eVEvPMHbtZP+pf9w==} + '@next/swc-darwin-arm64@15.1.1': + resolution: {integrity: sha512-pq7Hzu0KaaH6UYcCQ22mOuj2mWCD6iqGvYprp/Ep1EcCxbdNOSS+8EJADFbPHsaXLkaonIJ8lTKBGWXaFxkeNQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -3750,8 +4014,8 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.0.4': - resolution: {integrity: sha512-pb7Bye3y1Og3PlCtnz2oO4z+/b3pH2/HSYkLbL0hbVuTGil7fPen8/3pyyLjdiTLcFJ+ymeU3bck5hd4IPFFCA==} + '@next/swc-darwin-x64@15.1.1': + resolution: {integrity: sha512-h567/b/AHAnMpaJ1D3l3jKLrzNOgN9bmDSRd+Gb0hXTkLZh8mE0Kd9MbIw39QeTZQJ3192uFRFWlDjWiifwVhQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -3762,8 +4026,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.0.4': - resolution: {integrity: sha512-12oSaBFjGpB227VHzoXF3gJoK2SlVGmFJMaBJSu5rbpaoT5OjP5OuCLuR9/jnyBF1BAWMs/boa6mLMoJPRriMA==} + '@next/swc-linux-arm64-gnu@15.1.1': + resolution: {integrity: sha512-I5Q6M3T9jzTUM2JlwTBy/VBSX+YCDvPLnSaJX5wE5GEPeaJkipMkvTA9+IiFK5PG5ljXTqVFVUj5BSHiYLCpoQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3774,8 +4038,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.0.4': - resolution: {integrity: sha512-QARO88fR/a+wg+OFC3dGytJVVviiYFEyjc/Zzkjn/HevUuJ7qGUUAUYy5PGVWY1YgTzeRYz78akQrVQ8r+sMjw==} + '@next/swc-linux-arm64-musl@15.1.1': + resolution: {integrity: sha512-4cPMSYmyXlOAk8U04ouEACEGnOwYM9uJOXZnm9GBXIKRbNEvBOH9OePhHiDWqOws6iaHvGayaKr+76LmM41yJA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3786,8 +4050,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.0.4': - resolution: {integrity: sha512-Z50b0gvYiUU1vLzfAMiChV8Y+6u/T2mdfpXPHraqpypP7yIT2UV9YBBhcwYkxujmCvGEcRTVWOj3EP7XW/wUnw==} + '@next/swc-linux-x64-gnu@15.1.1': + resolution: {integrity: sha512-KgIiKDdV35KwL9TrTxPFGsPb3J5RuDpw828z3MwMQbWaOmpp/T4MeWQCwo+J2aOxsyAcfsNE334kaWXCb6YTTA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3798,8 +4062,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.0.4': - resolution: {integrity: sha512-7H9C4FAsrTAbA/ENzvFWsVytqRYhaJYKa2B3fyQcv96TkOGVMcvyS6s+sj4jZlacxxTcn7ygaMXUPkEk7b78zw==} + '@next/swc-linux-x64-musl@15.1.1': + resolution: {integrity: sha512-aHP/29x8loFhB3WuW2YaWaYFJN389t6/SBsug19aNwH+PRLzDEQfCvtuP6NxRCido9OAoExd+ZuYJKF9my1Kpg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3810,8 +4074,8 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.0.4': - resolution: {integrity: sha512-Z/v3WV5xRaeWlgJzN9r4PydWD8sXV35ywc28W63i37G2jnUgScA4OOgS8hQdiXLxE3gqfSuHTicUhr7931OXPQ==} + '@next/swc-win32-arm64-msvc@15.1.1': + resolution: {integrity: sha512-klbzXYwqHMwiucNFF0tWiWJyPb45MBX1q/ATmxrMjEYgA+V/0OXc9KmNVRIn6G/ab0ASUk4uWqxik5m6wvm1sg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -3828,8 +4092,8 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@15.0.4': - resolution: {integrity: sha512-NGLchGruagh8lQpDr98bHLyWJXOBSmkEAfK980OiNBa7vNm6PsNoPvzTfstT78WyOeMRQphEQ455rggd7Eo+Dw==} + '@next/swc-win32-x64-msvc@15.1.1': + resolution: {integrity: sha512-V5fm4aULqHSlMQt3U1rWAWuwJTFsb6Yh4P8p1kQFoayAF9jAQtjBvHku4zCdrtQuw9u9crPC0FNML00kN4WGhA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3911,67 +4175,67 @@ packages: resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} engines: {node: ^16.14.0 || >=18.0.0} - '@nx/devkit@20.2.1': - resolution: {integrity: sha512-boNTu7Z7oHkYjrYg5Wzg+cQfbEJ2nntRj1eI99w8mp4qz2B4PEEjJOB0BZafR54ZcKpGEbyp/QBB945GsjTUbw==} + '@nx/devkit@20.2.2': + resolution: {integrity: sha512-uqs0LVvuRRVAfFdn0ewvmr1vsNV9Ztugw36emcLJxskqhBZb10K+vzdTDAZpg5aVE2ISg1BmPidoOyk1tP+Omg==} peerDependencies: nx: '>= 19 <= 21' - '@nx/nx-darwin-arm64@20.2.1': - resolution: {integrity: sha512-nJcyPZfH6Vq4cG6gRnQ8PcnVOLePeT3exzLnQu0I4I2EtCTPyCSRA3gxoGzZ3qZFMQTsCbwv4HYfdx42AXOTAQ==} + '@nx/nx-darwin-arm64@20.2.2': + resolution: {integrity: sha512-gnS5mtbaBAO5TJkl4T68rQaN/79MMWePavw2SOcFyFnIdAriGEZ+ZFDUE0B/xYJSs9CPWLaGHf+n7oqyxaGd9A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@20.2.1': - resolution: {integrity: sha512-SEiN8fjEs010ME4PRP8O9f8qG8AMZBGz8hOkF6ZrdlC+iEi4iyAGpgWFq8PKBlpVW4G5gxR91Y7eVaTKAsgH5w==} + '@nx/nx-darwin-x64@20.2.2': + resolution: {integrity: sha512-IctvdQon+K8mlhl06zIq1xTPwf5L4OuS7crzCmK26p5F/lV6iz/UXSPCcgn+bYKOL/q3QCLNR7UasQMjzgCNkQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@20.2.1': - resolution: {integrity: sha512-/yEKS9q17EG2Ci130McvpZM5YUghH1ql9UXWbVmitufn+RQD90hoblkG/B+cxJeZonrdKAjdpLQ+hfVz+FBd/g==} + '@nx/nx-freebsd-x64@20.2.2': + resolution: {integrity: sha512-4/Blg9Y6LVU8tS8yoa2BEXPHWsorpvCuZRH0gXPh96i6b71o4ORPafyLOHp08o3WjtUZb4jl5TfDryE+8y62ZA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@20.2.1': - resolution: {integrity: sha512-DPtRjTCJ5++stTGtjqYftCb2c0CNed2s2EZZLQuDP+tikTsLm0d3S3ZaU5eHhqZW35tQuMOVweOfC1nJ3/DTSA==} + '@nx/nx-linux-arm-gnueabihf@20.2.2': + resolution: {integrity: sha512-AVAxbUXi6q+inmp8re3OV7HzH6fbkKnnMKvjDLnkzK8dA2Mv4JFl/gz++rgkYfEsBk20lcB1i3unqNrtOvzS7Q==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@20.2.1': - resolution: {integrity: sha512-ggGwHOEP6UjXeqv6DtRxizeBnX/zRZi8BRJbEJBwAt1cAUnLlklk8d+Hmjs+j/FlFXBV9f+ylpAqoYkplFR8jg==} + '@nx/nx-linux-arm64-gnu@20.2.2': + resolution: {integrity: sha512-h04SLH464Oh/k/1mpAfsMhTVlnc1NJItx4N5DLZb2VuOOY+Tquhrp7HBJLyAhU0Q74JG0LevGFO6wdxliHupmA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-musl@20.2.1': - resolution: {integrity: sha512-HZBGxsBJUFbWVTiyJxqt0tS8tlvp+Tp0D533mGKW75cU0rv9dnmbtTwkkkx+LXqerjSRvNS3Qtj0Uh2w92Vtig==} + '@nx/nx-linux-arm64-musl@20.2.2': + resolution: {integrity: sha512-rnRXDLvHHj66rCslD4ShDq6KBOVsQ+X63GWTGKM0pnTIIDje9+ltZCoAByieCUm4BvFfCWMUf9y0mGfZvLVKSw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@nx/nx-linux-x64-gnu@20.2.1': - resolution: {integrity: sha512-pTytPwGiPRakqz2PKiWTSRNm9taE1U9n0+kRAAFzbOtzeW+eIoebe5xY5QMoZ+XtIZ6pJM2BUOyMD+/TX57r8Q==} + '@nx/nx-linux-x64-gnu@20.2.2': + resolution: {integrity: sha512-K1Z2DVTnyCGl4nolhZ8fvHEixoe1pZOY256LD6D0lGca4Fsi3mHQ7lDU237Pzyc91+cfLva/OAvrivRPeU+DMA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@nx/nx-linux-x64-musl@20.2.1': - resolution: {integrity: sha512-p3egqe5zmwiDl6xSwHi2K9UZWiKbZ/s/j4qV+pZttzMyNPfhohTeP+VwQqjTeQ1hPBl2YhwmmktEPsIPYJG7YA==} + '@nx/nx-linux-x64-musl@20.2.2': + resolution: {integrity: sha512-pyWe+d2Y2pJVgPZf27KkDBufhFPq+Xhs3/zAQdJbicMvym7uhw0qMTV+lmoMXgfx52WZzhqTfG8JQcDqHjExJw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@nx/nx-win32-arm64-msvc@20.2.1': - resolution: {integrity: sha512-Wujist6k08pjgWWQ1pjXrCArmMgnyIXNVmDP14cWo1KHecBuxNWa9i62PrxQ0K8MLYMcAzLHJxN9t54GzBbd+g==} + '@nx/nx-win32-arm64-msvc@20.2.2': + resolution: {integrity: sha512-zqSoVrV34tx6qhQo/PwD9IMGhzoNSaFQxjTjNCY61sE7iwi5Qt4dDs3Rlh1ZFCBFnrjziymRPY2RryArgeK8Bw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@nx/nx-win32-x64-msvc@20.2.1': - resolution: {integrity: sha512-tsEYfNV2+CWSQmbh9TM8cX5wk6F2QAH0tfvt4topyOOaR40eszW8qc/eDM/kkJ5nj87BbNEqPBQAYFE0AP1OMA==} + '@nx/nx-win32-x64-msvc@20.2.2': + resolution: {integrity: sha512-IfQf2axmCuSArhFGaocIDt8ajWDHXoVut5NOQH4eV2q9whP1j/LVB8EehEaolF5UenM7rhL4V25PXPuuBaUq4A==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3980,21 +4244,43 @@ packages: resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} engines: {node: '>= 14'} + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + '@octokit/core@4.2.4': resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} engines: {node: '>= 14'} + '@octokit/core@5.2.0': + resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==} + engines: {node: '>= 18'} + '@octokit/endpoint@7.0.6': resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} engines: {node: '>= 14'} + '@octokit/endpoint@9.0.5': + resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} + engines: {node: '>= 18'} + '@octokit/graphql@5.0.6': resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} engines: {node: '>= 14'} + '@octokit/graphql@7.1.0': + resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} + engines: {node: '>= 18'} + '@octokit/openapi-types@18.1.1': resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==} + '@octokit/openapi-types@20.0.0': + resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} + + '@octokit/openapi-types@22.2.0': + resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} + '@octokit/plugin-enterprise-rest@6.0.1': resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} @@ -4004,11 +4290,23 @@ packages: peerDependencies: '@octokit/core': '>=4' + '@octokit/plugin-paginate-rest@9.2.1': + resolution: {integrity: sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + '@octokit/plugin-request-log@1.0.4': resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} peerDependencies: '@octokit/core': '>=3' + '@octokit/plugin-rest-endpoint-methods@10.4.1': + resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + '@octokit/plugin-rest-endpoint-methods@7.2.3': resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} engines: {node: '>= 14'} @@ -4019,10 +4317,18 @@ packages: resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} engines: {node: '>= 14'} + '@octokit/request-error@5.1.0': + resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} + engines: {node: '>= 18'} + '@octokit/request@6.2.8': resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} engines: {node: '>= 14'} + '@octokit/request@8.4.0': + resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==} + engines: {node: '>= 18'} + '@octokit/rest@19.0.11': resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} engines: {node: '>= 14'} @@ -4033,6 +4339,12 @@ packages: '@octokit/types@10.0.0': resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + '@octokit/types@12.6.0': + resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} + + '@octokit/types@13.6.2': + resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==} + '@octokit/types@9.3.2': resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} @@ -4135,13 +4447,13 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} - '@portabletext/editor@1.15.3': - resolution: {integrity: sha512-IlpEdSCR5O3W2AowbloCQ4hXOxfhmze0+75Q5qxubwkAWZOKb0/ByQdTV9ZjwoRc4DU/TtnOTsY3aHPXCPvpEA==} + '@portabletext/editor@1.16.4': + resolution: {integrity: sha512-tQ1ZHI0ek31wDaCx7FB27Twi1f05yHUqj4i81YsjQSOjR4pOnPVZupUbSzjKprw5mLQPMhLlRl6olprhdtgocw==} engines: {node: '>=18'} peerDependencies: - '@sanity/block-tools': ^3.66.1 - '@sanity/schema': ^3.66.1 - '@sanity/types': ^3.66.1 + '@sanity/block-tools': ^3.67.1 + '@sanity/schema': ^3.67.1 + '@sanity/types': ^3.67.1 react: ^16.9 || ^17 || ^18 || ^19 rxjs: ^7.8.1 styled-components: ^6.1.13 @@ -4178,16 +4490,16 @@ packages: resolution: {integrity: sha512-+/fA3IOwEw4IWjON1FVumvemdEBsAosk1aoy+2Y6l2FqDuxOSGSxjgehLuydfNXG62s0p/z9hzvv2pv7TL3UWQ==} engines: {node: '>=12.0.0'} - '@rexxars/react-json-inspector@8.0.1': - resolution: {integrity: sha512-XAsgQwqG8fbDGpWnsvOesRMgPfvwuU7Cx3/cUf/fNIRmGP8lj2YYIf5La/4ayvZLWlSw4tTb4BPCKdmK9D8RuQ==} + '@rexxars/react-json-inspector@9.0.1': + resolution: {integrity: sha512-4uZ4RnrVoOGOShIKKcPoF+qhwDCZJsPPqyoEoW/8HRdzNknN9Q2yhlbEgTX1lMZunF1fv7iHzAs+n1vgIgfg/g==} peerDependencies: - react: ^15 || ^16 || ^17 || ^18 + react: ^18 || ^19 - '@rexxars/react-split-pane@0.1.93': - resolution: {integrity: sha512-Pok8zATwd5ZpWnccJeSA/JM2MPmi3D04duYtrbMNRgzeAU2ANtq3r4w7ldbjpGyfJqggqn0wDNjRqaevXqSxQg==} + '@rexxars/react-split-pane@1.0.0': + resolution: {integrity: sha512-Ewl8ugA2VQd+idzcg65WFbYh/oCLPOFjeDKpebexPgFDDX8ZwsHZWy5jNwiIWI8txDidVmRP98lsnmBHlIywWA==} peerDependencies: - react: ^18 - react-dom: ^18 + react: ^18 || ^19 + react-dom: ^18 || ^19 '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} @@ -4211,8 +4523,8 @@ packages: rollup: optional: true - '@rollup/plugin-commonjs@28.0.1': - resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} + '@rollup/plugin-commonjs@28.0.2': + resolution: {integrity: sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==} engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 @@ -4229,8 +4541,17 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@15.3.0': - resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} + '@rollup/plugin-node-resolve@15.3.1': + resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.0': + resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -4238,8 +4559,8 @@ packages: rollup: optional: true - '@rollup/plugin-replace@6.0.1': - resolution: {integrity: sha512-2sPh9b73dj5IxuMmDAsQWVFT7mR+yoHweBaXG2W/R8vQ+IWZlnaI7BR7J6EguVQUp1hd8Z7XuozpDjEKQAAC2Q==} + '@rollup/plugin-replace@6.0.2': + resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -4262,8 +4583,8 @@ packages: peerDependencies: rollup: ^1.20.0||^2.0.0 - '@rollup/pluginutils@5.1.3': - resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -4366,14 +4687,17 @@ packages: cpu: [x64] os: [win32] + '@rrweb/types@2.0.0-alpha.16': + resolution: {integrity: sha512-E6cACNVsm+NUhn7dzocQoKyXI7BHrHRRm5Ab23yrAzEQ2caWocCEYJhqDlc4KRVJBkQfXZfyWm8+2d0uggFuZg==} + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} '@rushstack/eslint-patch@1.10.4': resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} - '@rushstack/node-core-library@5.10.0': - resolution: {integrity: sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw==} + '@rushstack/node-core-library@5.10.1': + resolution: {integrity: sha512-BSb/KcyBHmUQwINrgtzo6jiH0HlGFmrUy33vO6unmceuVKTEyL2q+P0fQq2oB5hvXVWOEUhxB2QvlkZluvUEmg==} peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -4383,54 +4707,54 @@ packages: '@rushstack/rig-package@0.5.3': resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - '@rushstack/terminal@0.14.3': - resolution: {integrity: sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw==} + '@rushstack/terminal@0.14.4': + resolution: {integrity: sha512-NxACqERW0PHq8Rpq1V6v5iTHEwkRGxenjEW+VWqRYQ8T9puUzgmGHmEZUaUEDHAe9Qyvp0/Ew04sAiQw9XjhJg==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/ts-command-line@4.23.1': - resolution: {integrity: sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA==} + '@rushstack/ts-command-line@4.23.2': + resolution: {integrity: sha512-JJ7XZX5K3ThBBva38aomgsPv1L7FV6XmSOcR6HtM7HDFZJkepqT65imw26h9ggGqMjsY0R9jcl30tzKcVj9aOQ==} '@sanity/asset-utils@2.2.1': resolution: {integrity: sha512-dBsZWH5X6ANcvclFRnQT9Y+NNvoWTJZIMKR5HT6hzoRpRb48p7+vWn+wi1V1wPvqgZg2ScsOQQcGXWXskbPbQQ==} engines: {node: '>=18'} - '@sanity/assist@3.0.8': - resolution: {integrity: sha512-5M5lBBGuhuHd0gFpqKsvcVmv6K1JT0SGvokug9qPQDGyiYDjMzby6qPv2TGxXjQ1JSg4pdxv5u+lYlg8h+jzig==} + '@sanity/assist@3.0.9': + resolution: {integrity: sha512-F2HygMzm8lyc5QHl6TL3Cu0tLvfZaAFvmtAtkVzkuzdbMBlyw5h397jO8KrFsifq0co/xijXtKPABTek+Oiyig==} engines: {node: '>=14'} peerDependencies: '@sanity/mutator': ^3.36.4 - react: ^18 + react: ^18 || ^19 sanity: ^3.36.4 styled-components: ^6.1 '@sanity/bifur-client@0.4.1': resolution: {integrity: sha512-mHM8WR7pujbIw2qxuV0lzinS1izOoyLza/ejWV6quITTLpBhUoPIQGPER3Ar0SON5JV0VEEqkJGa1kjiYYgx2w==} - '@sanity/browserslist-config@1.0.3': - resolution: {integrity: sha512-UkJuiTyROgPcxbvpHYyXwr+T88Np4eLzu3h05gMgeZ2hv3EM7g/4VMyng5HuA1JdPQPEdq8bmmfQDR+u4KC+TA==} + '@sanity/browserslist-config@1.0.5': + resolution: {integrity: sha512-so+/UtCge8t1jq509hH0otbbptRz0zM/Aa0dh5MhMD7HGT6n2igWIL2VWH/9QR9e77Jn3dJsjz23mW1WCxT+sg==} '@sanity/client@6.24.1': resolution: {integrity: sha512-k5aW5C8RdqVGnvuX0KZ+AAIlhYueb6sx3edhKkIMmr2UfD8vSTSW3oAXVt+/WlBstlMIqvkc5RCLLWZQcF3gaA==} engines: {node: '>=14.18'} - '@sanity/code-input@5.0.0': - resolution: {integrity: sha512-mF4BlJzaTJCNai2obRdc8IJTNZtVH9aiZTTpdNMABGTnJhv0gNHhhVo5+SEI1rPAhFogRRu8VtVzEcWFnyGkFQ==} - engines: {node: '>=14'} + '@sanity/code-input@5.1.2': + resolution: {integrity: sha512-hYqNYn4Qtl+Q6787bM8P6gZJ5DbGzpFDKhFeZM2jQ1TnM2/CrUVmQBTuos5FxfJbgQwBX+I42EDjip8moYZl3g==} + engines: {node: '>=18'} peerDependencies: - react: ^18 - react-dom: ^18 + react: ^18 || >=19.0.0-0 + react-dom: ^18 || >=19.0.0-0 sanity: ^3 styled-components: ^5.2 || ^6 - '@sanity/color-input@4.0.1': - resolution: {integrity: sha512-Ra/IZO7j5vsx5VIF1OGIoeVfgwZu74tii8qOLuLQIRYbd6Av8si1mQFl6MOBu/kzWKWURE6JEN8+Ac1K2fi8Ww==} + '@sanity/color-input@4.0.2': + resolution: {integrity: sha512-4FMaIVouv8cQzyIs8AkZvGTTKzvgJxGtX795nlO1k35YfZgeEhakxwLLYgjkaEzVyCwYVTRqSOjtqjvAesKWJA==} engines: {node: '>=18'} peerDependencies: - react: ^18.3 + react: ^18.3 || ^19 sanity: ^3.23.0 styled-components: ^6.1 @@ -4438,16 +4762,16 @@ packages: resolution: {integrity: sha512-2TjYEvOftD0v7ukx3Csdh9QIu44P2z7NDJtlC3qITJRYV36J7R6Vfd3trVhFnN77/7CZrGjqngrtohv8VqO5nw==} engines: {node: '>=18.0.0'} - '@sanity/comlink@2.0.1': - resolution: {integrity: sha512-Sdl0qCHwtKxEZ7Xa2xjKYslosmPteWB3p81u84X8PdTocVqp036S6r3vgQJPHlcEiEaJgMjpEJkjUaR8Jx5BcA==} + '@sanity/comlink@2.0.2': + resolution: {integrity: sha512-8FUwaBrfjsQYWuoS8t+krllLQH0/khd6PT9bQ5Ac7xgHQEnZCzOXSxx+ENL0daCIdpqCpIu7nYUA2qLUUpQqEg==} engines: {node: '>=18'} '@sanity/comlink@2.0.2-release.0': resolution: {integrity: sha512-3/2qvb0j24JFf8F75BgxdUPpFW7xiV/VubTu0/fhBqUhP5IimS61AJ5nBBX3shxR1DX/PWmx249olcn39eHNQw==} engines: {node: '>=18'} - '@sanity/core-loader@1.7.19': - resolution: {integrity: sha512-pQBZeXMz0/ZPudwyFrla6DW3CZmH0QrV4+srRmRc6H76aiOC3m9k9LlI+mB6oldHf/zM/47gFe/P+dh77NZAkQ==} + '@sanity/core-loader@1.7.21': + resolution: {integrity: sha512-DeZn2czD3uqSbZzeZD3UggtV49l9qMZx9f1n7QLgD5Fj+o3ZmUbYWIWE/5PGH95Jnpg80rDap6vuAvPyMp9sWQ==} engines: {node: '>=18'} '@sanity/diff-match-patch@3.1.1': @@ -4473,27 +4797,16 @@ packages: '@sanity/generate-help-url@3.0.0': resolution: {integrity: sha512-wtMYcV5GIDIhVyF/jjmdwq1GdlK07dRL40XMns73VbrFI7FteRltxv48bhYVZPcLkRXb0SHjpDS/icj9/yzbVA==} - '@sanity/google-maps-input@4.0.1': - resolution: {integrity: sha512-lYxK1Jfb2Xk3lVVcK/MUdK562qAC3LfSatjbvpDTP4LNwQ1NVvvgwsS2QGiGSQvgSXxGPOaiS40MSMb26X1Vhg==} - engines: {node: '>=14'} + '@sanity/google-maps-input@4.1.0': + resolution: {integrity: sha512-Du3fOL4xNwh1Z859YZwubN8uzkGJk4AfTXGwjahdtTPmYYlhr/KX2fAw7pzYYZob0fBI1x6TlNvj44q3y2k5Wg==} + engines: {node: '>=18'} peerDependencies: - react: ^18 + react: ^18 || ^19 sanity: ^3.19.0 styled-components: ^6.1 - '@sanity/icons@1.3.10': - resolution: {integrity: sha512-5wVG/vIiGuGrSmq+Bl3PY7XDgQrGv0fyHdJI64FSulnr2wH3NMqZ6C59UFxnrZ93sr7kOt0zQFoNv2lkPBi0Cg==} - peerDependencies: - react: ^16.9 || ^17 || ^18 - - '@sanity/icons@2.11.8': - resolution: {integrity: sha512-C4ViXtk6eyiNTQ5OmxpfmcK6Jw+LLTi9zg9XBUD15DzC4xTHaGW9SVfUa43YtPGs3WC3M0t0K59r0GDjh52HIg==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: ^18 - - '@sanity/icons@3.5.2': - resolution: {integrity: sha512-ZPSBevYnmBvtjWvvM/Akpey+kreAvGhSUJYoqf4bJUwKvC1q/80s2o2EWL+xtZe1K3BJJI8HyBeL4WHQA3EMrA==} + '@sanity/icons@3.5.5': + resolution: {integrity: sha512-lCMvDovgU3epRcotGx60yNjw2NTNgxPnTY3wa2plCjY4dmLqm0kLuS7y4M4iy+7plwlVnIkfoZM+aVTK6f4rAw==} engines: {node: '>=14.0.0'} peerDependencies: react: ^18.3 || ^19.0.0-0 @@ -4507,11 +4820,11 @@ packages: engines: {node: '>=18'} hasBin: true - '@sanity/incompatible-plugin@1.0.4': - resolution: {integrity: sha512-2z39G9PTM8MXOF4fJNx3TG4tH0RrTjtH6dVLW93DSjCPbIS7FgCY5yWjZfQ+HVkwhLsF7ATDAGLA/jp65pFjAg==} + '@sanity/incompatible-plugin@1.0.5': + resolution: {integrity: sha512-9JGAacbElUPy9Chghd+sllIiM3jAcraZdD65bWYWUVKkghOsf1L/+jFLz1rcAuvrA9o2s7Y+T75BNcXuLwRcvw==} peerDependencies: - react: ^16.9 || ^17 || ^18 - react-dom: ^16.9 || ^17 || ^18 + react: ^16.9 || ^17 || ^18 || ^19 + react-dom: ^16.9 || ^17 || ^18 || ^19 '@sanity/insert-menu@1.0.16': resolution: {integrity: sha512-qBnOH+Ntis+Y74gyTvpHE0H1yK7HN3P9Ryr2hugbWBomKaJOL5ztbxUnS4LqHefuTDgYHBuc9CbB8w12ep+KSA==} @@ -4554,8 +4867,8 @@ packages: '@sanity/color': ^2.0 || ^3.0 || ^3.0.0-beta react: ^18.3 || >=19.0.0-rc - '@sanity/mutate@0.11.0-canary.3': - resolution: {integrity: sha512-zZQo3rsjsTZBlRi+D3S90MebvzWNtdRzb6A0s07gEO2PtCtc5LEUSyPCLvIZiv6e2YMjBmMmuref4IB8VixKnw==} + '@sanity/mutate@0.11.0-canary.4': + resolution: {integrity: sha512-82jU3PvxQepY+jVJU1WaXQOf2Q9Q/fOCE2ksJZ4cnH3/WFOsg7RceYoOWb1XKthchTCD9zSBS9DRmb7FQ0Jlsg==} engines: {node: '>=18'} peerDependencies: xstate: ^5.19.0 @@ -4567,19 +4880,8 @@ packages: resolution: {integrity: sha512-72chdEK8s9h1BLE/n7tOkCOGnrfFV/cH1fpvH/PpcxhpUY7wg6vvL7/durpXLEchWCO1ToS5DcFrCfmy1iKOrw==} engines: {node: '>=18'} - '@sanity/pkg-utils@6.11.15': - resolution: {integrity: sha512-f0Ykq9SP/wqHBDRmamOHfAtRoSxYkHKo9O7ZpFhY9P78XfT/E49C6Eo0wigB7N5cMeovysZdiP2/gZknjQaJDg==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - babel-plugin-react-compiler: '*' - typescript: 5.4.x || 5.5.x || 5.6.x || 5.7.x - peerDependenciesMeta: - babel-plugin-react-compiler: - optional: true - - '@sanity/pkg-utils@6.12.0': - resolution: {integrity: sha512-vLSrOB1CkI/TPh+0arHjrzlAfT8gsR0kfrAYgFTVkWEZQI9ZCbptLpZbMFarrbVgzmaAJbwx3pZU2dItD9ufzw==} + '@sanity/pkg-utils@6.12.2': + resolution: {integrity: sha512-jLy9m5aPQUW7g8PuH5FYZJ8i5vE2s9Bv1aTdFoMFrfNaBYG9TpgoDUT2JlrTS1oFSv2CJz6JIcHylsulqCrF3w==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -4610,8 +4912,8 @@ packages: peerDependencies: '@sanity/client': ^6.24.1 - '@sanity/react-loader@1.10.28': - resolution: {integrity: sha512-xpiCEwJQ7ole9qanIfmDRefuSErmplmzJP29h24Efu/kMOnXOQo8UMTTdTCbHVFUJRNR4xcBWFH2MkQbExIpJg==} + '@sanity/react-loader@1.10.30': + resolution: {integrity: sha512-V9Xj3kwd7c4NfIEt5+8QB+ZpCdvA2lU5QGalkn6S/1101Xkk3z8Q+tsSPQ1yHWVJ9VOMYDbOv8sYX/RkwhlmcA==} engines: {node: '>=18'} peerDependencies: react: ^18.3 || >=19.0.0-rc @@ -4622,12 +4924,16 @@ packages: peerDependencies: react: ^18.2 || >=19.0.0-rc + '@sanity/template-validator@1.0.3': + resolution: {integrity: sha512-yXJNdJ8Yrz+cN3DoEUPY0MN8TZu/j4bG7DOkm/BqYMAhRlsQAEDlezznqbrm6eh6TbVFZ+yRVzhx6dYrcpfhmg==} + engines: {node: '>=18.0.0'} + '@sanity/test@0.0.1-alpha.1': resolution: {integrity: sha512-o2X2Veh9YWyVK/Iou/cToSS6ufcTLREoCVMcvBQbSqCFUIGaN1Ko3zxChJMWdf39dyaJ/ixMKtc8pciF/tL6Sw==} hasBin: true - '@sanity/tsdoc@1.0.150': - resolution: {integrity: sha512-X8XJ0zmKtZA73QreQ6UjWLjItgotoSedKuCb5yYqg6aNdZ93yIZXil6OPpPlWvYR3um6XC2Z97Uhj16qPAeJ3Q==} + '@sanity/tsdoc@1.0.153': + resolution: {integrity: sha512-qNKSlDn+he0C/JThWGIhnvChzWcFTgqKZg9mTgmH3+406XZCJlvy01PH39CuYpCE+7PLVIcFRwg9VjBBlcT19g==} engines: {node: '>=14.0.0'} hasBin: true peerDependencies: @@ -4649,8 +4955,8 @@ packages: react-dom: ^18 styled-components: ^5.2 || ^6 - '@sanity/ui@2.10.9': - resolution: {integrity: sha512-pNjalR+On4tI/F6VGMzE07Jig0X6pPOeYqTZrTGo6ebCMXuzhSOqjm+bJx56z8OTNcjWihIi2G3U4t7/HJ4kIA==} + '@sanity/ui@2.10.12': + resolution: {integrity: sha512-e7NzH/b8E5O+NxPsmodpgCDek8cWBa9ujF5sQr8E/eVzRSF4use+PmbgJZUJCY/xX+bbl0sOaWw4+Bdjy7mM5A==} engines: {node: '>=14.0.0'} peerDependencies: react: ^18 || >=19.0.0-0 @@ -4665,8 +4971,8 @@ packages: '@sanity/uuid@3.0.2': resolution: {integrity: sha512-vzdhqOrX7JGbMyK40KuIwwyXHm7GMLOGuYgn3xlC09e4ZVNofUO5mgezQqnRv0JAMthIRhofqs9f6ufUjMKOvw==} - '@sanity/visual-editing@2.10.6': - resolution: {integrity: sha512-+edG4S6o4s7VOJJMSLDHea1X7tds566bfgG5aHEdLqkV9RFd8Bkri5IoWtffKXfPQa9GfoozqsYQzVNPhaEPGw==} + '@sanity/visual-editing@2.10.10': + resolution: {integrity: sha512-kR+TIb290n5mMii+NemBqg+atjw2lf23pN5ULO8V6f+0uQKZMwIaJLhH875BMCVWLdCkb4eDq4e3QGynUzJgbQ==} engines: {node: '>=18'} peerDependencies: '@remix-run/react': '>= 2' @@ -4691,38 +4997,38 @@ packages: svelte: optional: true - '@sentry-internal/browser-utils@8.42.0': - resolution: {integrity: sha512-xzgRI0wglKYsPrna574w1t38aftuvo44gjOKFvPNGPnYfiW9y4m+64kUz3JFbtanvOrKPcaITpdYiB4DeJXEbA==} + '@sentry-internal/browser-utils@8.46.0': + resolution: {integrity: sha512-NZSUvCo0wDApXKh9dudJLu2gAJKcC6Dr6sAh8u5apNIapViuwajrOBhRrOWjfUUNH4Ey/GUNDD/4RK1l46KkwQ==} engines: {node: '>=14.18'} - '@sentry-internal/feedback@8.42.0': - resolution: {integrity: sha512-dkIw5Wdukwzngg5gNJ0QcK48LyJaMAnBspqTqZ3ItR01STi6Z+6+/Bt5XgmrvDgRD+FNBinflc5zMmfdFXXhvw==} + '@sentry-internal/feedback@8.46.0': + resolution: {integrity: sha512-v4sfzMQuZWLO9EqytsKNg/QZlZWj2PXYXlD4r7ML1fOq+by220HzRiY4tBEi3vlyhHSA+YnXLfz01WcJtNQEWg==} engines: {node: '>=14.18'} - '@sentry-internal/replay-canvas@8.42.0': - resolution: {integrity: sha512-XrPErqVhPsPh/oFLVKvz7Wb+Fi2J1zCPLeZCxWqFuPWI2agRyLVu0KvqJyzSpSrRAEJC/XFzuSVILlYlXXSfgA==} + '@sentry-internal/replay-canvas@8.46.0': + resolution: {integrity: sha512-3Gj81GEEtX848Xwzm/oiccgcfkvULSv4BH5wAJZ3tr3YAKYZbCjqB9GkYsPInY0mnc3BMNRDJ9se7iUWD1AROg==} engines: {node: '>=14.18'} - '@sentry-internal/replay@8.42.0': - resolution: {integrity: sha512-oNcJEBlDfXnRFYC5Mxj5fairyZHNqlnU4g8kPuztB9G5zlsyLgWfPxzcn1ixVQunth2/WZRklDi4o1ZfyHww7w==} + '@sentry-internal/replay@8.46.0': + resolution: {integrity: sha512-GS3oIHZ/3Qijg5u6hl2cDpJJmOy577cXWFqYZleR9qH7h2TFGpNVNTqoEt3m9e3VylHvhFNEshFCemXaOVb6ZA==} engines: {node: '>=14.18'} - '@sentry/browser@8.42.0': - resolution: {integrity: sha512-lStrEk609KJHwXfDrOgoYVVoFFExixHywxSExk7ZDtwj2YPv6r6Y1gogvgr7dAZj7jWzadHkxZ33l9EOSJBfug==} + '@sentry/browser@8.46.0': + resolution: {integrity: sha512-lgm1LM2yvgAw+xADc6lpA/sZNL3YuVd0OK8VM2Csdd5bRlquouCqDuW/iimUvO2aBDnXGWGIhMkzpk8Hp8NTvA==} engines: {node: '>=14.18'} - '@sentry/core@8.42.0': - resolution: {integrity: sha512-ac6O3pgoIbU6rpwz6LlwW0wp3/GAHuSI0C5IsTgIY6baN8rOBnlAtG6KrHDDkGmUQ2srxkDJu9n1O6Td3cBCqw==} + '@sentry/core@8.46.0': + resolution: {integrity: sha512-aOEOBw5ueqN0cv7J3DJDDAlfJf+GxiGsUJZCG5Rsgiq4/jYW8ezY4glUyx+J9yjwvpfHt4IFaQtBQaeXUQBN6g==} engines: {node: '>=14.18'} - '@sentry/react@8.42.0': - resolution: {integrity: sha512-UBi/WM4oMa+kOA99R7t7Ke57zq6uQw6mALYW4fJ+wuhHZJBLDDDHSGpEUhdWuQ1oWQv/laT34DGS44PJOjfeAg==} + '@sentry/react@8.46.0': + resolution: {integrity: sha512-GwtD0+I5lTuzi7riGpxmYuH1z6/Kr92wfvHGp+efs6ET8tT2IJgAruUE88T9FJGFQk/GVP7eF4ILolGJwJy9sA==} engines: {node: '>=14.18'} peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x - '@sentry/types@8.42.0': - resolution: {integrity: sha512-oXjVH6gV7DdndDESvk/glHsA6dmFVI1Nk0yWiofI4pCrAr3z8iloSLc0KUemJbv43I5Z97HdzoUdE4eH5Ly3rg==} + '@sentry/types@8.46.0': + resolution: {integrity: sha512-ViERGOhQy5zn7xt476iycqhnNFUv/Sb3iJHjQyZbRzLw1mWShwK7V1WPt+bsE9D4t3OHBYSpB7PTa3EVT55hcQ==} engines: {node: '>=14.18'} '@sigstore/bundle@2.3.2': @@ -4752,6 +5058,9 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@swc-node/core@1.13.3': resolution: {integrity: sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==} engines: {node: '>= 10'} @@ -4840,8 +5149,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.13': - resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} @@ -4855,24 +5164,25 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@tanstack/react-table@8.20.5': - resolution: {integrity: sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==} + '@tanstack/react-table@8.20.6': + resolution: {integrity: sha512-w0jluT718MrOKthRcr2xsjqzx+oEM7B7s/XXyfs19ll++hlId3fjTm+B2zrR3ijpANpkzBAr15j1XGVOMxpggQ==} engines: {node: '>=12'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-virtual@3.0.0-beta.54': - resolution: {integrity: sha512-D1mDMf4UPbrtHRZZriCly5bXTBMhylslm4dhcHqTtDJ6brQcgGmk8YD9JdWBGWfGSWPKoh2x1H3e7eh+hgPXtQ==} + '@tanstack/react-virtual@3.11.2': + resolution: {integrity: sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@tanstack/table-core@8.20.5': resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} engines: {node: '>=12'} - '@tanstack/virtual-core@3.0.0-beta.54': - resolution: {integrity: sha512-jtkwqdP2rY2iCCDVAFuaNBH3fiEi29aTn2RhtIoky8DTTiCdc48plpHHreLwmv1PICJ4AJUUESaq3xa8fZH8+g==} + '@tanstack/virtual-core@3.11.2': + resolution: {integrity: sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==} '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} @@ -4915,6 +5225,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tsconfig/svelte@1.0.13': + resolution: {integrity: sha512-5lYJP45Xllo4yE/RUBccBT32eBlRDbqN8r1/MIvQbKxW3aFqaYPCNgm8D5V20X4ShHcwvYWNlKg3liDh1MlBoA==} + '@tufjs/canonical-json@2.0.0': resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -4953,13 +5266,6 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/arrify@1.0.4': - resolution: {integrity: sha512-63nK8r8jvEVJ1r0ENaY9neB1wDzPHFYAzKiIxPawuzcijEX8XeOywwPL8fkSCwiTIYop9MSh+TKy9L2ZzTXV6g==} - - '@types/arrify@2.0.5': - resolution: {integrity: sha512-z0U1DC4o60MskxP6SdTXMXOV89EGVZc9vzmXs28BUgc9q6ikQIbcm1ap1ScJsKRycNwwnv5zAGhOVqEIjas9Vw==} - deprecated: This is a stub types definition. arrify provides its own type definitions, so you do not need this installed. - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -4984,9 +5290,18 @@ packages: '@types/configstore@5.0.1': resolution: {integrity: sha512-c/QCznvk7bLKGhHETj29rqKufui3jaAxjBhK4R2zUrMG5UG0qTwfWYxBoUbH8JCyDjdCWMIxPJ7/Fdz1UcAnWg==} + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + '@types/cors@2.8.17': + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@types/cpx@1.5.5': resolution: {integrity: sha512-PwM+cN40GZcjG9YgGFp/rQGKOpTqr6scUl1Q85NHL5jieh9I203kKiArjJcExwxy4+vTABmVUNRkNvGbPnRQZg==} + '@types/css-font-loading-module@0.0.7': + resolution: {integrity: sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -5050,11 +5365,11 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@18.19.67': - resolution: {integrity: sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==} + '@types/node@18.19.68': + resolution: {integrity: sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==} - '@types/node@22.10.1': - resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} + '@types/node@22.10.2': + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -5080,11 +5395,8 @@ packages: '@types/raf@3.4.3': resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==} - '@types/react-copy-to-clipboard@5.0.7': - resolution: {integrity: sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==} - - '@types/react-dom@18.3.3': - resolution: {integrity: sha512-uTYkxTLkYp41nq/ULXyXMtkNT1vu5fXJoqad6uTNCOGat5t9cLgF4vMNLBXsTOXpdOI44XzKPY1M5RRm0bQHuw==} + '@types/react-dom@18.3.5': + resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} peerDependencies: '@types/react': ^18.0.0 @@ -5094,11 +5406,13 @@ packages: '@types/react-redux@7.1.34': resolution: {integrity: sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==} - '@types/react-transition-group@4.4.11': - resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + '@types/react-transition-group@4.4.12': + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' - '@types/react@18.3.14': - resolution: {integrity: sha512-NzahNKvjNhVjuPBQ+2G7WlxstQ+47kXZNHlUvFakDViuIEfGY926GqhMueQFZ7woG+sPiQKlF36XfrIUVSUfFg==} + '@types/react@18.3.17': + resolution: {integrity: sha512-opAQ5no6LqJNo9TqnxBKsgnkIYHozW9KSTlFVoSUJYh1Fl/sswkEoqIugRSm7tbh6pABtYjGAjW+GOS23j8qbw==} '@types/readdir-glob@1.1.5': resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} @@ -5154,6 +5468,9 @@ packages: '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -5233,8 +5550,8 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@uiw/codemirror-extensions-basic-setup@4.23.6': - resolution: {integrity: sha512-bvtq8IOvdkLJMhoJBRGPEzU51fMpPDwEhcAHp9xCR05MtbIokQgsnLXrmD1aZm6e7s/3q47H+qdSfAAkR5MkLA==} + '@uiw/codemirror-extensions-basic-setup@4.23.7': + resolution: {integrity: sha512-9/2EUa1Lck4kFKkR2BkxlZPpgD/EWuKHnOlysf1yHKZGraaZmZEaUw+utDK4QcuJc8Iz097vsLz4f4th5EU27g==} peerDependencies: '@codemirror/autocomplete': '>=6.0.0' '@codemirror/commands': '>=6.0.0' @@ -5244,15 +5561,15 @@ packages: '@codemirror/state': '>=6.0.0' '@codemirror/view': '>=6.0.0' - '@uiw/codemirror-themes@4.23.6': - resolution: {integrity: sha512-0dpuLQW+V6zrKvfvor/eo71V3tpr2L2Hsu8QZAdtSzksjWABxTOzH3ShaBRxCEsrz6sU9sa9o7ShwBMMDz59bQ==} + '@uiw/codemirror-themes@4.23.7': + resolution: {integrity: sha512-UNf1XOx1hG9OmJnrtT86PxKcdcwhaNhbrcD+nsk8WxRJ3n5c8nH6euDvgVPdVLPwbizsaQcZTILACgA/FjRpVg==} peerDependencies: '@codemirror/language': '>=6.0.0' '@codemirror/state': '>=6.0.0' '@codemirror/view': '>=6.0.0' - '@uiw/react-codemirror@4.23.6': - resolution: {integrity: sha512-caYKGV6TfGLRV1HHD3p0G3FiVzKL1go7wes5XT2nWjB0+dTdyzyb81MKRSacptgZcotujfNO6QXn65uhETRAMw==} + '@uiw/react-codemirror@4.23.7': + resolution: {integrity: sha512-Nh/0P6W+kWta+ARp9YpnKPD9ick5teEnwmtNoPQnyd6NPv0EQP3Ui4YmRVNj1nkUEo+QjrAUaEfcejJ2up/HZA==} peerDependencies: '@babel/runtime': '>=7.11.0' '@codemirror/state': '>=6.0.0' @@ -5298,6 +5615,9 @@ packages: '@vitest/expect@2.1.1': resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} + '@vitest/expect@2.1.8': + resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} + '@vitest/mocker@2.1.1': resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} peerDependencies: @@ -5310,6 +5630,17 @@ packages: vite: optional: true + '@vitest/mocker@2.1.8': + resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@2.1.1': resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} @@ -5319,15 +5650,27 @@ packages: '@vitest/runner@2.1.1': resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} + '@vitest/runner@2.1.8': + resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + '@vitest/snapshot@2.1.1': resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} + '@vitest/snapshot@2.1.8': + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} + '@vitest/spy@2.1.1': resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} + '@vitest/spy@2.1.8': + resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} + '@vitest/utils@2.1.1': resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + '@vitest/utils@2.1.8': + resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + '@vue/compiler-core@3.5.13': resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} @@ -5346,6 +5689,9 @@ packages: '@vvo/tzdb@6.137.0': resolution: {integrity: sha512-er8kaywRTjBTlaBgYynd3Fe/OPUfL3GuRMJOyWRlZ3V7EX4A6pryXTf42FL1ZXjOkDPz+/exAUe03kmb02MLOA==} + '@xstate/fsm@1.6.5': + resolution: {integrity: sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw==} + '@xstate/react@5.0.0': resolution: {integrity: sha512-MkYMpmqqCdK43wSl/V/jSpsvumzV4RSG2ZOUEAIrg/w36BJpyufMrsR0rz7POX5ICF5s3xzP9q7Hd5TyM5SSyQ==} peerDependencies: @@ -5571,20 +5917,20 @@ packages: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} arrify@1.0.1: @@ -5606,6 +5952,10 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + ast-types@0.14.2: + resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} + engines: {node: '>=4'} + ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} @@ -5675,17 +6025,17 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206: - resolution: {integrity: sha512-nnkrHpeDKM8A5laq9tmFvvGbbDQ7laGfQLp50cvCkCXmWrPcZdCtaQpNh8UJS/yLREJnv2R4JDL5ADfxyAn+yQ==} - - babel-plugin-react-compiler@19.0.0-beta-df7b47d-20241124: - resolution: {integrity: sha512-93iSASR20HNsotcOTQ+KPL0zpgfRFVWL86AtXpmHp995HuMVnC9femd8Winr3GxkPEh8lEOyaw3nqY4q2HUm5w==} + babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215: + resolution: {integrity: sha512-c7YAJNlA8kSoIFx2Buq/CeGmC3MbZYznD3H7Q3cdaRyKtwDSSxbM3VJxEhv7lEo64g48aWSBSiCI3XcRw0y/Jw==} babel-plugin-styled-components@2.1.4: resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} peerDependencies: styled-components: '>= 2' + babel-plugin-syntax-hermes-parser@0.21.1: + resolution: {integrity: sha512-tUCEa+EykZx3oJXc+PolKz2iwDscCJ2hCONMvEqjAb4jIQH5ZapDd5Brs2Nk4TQpSJ/1Ykz53ksQbevXbF0wxg==} + babel-runtime@6.26.0: resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} @@ -5695,9 +6045,17 @@ packages: bare-events@2.5.0: resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} @@ -5746,6 +6104,10 @@ packages: resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==} engines: {node: '>=8'} + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -5767,8 +6129,8 @@ packages: browserify-zlib@0.1.4: resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -5843,6 +6205,10 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + callsite@1.0.0: resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} @@ -5865,8 +6231,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001687: - resolution: {integrity: sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==} + caniuse-lite@1.0.30001689: + resolution: {integrity: sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==} castable-video@1.0.10: resolution: {integrity: sha512-tJgUv+8/zE191y8EKojvB0eKIyKA9obIttd6Wpdm6x2qBmuwZ7wDgzVCSmf5cN2v9jBiuu0s7O5poz8a8cFX/w==} @@ -5918,8 +6284,8 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.1: - resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} chownr@1.1.4: @@ -5933,6 +6299,9 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -5976,6 +6345,10 @@ packages: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} + cli-high@0.4.3: + resolution: {integrity: sha512-YbwZhmK0fpwVn3bsbYiYdkseXFcGvSVkX+fl0CY73PAz77Uzkr46X3Ifs4V7NgwfvCqGx+6C5zEi8SL8m9lqtg==} + hasBin: true + cli-spinners@2.6.1: resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} engines: {node: '>=6'} @@ -6187,6 +6560,10 @@ packages: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + copy-descriptor@0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} @@ -6234,9 +6611,6 @@ packages: resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} engines: {node: '>= 14'} - create-react-class@15.7.0: - resolution: {integrity: sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==} - create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -6335,14 +6709,11 @@ packages: date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} - date-now@1.0.1: - resolution: {integrity: sha512-yiizelQCqYLUEVT4zqYihOW6Ird7Qyc6fD3Pv5xGxk4+Jz0rsB1dMN2KyNV6jgOHYh5K+sPGCSOknQN4Upa3pg==} - dateformat@3.0.3: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - debounce@1.0.0: - resolution: {integrity: sha512-4FCfBL8uZFIh3BShn4AlxH4O9F5v+CVriJfiwW8Me/MhO7NqBE5JO5WO48NasbsY9Lww/KYflB79MejA3eKhxw==} + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} @@ -6360,6 +6731,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -6523,6 +6903,10 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -6565,6 +6949,9 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} + dompurify@3.2.3: + resolution: {integrity: sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==} + domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} @@ -6596,8 +6983,8 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} - dunder-proto@1.0.0: - resolution: {integrity: sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} duplexer@0.1.2: @@ -6621,13 +7008,16 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + effect@3.11.8: + resolution: {integrity: sha512-N16cwqUDqG7lyYiFyt+in0+OS0Lg9pkMmGPSwxu2j9ZhRHI8S8D69+ffXX+afhl80r6syBSSkkIg/bYRjGGf7A==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.71: - resolution: {integrity: sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==} + electron-to-chromium@1.5.74: + resolution: {integrity: sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==} emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -6652,6 +7042,17 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + engine.io-client@6.6.2: + resolution: {integrity: sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.2: + resolution: {integrity: sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==} + engines: {node: '>=10.2.0'} + enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} @@ -6682,8 +7083,8 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - es-abstract@1.23.5: - resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} + es-abstract@1.23.6: + resolution: {integrity: sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -6731,6 +7132,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -6745,6 +7151,10 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-goat@2.1.1: + resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} + engines: {node: '>=8'} + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -6891,8 +7301,8 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206: - resolution: {integrity: sha512-5Pex1fUCJwLwwqEJe6NkgTn45kUjjj9TZP6IrW4IcpWM/YaEe+QvcOeF60huDjBq0kz1svGeW2nw8WdY+qszAw==} + eslint-plugin-react-compiler@19.0.0-beta-201e55d-20241215: + resolution: {integrity: sha512-KTOMW6Z4Eg2r5BPT/BncbwPswfuVH9KPPDVszOTQFXGNlxhExL8IZoSE3blYxk4e0wFDbCcAwe4UlTauQ8lIww==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} peerDependencies: eslint: '>=7' @@ -7059,6 +7469,10 @@ packages: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} @@ -7089,6 +7503,10 @@ packages: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} + fast-check@3.23.2: + resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} + engines: {node: '>=8.0.0'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -7108,10 +7526,16 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-xml-parser@4.5.0: - resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} + fast-xml-parser@4.5.1: + resolution: {integrity: sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==} hasBin: true + faster-babel-types@0.1.0: + resolution: {integrity: sha512-0bEgAyXBdX330U6WbY80Q/h8k0NAPT3Z3sRlC6Fiv0kxekow9JQv2KBL55jIDFxNKcixjvByNnTZfH4axKSB9g==} + engines: {node: '>=10'} + peerDependencies: + '@babel/types': ^7 + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -7126,6 +7550,12 @@ packages: picomatch: optional: true + fetch-retry@6.0.0: + resolution: {integrity: sha512-BUFj1aMubgib37I3v4q78fYo63Po7t4HUPTpQ6/QE6yK6cIQrP+W43FYToeTEyg5m2Y7eFUtijUuAv/PDlWuag==} + + fflate@0.4.8: + resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} + figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} @@ -7298,8 +7728,8 @@ packages: react-dom: optional: true - framer-motion@11.13.5: - resolution: {integrity: sha512-rArI0zPU9VkpS3Wt0J7dmRxAFUWtzPWoSofNQAP0UO276CmJ+Xlf5xN19GMw3w2QsdrS2sU+0+Q2vtuz4IEZaw==} + framer-motion@11.15.0: + resolution: {integrity: sha512-MLk8IvZntxOMg7lDBLw2qgTHHv664bYoYmnFTmE0Gm/FW67aOJk0WM3ctMcG+Xhcv+vh5uyyXwxvxhSeJzSe+w==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -7371,8 +7801,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + function.prototype.name@1.1.7: + resolution: {integrity: sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -7398,8 +7828,8 @@ packages: resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} engines: {node: '>=18'} - get-intrinsic@1.2.5: - resolution: {integrity: sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==} + get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} engines: {node: '>= 0.4'} get-it@8.6.5: @@ -7665,6 +8095,10 @@ packages: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} + has-yarn@2.1.0: + resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} + engines: {node: '>=8'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -7679,9 +8113,15 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hermes-estree@0.21.1: + resolution: {integrity: sha512-ayfESdfG0wZM32uGw0CMfcW6pW6RM8htLXZI56A4rr7hIOjmKw+wd3+71wUc1uQfn90ZyY1NMCbQeMnunrIidg==} + hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + hermes-parser@0.21.1: + resolution: {integrity: sha512-ANsRSBqQHzca7AXbsuwKApSQhAdljPip63MgqLebSVzNUI+A3NDzfiH9Ny4df4fA7Ndso3kPR1V/x1YEc7BYxA==} + hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} @@ -7698,6 +8138,10 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} + hono@4.6.14: + resolution: {integrity: sha512-j4VkyUp2xazGJ8eCCLN1Vm/bxdvm/j5ZuU9AIjLu9vapn2M44p9L3Ktr9Vnb2RN2QtcR/wVjZVMlT5k7GJQgPw==} + engines: {node: '>=16.9.0'} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -7792,6 +8236,10 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} @@ -7843,8 +8291,8 @@ packages: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} ip-address@9.0.5: @@ -7865,8 +8313,8 @@ packages: is-alphanumerical@1.0.4: resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} is-arrayish@0.2.1: @@ -7891,8 +8339,8 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.2.0: - resolution: {integrity: sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==} + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} is-buffer@1.1.6: @@ -7909,24 +8357,28 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} + is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + is-core-module@2.16.0: + resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} engines: {node: '>= 0.4'} is-data-descriptor@1.0.1: resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} is-decimal@1.0.4: @@ -7972,8 +8424,8 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.0: - resolution: {integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} is-fullwidth-code-point@2.0.0: @@ -8045,8 +8497,12 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-number-object@1.1.0: - resolution: {integrity: sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==} + is-npm@5.0.0: + resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} + engines: {node: '>=10'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} is-number@2.1.0: @@ -8103,8 +8559,8 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-regex@1.2.0: - resolution: {integrity: sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} is-retry-allowed@2.2.0: @@ -8134,12 +8590,12 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-string@1.1.0: - resolution: {integrity: sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.1.0: - resolution: {integrity: sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} is-tar@1.0.0: @@ -8173,11 +8629,12 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} is-windows@1.0.2: @@ -8188,6 +8645,9 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} + is-yarn-global@0.3.0: + resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} @@ -8216,6 +8676,13 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + isomorphic-dompurify@2.19.0: + resolution: {integrity: sha512-ppcgeRlEwOQ+v/JDctcjnOsBwEoJlAWVDH5+LisLHphQFeWCrBiVvK6XF4wF0MJM5tJA6RxJSlpbmthnmonxOQ==} + engines: {node: '>=18'} + + isomorphic-fetch@3.0.0: + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -8232,8 +8699,8 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - iterator.prototype@1.1.3: - resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} + iterator.prototype@1.1.4: + resolution: {integrity: sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==} engines: {node: '>= 0.4'} jackspeak@3.4.3: @@ -8294,6 +8761,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 @@ -8303,6 +8779,11 @@ packages: engines: {node: '>=6'} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-2-csv@5.5.7: resolution: {integrity: sha512-aZ0EOadeNnO4ifF60oXXTH8P177WeHhFLbRLqILW1Kk1gNHlgAOuvddMwEIaxbLpCzx+vXo49whK6AILdg8qLg==} engines: {node: '>= 16'} @@ -8413,6 +8894,10 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -8560,8 +9045,8 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.30.14: - resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -8613,6 +9098,10 @@ packages: material-colors@1.2.6: resolution: {integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==} + math-intrinsics@1.0.0: + resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==} + engines: {node: '>= 0.4'} + math-random@1.0.4: resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} @@ -8825,6 +9314,9 @@ packages: resolution: {integrity: sha512-7PujJ3Te6GGg9lG1nfw5jYCPV6/BsoAT0nCQwb6w+ROuromXYxI6jc/CQSlD82Z/OUMSBX1SoaqhTE+vXiLQzQ==} engines: {node: '>=4.0.0'} + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} @@ -8864,11 +9356,15 @@ packages: moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - motion-dom@11.13.0: - resolution: {integrity: sha512-Oc1MLGJQ6nrvXccXA89lXtOqFyBmvHtaDcTRGT66o8Czl7nuA8BeHAd9MQV1pQKX0d2RHFBFaw5g3k23hQJt0w==} + motion-dom@11.14.3: + resolution: {integrity: sha512-lW+D2wBy5vxLJi6aCP0xyxTxlTfiu+b+zcpVbGVFUxotwThqhdpPRSmX8xztAgtZMPMeU0WGVn/k1w4I+TbPqA==} - motion-utils@11.13.0: - resolution: {integrity: sha512-lq6TzXkH5c/ysJQBxgLXgM01qwBH1b4goTPh57VvZWJbVJZF/0SB31UWEn4EIqbVPf3au88n2rvK17SpDTja1A==} + motion-utils@11.14.3: + resolution: {integrity: sha512-Xg+8xnqIJTpr0L/cidfTTBFkvRw26ZtGGuIhA94J9PQ2p4mEa06Xx7QVYZH0BP+EpMSaDlu+q0I0mmvwADPsaQ==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -8946,16 +9442,16 @@ packages: sass: optional: true - next@15.0.4: - resolution: {integrity: sha512-nuy8FH6M1FG0lktGotamQDCXhh5hZ19Vo0ht1AOIQWrYJLP598TIUagKtvJrfJ5AGwB/WmDqkKaKhMpVifvGPA==} + next@15.1.1: + resolution: {integrity: sha512-SBZlcvdIxajw8//H3uOR1G3iu3jxsra/77m2ulRIxi3m89p+s3ACsoOXR49JEAbaun/DVoRJ9cPKq8eF/oNB5g==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 '@playwright/test': ^1.41.2 babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0 + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': @@ -9002,8 +9498,8 @@ packages: node-notifier@10.0.1: resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==} - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} node-test-github-reporter@1.2.0: resolution: {integrity: sha512-rnCQctMTPAqJrOhaHaj60IMS5qB5B2rusCGv7RIbY6FsTKjaRmS4OBKCVQb3kYdMNqj0Fw9btDOZkCi3OFHx/g==} @@ -9084,8 +9580,11 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nx@20.2.1: - resolution: {integrity: sha512-zUw1DT9BW2ajbDZgcUFKfysGqrbJwsMRjPxT6GthuqcLtDc2iJi3+/UBTLsITSeiw4Za4qPVxjaK4+yma9Ju5w==} + nwsapi@2.2.16: + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + + nx@20.2.2: + resolution: {integrity: sha512-wHgC/NQ82Q3LOeUZXPI2j/JhpZwb7JjRc0uDn3kQU+lN/ulySCJHTHCf4CIglW4NjZeN1WZZ7YMeddtFWETGGA==} hasBin: true peerDependencies: '@swc-node/register': ^1.8.0 @@ -9153,6 +9652,9 @@ packages: peerDependencies: rxjs: ^6.5 || ^7 + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -9365,6 +9867,10 @@ packages: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} + parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + parse-passwd@1.0.0: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} @@ -9514,6 +10020,9 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + piscina@4.8.0: + resolution: {integrity: sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==} + pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} @@ -9627,6 +10136,10 @@ packages: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} + pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + prismjs@1.27.0: resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} engines: {node: '>=6'} @@ -9714,6 +10227,13 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pupa@2.1.1: + resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} + engines: {node: '>=8'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -9770,18 +10290,18 @@ packages: peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-clientside-effect@1.2.6: - resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==} + react-clientside-effect@1.2.7: + resolution: {integrity: sha512-gce9m0Pk/xYYMEojRI9bgvqQAkl6hm7ozQvqWPyQx+kULiatdHgkNM1QG4DQRx5N9BAzWSCJmt9mMV8/KsdgVg==} peerDependencies: - react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-color@2.19.3: resolution: {integrity: sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==} peerDependencies: react: '*' - react-compiler-runtime@19.0.0-beta-37ed2a7-20241206: - resolution: {integrity: sha512-9e6rCpVylr9EnVocgYAjft7+2v01BDpajeHKRoO+oc9pKcAMTpstHtHvE/TSVbyf4FvzCGjfKcfHM9XGTXI6Tw==} + react-compiler-runtime@19.0.0-beta-201e55d-20241215: + resolution: {integrity: sha512-jBEo/UqVgiz6veJjhQMoNaGQLKUQwzMQpiYrA4XsGVOC2sElDF0oMjic5107LitP988yHrqDDZwZirS4OAEqyA==} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -9790,11 +10310,6 @@ packages: peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 - react-copy-to-clipboard@5.1.0: - resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} - peerDependencies: - react: ^15.3.0 || 16 || 17 || 18 - react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -9825,17 +10340,17 @@ packages: react: ^18.0.0 || ^17.0.0 || ^16.2.0 react-dom: ^18.0.0 || ^17.0.0 || ^16.2.0 - react-focus-lock@2.13.2: - resolution: {integrity: sha512-T/7bsofxYqnod2xadvuwjGKHOoL5GH7/EIPI5UyEvaU/c2CcphvGI371opFtuY/SYdbMsNiuF4HsHQ50nA/TKQ==} + react-focus-lock@2.13.5: + resolution: {integrity: sha512-HjHuZFFk2+j6ZT3LDQpyqffue541HrxUG/OFchCEwis9nstgNg0rREVRAxHBcB1lHJ5Fsxtx1qya/5xFwxDb4g==} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - react-hook-form@7.54.0: - resolution: {integrity: sha512-PS05+UQy/IdSbJNojBypxAo9wllhHgGmyr8/dyGQcPoiMf3e7Dfb9PWYVRco55bLbxH9S+1yDDJeTdlYCSxO3A==} + react-hook-form@7.54.1: + resolution: {integrity: sha512-PUNzFwQeQ5oHiiTUO7GO/EJXGEtuun2Y1A59rLnZBBj+vNEOWt/3ERTiG1/zt7dVeJEM+4vDX/7XQ/qanuvPMg==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -9870,9 +10385,6 @@ packages: react-is@19.0.0-rc.1: resolution: {integrity: sha512-D6AbvUGS+i2lK3yC1a+iSicqWhIenYGxYUd7j0JJxunlk0RSAy/yRo58Mh5JJcAVQfNhej20nCwJVehYpNwNiA==} - react-lifecycles-compat@3.0.4: - resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} - react-redux@7.2.9: resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} peerDependencies: @@ -9894,17 +10406,21 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-rx@4.1.8: - resolution: {integrity: sha512-nU0Jkyt14mZZRgWiXPMv1uGungRMZYvaIZpWEP5OObKgba9Zj2qnDFnWE44lUspwlSl2muhbFzx6rFnTcL2PRg==} + react-rx@4.1.10: + resolution: {integrity: sha512-jaRWs0OmicEff4umqF6IIsGqyMSjnYCKpIkfWL9KKNnslQSs1TwJk7+rKQmi6awFlFtJI0W3JUGQXzNeb/ww4g==} peerDependencies: react: ^18.3 || >=19.0.0-0 rxjs: ^7 - react-select@5.8.3: - resolution: {integrity: sha512-lVswnIq8/iTj1db7XCG74M/3fbGB6ZaluCzvwPGT5ZOjCdL/k0CLWhEK0vCBLuU5bHTEf6Gj8jtSvi+3v+tO1w==} + react-scan@0.0.31: + resolution: {integrity: sha512-reHgQnASWVXwHe0Ibk/EbsEPZhKrmNRf8EUNDmjMi1lzXec+Cj9litKxD0TG2ghAwg5V4sT0wzhiOgZSIefeVg==} + hasBin: true + + react-select@5.9.0: + resolution: {integrity: sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-simplemde-editor@5.2.0: resolution: {integrity: sha512-GkTg1MlQHVK2Rks++7sjuQr/GVS/xm6y+HchZ4GPBWrhcgLieh4CjK04GTKbsfYorSRYKa0n37rtNSJmOzEDkQ==} @@ -9913,9 +10429,6 @@ packages: react: '>=16.8.2' react-dom: '>=16.8.2' - react-style-proptype@3.2.2: - resolution: {integrity: sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==} - react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: @@ -10157,8 +10670,8 @@ packages: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.9: + resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==} hasBin: true resolve@2.0.0-next.5: @@ -10246,12 +10759,27 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rrdom@0.1.7: + resolution: {integrity: sha512-ZLd8f14z9pUy2Hk9y636cNv5Y2BMnNEY99wxzW9tD2BLDfe1xFxtLjB4q/xCBYo6HRe0wofzKzjm4JojmpBfFw==} + rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} rrweb-cssom@0.7.1: resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + rrweb-player@1.0.0-alpha.4: + resolution: {integrity: sha512-Wlmn9GZ5Fdqa37vd3TzsYdLl/JWEvXNUrLCrYpnOwEgmY409HwVIvvA5aIo7k582LoKgdRCsB87N+f0oWAR0Kg==} + + rrweb-snapshot@2.0.0-alpha.18: + resolution: {integrity: sha512-hBHZL/NfgQX6wO1D9mpwqFu1NJPpim+moIcKhFEjVTZVRUfCln+LOugRc4teVTCISYHN8Cw5e2iNTWCSm+SkoA==} + + rrweb-snapshot@2.0.0-alpha.4: + resolution: {integrity: sha512-KQ2OtPpXO5jLYqg1OnXS/Hf+EzqnZyP5A+XPqBCjYpj3XIje/Od4gdUwjbFo3cVuWq5Cw5Y1d3/xwgIS7/XpQQ==} + + rrweb@2.0.0-alpha.4: + resolution: {integrity: sha512-wEHUILbxDPcNwkM3m4qgPgXAiBJyqCbbOHyVoNEVBJzHszWEFYyTbrZqUdeb1EfmTRC2PsumCIkVcomJ/xcOzA==} + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -10282,8 +10810,8 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -10292,8 +10820,8 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} safe-regex@1.1.0: @@ -10369,6 +10897,10 @@ packages: semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + semver-diff@3.1.1: + resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} + engines: {node: '>=8'} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -10460,8 +10992,20 @@ packages: shellwords@0.1.1: resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} siginfo@2.0.0: @@ -10545,6 +11089,21 @@ packages: resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + socks-proxy-agent@8.0.5: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} @@ -10682,8 +11241,8 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.21.0: - resolution: {integrity: sha512-Qz6MsDZXJ6ur9u+b+4xCG18TluU7PGlRfXVAAjNiGsFrBUt/ioyLkxbFaKJygoPs+/kW4VyBj0bSj89Qu0IGyg==} + streamx@2.21.1: + resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} @@ -10720,12 +11279,13 @@ packages: string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} @@ -10847,6 +11407,9 @@ packages: subarg@1.0.0: resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==} + sugar-high@0.7.5: + resolution: {integrity: sha512-lfGxo0il0Mx4WLdXEt0WsJ8V3QkQWssXnolj5xBurzlGJW07LuwmJWKtS0B2WJ5XWz1439RHngXAmzsnLD0rFA==} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -10931,8 +11494,8 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} - text-decoder@1.2.2: - resolution: {integrity: sha512-/MDslo7ZyWTA2vnk1j7XoDVfXsGk3tp+zFEJHJGm0UjIlQifonVFwlVbQDFh8KJzTBnT8ie115TYqir6bclddA==} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} @@ -10984,6 +11547,13 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + tldts-core@6.1.68: + resolution: {integrity: sha512-85TdlS/DLW/gVdf2oyyzqp3ocS30WxjaL4la85EArl9cHUR/nizifKAJPziWewSZjDZS71U517/i6ciUeqtB5Q==} + + tldts@6.1.68: + resolution: {integrity: sha512-JKF17jROiYkjJPT73hUTEiTp2OBCf+kAlB+1novk8i6Q6dWjHsgEjw9VLiipV4KTJavazXhY1QUXyQFSem2T7w==} + hasBin: true + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -11022,6 +11592,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@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -11163,8 +11737,8 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} - type-fest@4.30.0: - resolution: {integrity: sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==} + type-fest@4.30.2: + resolution: {integrity: sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==} engines: {node: '>=16'} type-is@1.6.18: @@ -11206,16 +11780,17 @@ packages: engines: {node: '>=14.17'} hasBin: true - typo-js@1.2.4: - resolution: {integrity: sha512-Oy/k+tFle5NAA3J/yrrYGfvEnPVrDZ8s8/WCwjUE75k331QyKIsFss7byQ/PzBmXLY6h1moRnZbnaxWBe3I3CA==} + typo-js@1.2.5: + resolution: {integrity: sha512-F45vFWdGX8xahIk/sOp79z2NJs8ETMYsmMChm9D5Hlx3+9j7VnCyQyvij5MOCrNY3NNe8noSyokRjQRfq+Bc7A==} uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} @@ -11294,6 +11869,10 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin@1.16.0: + resolution: {integrity: sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==} + engines: {node: '>=14.0.0'} + unset-value@1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} @@ -11308,6 +11887,10 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-notifier-cjs@5.1.6: + resolution: {integrity: sha512-wgxdSBWv3x/YpMzsWz5G4p4ec7JWD0HCl8W6bmNB6E5Gwo+1ym5oN4hiXpLf0mPySVEJEIsYlkshnplkg2OP9A==} + engines: {node: '>=14'} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -11318,12 +11901,12 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - use-callback-ref@1.3.2: - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -11361,12 +11944,12 @@ packages: '@types/react': optional: true - use-sidecar@1.1.2: - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -11436,6 +12019,11 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + vite-node@2.1.8: + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-tsconfig-paths@4.3.2: resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} peerDependencies: @@ -11568,6 +12156,31 @@ packages: jsdom: optional: true + vitest@2.1.8: + resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} + 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.8 + '@vitest/ui': 2.1.8 + 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'} @@ -11592,10 +12205,16 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} @@ -11607,12 +12226,12 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.1.0: - resolution: {integrity: sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} - which-builtin-type@1.2.0: - resolution: {integrity: sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==} + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} which-collection@1.0.2: @@ -11698,6 +12317,18 @@ packages: resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} engines: {node: '>=8'} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -11724,6 +12355,10 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + xregexp@2.0.0: resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==} @@ -11734,6 +12369,9 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + xycolors@0.1.2: + resolution: {integrity: sha512-iUIDKoRUq/6Nfkiwv/PqxR6ENzgLkaaOeWwY54CtObpEwmvQHCvsgxd5xIGfEF/QU75H2quxIffOoU4tf2kKDg==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -11798,8 +12436,8 @@ packages: peerDependencies: zod: ^3.18.0 - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} snapshots: @@ -11812,6 +12450,13 @@ snapshots: dependencies: '@actions/io': 1.1.3 + '@actions/github@6.0.0': + dependencies: + '@actions/http-client': 2.2.3 + '@octokit/core': 5.2.0 + '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.2.0) + '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.0) + '@actions/http-client@2.2.3': dependencies: tunnel: 0.0.6 @@ -11823,15 +12468,22 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 + '@antfu/ni@0.21.12': {} + '@asamuzakjp/dom-selector@2.0.2': dependencies: bidi-js: 1.0.3 css-tree: 2.3.1 is-potential-custom-element-name: 1.0.1 + '@axiomhq/js@1.0.0-rc.3': + dependencies: + fetch-retry: 6.0.0 + uuid: 8.3.2 + '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -11872,9 +12524,9 @@ snapshots: dependencies: '@babel/parser': 7.26.3 '@babel/types': 7.26.3 - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 + jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.25.9': dependencies: @@ -11884,7 +12536,7 @@ snapshots: dependencies: '@babel/compat-data': 7.26.3 '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.2 + browserslist: 4.24.3 lru-cache: 5.1.1 semver: 6.3.1 @@ -11915,7 +12567,7 @@ snapshots: '@babel/helper-plugin-utils': 7.25.9 debug: 4.4.0(supports-color@9.4.0) lodash.debounce: 4.0.8 - resolve: 1.22.8 + resolve: 1.22.9 transitivePeerDependencies: - supports-color @@ -12593,6 +13245,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.26.3': dependencies: '@babel/helper-string-parser': 7.25.9 @@ -12600,95 +13257,108 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3)': + '@clack/core@0.3.5': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.7.0': + dependencies: + '@clack/core': 0.3.5 + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.8.2': + dependencies: + '@clack/core': 0.3.5 + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@codemirror/autocomplete@6.18.4': dependencies: - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 '@lezer/common': 1.2.3 '@codemirror/commands@6.7.1': dependencies: - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 '@lezer/common': 1.2.3 - '@codemirror/lang-css@6.3.1(@codemirror/view@6.35.3)': + '@codemirror/lang-css@6.3.1': dependencies: - '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3) - '@codemirror/language': 6.10.6 + '@codemirror/autocomplete': 6.18.4 + '@codemirror/language': 6.10.7 '@codemirror/state': 6.5.0 '@lezer/common': 1.2.3 '@lezer/css': 1.1.9 - transitivePeerDependencies: - - '@codemirror/view' '@codemirror/lang-html@6.4.9': dependencies: - '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3) - '@codemirror/lang-css': 6.3.1(@codemirror/view@6.35.3) + '@codemirror/autocomplete': 6.18.4 + '@codemirror/lang-css': 6.3.1 '@codemirror/lang-javascript': 6.2.2 - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 '@lezer/common': 1.2.3 '@lezer/css': 1.1.9 '@lezer/html': 1.3.10 '@codemirror/lang-java@6.0.1': dependencies: - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@lezer/java': 1.1.3 '@codemirror/lang-javascript@6.2.2': dependencies: - '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3) - '@codemirror/language': 6.10.6 + '@codemirror/autocomplete': 6.18.4 + '@codemirror/language': 6.10.7 '@codemirror/lint': 6.8.4 '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 '@lezer/common': 1.2.3 '@lezer/javascript': 1.4.21 '@codemirror/lang-json@6.0.1': dependencies: - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@lezer/json': 1.0.2 '@codemirror/lang-markdown@6.3.1': dependencies: - '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3) + '@codemirror/autocomplete': 6.18.4 '@codemirror/lang-html': 6.4.9 - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 '@lezer/common': 1.2.3 '@lezer/markdown': 1.3.2 '@codemirror/lang-php@6.0.1': dependencies: '@codemirror/lang-html': 6.4.9 - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@codemirror/state': 6.5.0 '@lezer/common': 1.2.3 '@lezer/php': 1.0.2 - '@codemirror/lang-sql@6.8.0(@codemirror/view@6.35.3)': + '@codemirror/lang-sql@6.8.0': dependencies: - '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3) - '@codemirror/language': 6.10.6 + '@codemirror/autocomplete': 6.18.4 + '@codemirror/language': 6.10.7 '@codemirror/state': 6.5.0 '@lezer/common': 1.2.3 '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - transitivePeerDependencies: - - '@codemirror/view' - '@codemirror/language@6.10.6': + '@codemirror/language@6.10.7': dependencies: '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 '@lezer/common': 1.2.3 '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 @@ -12696,18 +13366,18 @@ snapshots: '@codemirror/legacy-modes@6.4.2': dependencies: - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@codemirror/lint@6.8.4': dependencies: '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 crelt: 1.0.6 '@codemirror/search@6.5.8': dependencies: '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 crelt: 1.0.6 '@codemirror/state@6.5.0': @@ -12716,12 +13386,12 @@ snapshots: '@codemirror/theme-one-dark@6.1.2': dependencies: - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 '@lezer/highlight': 1.2.1 - '@codemirror/view@6.35.3': + '@codemirror/view@6.36.0': dependencies: '@codemirror/state': 6.5.0 style-mod: 4.1.2 @@ -12825,7 +13495,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@18.3.17)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 '@emotion/babel-plugin': 11.13.5 @@ -12837,7 +13507,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.14 + '@types/react': 18.3.17 transitivePeerDependencies: - supports-color @@ -12870,6 +13540,9 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true + '@esbuild/aix-ppc64@0.20.2': + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -12882,6 +13555,9 @@ snapshots: '@esbuild/android-arm64@0.19.12': optional: true + '@esbuild/android-arm64@0.20.2': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true @@ -12894,6 +13570,9 @@ snapshots: '@esbuild/android-arm@0.19.12': optional: true + '@esbuild/android-arm@0.20.2': + optional: true + '@esbuild/android-arm@0.21.5': optional: true @@ -12906,6 +13585,9 @@ snapshots: '@esbuild/android-x64@0.19.12': optional: true + '@esbuild/android-x64@0.20.2': + optional: true + '@esbuild/android-x64@0.21.5': optional: true @@ -12918,6 +13600,9 @@ snapshots: '@esbuild/darwin-arm64@0.19.12': optional: true + '@esbuild/darwin-arm64@0.20.2': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true @@ -12930,6 +13615,9 @@ snapshots: '@esbuild/darwin-x64@0.19.12': optional: true + '@esbuild/darwin-x64@0.20.2': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true @@ -12942,6 +13630,9 @@ snapshots: '@esbuild/freebsd-arm64@0.19.12': optional: true + '@esbuild/freebsd-arm64@0.20.2': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true @@ -12954,7 +13645,10 @@ snapshots: '@esbuild/freebsd-x64@0.19.12': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.24.0': @@ -12966,6 +13660,9 @@ snapshots: '@esbuild/linux-arm64@0.19.12': optional: true + '@esbuild/linux-arm64@0.20.2': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true @@ -12978,6 +13675,9 @@ snapshots: '@esbuild/linux-arm@0.19.12': optional: true + '@esbuild/linux-arm@0.20.2': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true @@ -12990,6 +13690,9 @@ snapshots: '@esbuild/linux-ia32@0.19.12': optional: true + '@esbuild/linux-ia32@0.20.2': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true @@ -13002,6 +13705,9 @@ snapshots: '@esbuild/linux-loong64@0.19.12': optional: true + '@esbuild/linux-loong64@0.20.2': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true @@ -13014,6 +13720,9 @@ snapshots: '@esbuild/linux-mips64el@0.19.12': optional: true + '@esbuild/linux-mips64el@0.20.2': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true @@ -13026,6 +13735,9 @@ snapshots: '@esbuild/linux-ppc64@0.19.12': optional: true + '@esbuild/linux-ppc64@0.20.2': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true @@ -13038,6 +13750,9 @@ snapshots: '@esbuild/linux-riscv64@0.19.12': optional: true + '@esbuild/linux-riscv64@0.20.2': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true @@ -13050,6 +13765,9 @@ snapshots: '@esbuild/linux-s390x@0.19.12': optional: true + '@esbuild/linux-s390x@0.20.2': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true @@ -13062,6 +13780,9 @@ snapshots: '@esbuild/linux-x64@0.19.12': optional: true + '@esbuild/linux-x64@0.20.2': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true @@ -13074,6 +13795,9 @@ snapshots: '@esbuild/netbsd-x64@0.19.12': optional: true + '@esbuild/netbsd-x64@0.20.2': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true @@ -13089,6 +13813,9 @@ snapshots: '@esbuild/openbsd-x64@0.19.12': optional: true + '@esbuild/openbsd-x64@0.20.2': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true @@ -13101,6 +13828,9 @@ snapshots: '@esbuild/sunos-x64@0.19.12': optional: true + '@esbuild/sunos-x64@0.20.2': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true @@ -13113,6 +13843,9 @@ snapshots: '@esbuild/win32-arm64@0.19.12': optional: true + '@esbuild/win32-arm64@0.20.2': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true @@ -13125,6 +13858,9 @@ snapshots: '@esbuild/win32-ia32@0.19.12': optional: true + '@esbuild/win32-ia32@0.20.2': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true @@ -13137,6 +13873,9 @@ snapshots: '@esbuild/win32-x64@0.19.12': optional: true + '@esbuild/win32-x64@0.20.2': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true @@ -13214,7 +13953,7 @@ snapshots: abort-controller: 3.0.0 async-retry: 1.3.3 duplexify: 4.1.3 - fast-xml-parser: 4.5.0 + fast-xml-parser: 4.5.1 gaxios: 6.7.1(encoding@0.1.13) google-auth-library: 9.15.0(encoding@0.1.13) html-entities: 2.5.2 @@ -13227,9 +13966,13 @@ snapshots: - encoding - supports-color - '@hookform/resolvers@3.9.1(react-hook-form@7.54.0(react@18.3.1))': + '@hono/node-server@1.13.7(hono@4.6.14)': + dependencies: + hono: 4.6.14 + + '@hookform/resolvers@3.9.1(react-hook-form@7.54.1(react@18.3.1))': dependencies: - react-hook-form: 7.54.0(react@18.3.1) + react-hook-form: 7.54.1(react@18.3.1) '@humanwhocodes/config-array@0.13.0': dependencies: @@ -13347,7 +14090,7 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 @@ -13359,7 +14102,7 @@ snapshots: '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/sourcemap-codec@1.5.0': {} @@ -13376,12 +14119,12 @@ snapshots: '@juggle/resize-observer@3.4.0': {} - '@lerna/create@8.1.9(@swc-node/register@1.10.9(@swc/core@1.10.1)(typescript@5.7.2))(@swc/core@1.10.1)(babel-plugin-macros@3.1.0)(encoding@0.1.13)(typescript@5.7.2)': + '@lerna/create@8.1.9(@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2))(@swc/core@1.10.1(@swc/helpers@0.5.15))(babel-plugin-macros@3.1.0)(encoding@0.1.13)(typescript@5.7.2)': dependencies: '@npmcli/arborist': 7.5.4 '@npmcli/package-json': 5.2.0 '@npmcli/run-script': 8.1.0 - '@nx/devkit': 20.2.1(nx@20.2.1(@swc-node/register@1.10.9(@swc/core@1.10.1)(typescript@5.7.2))(@swc/core@1.10.1)) + '@nx/devkit': 20.2.2(nx@20.2.2(@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2))(@swc/core@1.10.1(@swc/helpers@0.5.15))) '@octokit/plugin-enterprise-rest': 6.0.1 '@octokit/rest': 19.0.11(encoding@0.1.13) aproba: 2.0.0 @@ -13420,7 +14163,7 @@ snapshots: npm-package-arg: 11.0.2 npm-packlist: 8.0.2 npm-registry-fetch: 17.1.0 - nx: 20.2.1(@swc-node/register@1.10.9(@swc/core@1.10.1)(typescript@5.7.2))(@swc/core@1.10.1) + nx: 20.2.2(@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2))(@swc/core@1.10.1(@swc/helpers@0.5.15)) p-map: 4.0.0 p-map-series: 2.1.0 p-queue: 6.6.2 @@ -13512,26 +14255,26 @@ snapshots: '@marijn/find-cluster-break@1.0.2': {} - '@microsoft/api-extractor-model@7.30.0(@types/node@22.10.1)': + '@microsoft/api-extractor-model@7.30.1(@types/node@22.10.2)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.10.0(@types/node@22.10.1) + '@rushstack/node-core-library': 5.10.1(@types/node@22.10.2) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.48.0(@types/node@22.10.1)': + '@microsoft/api-extractor@7.48.1(@types/node@22.10.2)': dependencies: - '@microsoft/api-extractor-model': 7.30.0(@types/node@22.10.1) + '@microsoft/api-extractor-model': 7.30.1(@types/node@22.10.2) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.10.0(@types/node@22.10.1) + '@rushstack/node-core-library': 5.10.1(@types/node@22.10.2) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.3(@types/node@22.10.1) - '@rushstack/ts-command-line': 4.23.1(@types/node@22.10.1) + '@rushstack/terminal': 0.14.4(@types/node@22.10.2) + '@rushstack/ts-command-line': 4.23.2(@types/node@22.10.2) lodash: 4.17.21 minimatch: 3.0.8 - resolve: 1.22.8 + resolve: 1.22.9 semver: 7.5.4 source-map: 0.6.1 typescript: 5.4.2 @@ -13543,20 +14286,72 @@ snapshots: '@microsoft/tsdoc': 0.15.0 ajv: 8.12.0 jju: 1.4.0 - resolve: 1.22.8 + resolve: 1.22.9 '@microsoft/tsdoc-config@0.17.1': dependencies: '@microsoft/tsdoc': 0.15.1 ajv: 8.12.0 jju: 1.4.0 - resolve: 1.22.8 + resolve: 1.22.9 '@microsoft/tsdoc@0.15.0': {} '@microsoft/tsdoc@0.15.1': {} - '@mux/mux-player-react@2.9.1(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@million/install@1.0.14': + dependencies: + '@antfu/ni': 0.21.12 + '@axiomhq/js': 1.0.0-rc.3 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.0 + '@clack/prompts': 0.7.0 + ast-types: 0.14.2 + cli-high: 0.4.3 + diff: 5.2.0 + effect: 3.11.8 + nanoid: 5.0.9 + recast: 0.23.9 + xycolors: 0.1.2 + + '@million/lint@1.0.14(encoding@0.1.13)(rollup@4.28.1)': + dependencies: + '@axiomhq/js': 1.0.0-rc.3 + '@babel/core': 7.26.0 + '@babel/types': 7.26.0 + '@hono/node-server': 1.13.7(hono@4.6.14) + '@million/install': 1.0.14 + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@rrweb/types': 2.0.0-alpha.16 + babel-plugin-syntax-hermes-parser: 0.21.1 + ci-info: 4.1.0 + esbuild: 0.20.2 + faster-babel-types: 0.1.0(@babel/types@7.26.0) + hono: 4.6.14 + isomorphic-fetch: 3.0.0(encoding@0.1.13) + nanoid: 5.0.9 + ohash: 1.1.4 + pako: 2.1.0 + pathe: 1.1.2 + piscina: 4.8.0 + pretty-ms: 8.0.0 + react-scan: 0.0.31 + rrweb: 2.0.0-alpha.4 + rrweb-player: 1.0.0-alpha.4 + semver: 7.6.3 + socket.io: 4.8.1 + socket.io-client: 4.8.1 + tmp: 0.2.3 + unplugin: 1.16.0 + update-notifier-cjs: 5.1.6(encoding@0.1.13) + transitivePeerDependencies: + - bufferutil + - encoding + - rollup + - supports-color + - utf-8-validate + + '@mux/mux-player-react@2.9.1(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mux/mux-player': 2.9.1 '@mux/playback-core': 0.25.2 @@ -13564,7 +14359,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.14 + '@types/react': 18.3.17 '@mux/mux-player@2.9.1': dependencies: @@ -13589,6 +14384,74 @@ snapshots: event-target-shim: 6.0.2 xhr: 2.6.0 + '@napi-rs/nice-android-arm-eabi@1.0.1': + optional: true + + '@napi-rs/nice-android-arm64@1.0.1': + optional: true + + '@napi-rs/nice-darwin-arm64@1.0.1': + optional: true + + '@napi-rs/nice-darwin-x64@1.0.1': + optional: true + + '@napi-rs/nice-freebsd-x64@1.0.1': + optional: true + + '@napi-rs/nice-linux-arm-gnueabihf@1.0.1': + optional: true + + '@napi-rs/nice-linux-arm64-gnu@1.0.1': + optional: true + + '@napi-rs/nice-linux-arm64-musl@1.0.1': + optional: true + + '@napi-rs/nice-linux-ppc64-gnu@1.0.1': + optional: true + + '@napi-rs/nice-linux-riscv64-gnu@1.0.1': + optional: true + + '@napi-rs/nice-linux-s390x-gnu@1.0.1': + optional: true + + '@napi-rs/nice-linux-x64-gnu@1.0.1': + optional: true + + '@napi-rs/nice-linux-x64-musl@1.0.1': + optional: true + + '@napi-rs/nice-win32-arm64-msvc@1.0.1': + optional: true + + '@napi-rs/nice-win32-ia32-msvc@1.0.1': + optional: true + + '@napi-rs/nice-win32-x64-msvc@1.0.1': + optional: true + + '@napi-rs/nice@1.0.1': + optionalDependencies: + '@napi-rs/nice-android-arm-eabi': 1.0.1 + '@napi-rs/nice-android-arm64': 1.0.1 + '@napi-rs/nice-darwin-arm64': 1.0.1 + '@napi-rs/nice-darwin-x64': 1.0.1 + '@napi-rs/nice-freebsd-x64': 1.0.1 + '@napi-rs/nice-linux-arm-gnueabihf': 1.0.1 + '@napi-rs/nice-linux-arm64-gnu': 1.0.1 + '@napi-rs/nice-linux-arm64-musl': 1.0.1 + '@napi-rs/nice-linux-ppc64-gnu': 1.0.1 + '@napi-rs/nice-linux-riscv64-gnu': 1.0.1 + '@napi-rs/nice-linux-s390x-gnu': 1.0.1 + '@napi-rs/nice-linux-x64-gnu': 1.0.1 + '@napi-rs/nice-linux-x64-musl': 1.0.1 + '@napi-rs/nice-win32-arm64-msvc': 1.0.1 + '@napi-rs/nice-win32-ia32-msvc': 1.0.1 + '@napi-rs/nice-win32-x64-msvc': 1.0.1 + optional: true + '@napi-rs/wasm-runtime@0.2.4': dependencies: '@emnapi/core': 1.3.1 @@ -13604,48 +14467,48 @@ snapshots: '@next/env@14.2.20': {} - '@next/env@15.0.4': {} + '@next/env@15.1.1': {} '@next/swc-darwin-arm64@14.2.20': optional: true - '@next/swc-darwin-arm64@15.0.4': + '@next/swc-darwin-arm64@15.1.1': optional: true '@next/swc-darwin-x64@14.2.20': optional: true - '@next/swc-darwin-x64@15.0.4': + '@next/swc-darwin-x64@15.1.1': optional: true '@next/swc-linux-arm64-gnu@14.2.20': optional: true - '@next/swc-linux-arm64-gnu@15.0.4': + '@next/swc-linux-arm64-gnu@15.1.1': optional: true '@next/swc-linux-arm64-musl@14.2.20': optional: true - '@next/swc-linux-arm64-musl@15.0.4': + '@next/swc-linux-arm64-musl@15.1.1': optional: true '@next/swc-linux-x64-gnu@14.2.20': optional: true - '@next/swc-linux-x64-gnu@15.0.4': + '@next/swc-linux-x64-gnu@15.1.1': optional: true '@next/swc-linux-x64-musl@14.2.20': optional: true - '@next/swc-linux-x64-musl@15.0.4': + '@next/swc-linux-x64-musl@15.1.1': optional: true '@next/swc-win32-arm64-msvc@14.2.20': optional: true - '@next/swc-win32-arm64-msvc@15.0.4': + '@next/swc-win32-arm64-msvc@15.1.1': optional: true '@next/swc-win32-ia32-msvc@14.2.20': @@ -13654,7 +14517,7 @@ snapshots: '@next/swc-win32-x64-msvc@14.2.20': optional: true - '@next/swc-win32-x64-msvc@15.0.4': + '@next/swc-win32-x64-msvc@15.1.1': optional: true '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': @@ -13805,50 +14668,52 @@ snapshots: - bluebird - supports-color - '@nx/devkit@20.2.1(nx@20.2.1(@swc-node/register@1.10.9(@swc/core@1.10.1)(typescript@5.7.2))(@swc/core@1.10.1))': + '@nx/devkit@20.2.2(nx@20.2.2(@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2))(@swc/core@1.10.1(@swc/helpers@0.5.15)))': dependencies: ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.2 minimatch: 9.0.3 - nx: 20.2.1(@swc-node/register@1.10.9(@swc/core@1.10.1)(typescript@5.7.2))(@swc/core@1.10.1) + nx: 20.2.2(@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2))(@swc/core@1.10.1(@swc/helpers@0.5.15)) semver: 7.6.3 tmp: 0.2.3 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/nx-darwin-arm64@20.2.1': + '@nx/nx-darwin-arm64@20.2.2': optional: true - '@nx/nx-darwin-x64@20.2.1': + '@nx/nx-darwin-x64@20.2.2': optional: true - '@nx/nx-freebsd-x64@20.2.1': + '@nx/nx-freebsd-x64@20.2.2': optional: true - '@nx/nx-linux-arm-gnueabihf@20.2.1': + '@nx/nx-linux-arm-gnueabihf@20.2.2': optional: true - '@nx/nx-linux-arm64-gnu@20.2.1': + '@nx/nx-linux-arm64-gnu@20.2.2': optional: true - '@nx/nx-linux-arm64-musl@20.2.1': + '@nx/nx-linux-arm64-musl@20.2.2': optional: true - '@nx/nx-linux-x64-gnu@20.2.1': + '@nx/nx-linux-x64-gnu@20.2.2': optional: true - '@nx/nx-linux-x64-musl@20.2.1': + '@nx/nx-linux-x64-musl@20.2.2': optional: true - '@nx/nx-win32-arm64-msvc@20.2.1': + '@nx/nx-win32-arm64-msvc@20.2.2': optional: true - '@nx/nx-win32-x64-msvc@20.2.1': + '@nx/nx-win32-x64-msvc@20.2.2': optional: true '@octokit/auth-token@3.0.4': {} + '@octokit/auth-token@4.0.0': {} + '@octokit/core@4.2.4(encoding@0.1.13)': dependencies: '@octokit/auth-token': 3.0.4 @@ -13861,12 +14726,27 @@ snapshots: transitivePeerDependencies: - encoding + '@octokit/core@5.2.0': + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.1.0 + '@octokit/request': 8.4.0 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.6.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + '@octokit/endpoint@7.0.6': dependencies: '@octokit/types': 9.3.2 is-plain-object: 5.0.0 universal-user-agent: 6.0.1 + '@octokit/endpoint@9.0.5': + dependencies: + '@octokit/types': 13.6.2 + universal-user-agent: 6.0.1 + '@octokit/graphql@5.0.6(encoding@0.1.13)': dependencies: '@octokit/request': 6.2.8(encoding@0.1.13) @@ -13875,8 +14755,18 @@ snapshots: transitivePeerDependencies: - encoding + '@octokit/graphql@7.1.0': + dependencies: + '@octokit/request': 8.4.0 + '@octokit/types': 13.6.2 + universal-user-agent: 6.0.1 + '@octokit/openapi-types@18.1.1': {} + '@octokit/openapi-types@20.0.0': {} + + '@octokit/openapi-types@22.2.0': {} + '@octokit/plugin-enterprise-rest@6.0.1': {} '@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4(encoding@0.1.13))': @@ -13885,10 +14775,20 @@ snapshots: '@octokit/tsconfig': 1.0.2 '@octokit/types': 9.3.2 + '@octokit/plugin-paginate-rest@9.2.1(@octokit/core@5.2.0)': + dependencies: + '@octokit/core': 5.2.0 + '@octokit/types': 12.6.0 + '@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4(encoding@0.1.13))': dependencies: '@octokit/core': 4.2.4(encoding@0.1.13) + '@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.0)': + dependencies: + '@octokit/core': 5.2.0 + '@octokit/types': 12.6.0 + '@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4(encoding@0.1.13))': dependencies: '@octokit/core': 4.2.4(encoding@0.1.13) @@ -13900,6 +14800,12 @@ snapshots: deprecation: 2.3.1 once: 1.4.0 + '@octokit/request-error@5.1.0': + dependencies: + '@octokit/types': 13.6.2 + deprecation: 2.3.1 + once: 1.4.0 + '@octokit/request@6.2.8(encoding@0.1.13)': dependencies: '@octokit/endpoint': 7.0.6 @@ -13911,6 +14817,13 @@ snapshots: transitivePeerDependencies: - encoding + '@octokit/request@8.4.0': + dependencies: + '@octokit/endpoint': 9.0.5 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.6.2 + universal-user-agent: 6.0.1 + '@octokit/rest@19.0.11(encoding@0.1.13)': dependencies: '@octokit/core': 4.2.4(encoding@0.1.13) @@ -13926,6 +14839,14 @@ snapshots: dependencies: '@octokit/openapi-types': 18.1.1 + '@octokit/types@12.6.0': + dependencies: + '@octokit/openapi-types': 20.0.0 + + '@octokit/types@13.6.2': + dependencies: + '@octokit/openapi-types': 22.2.0 + '@octokit/types@9.3.2': dependencies: '@octokit/openapi-types': 18.1.1 @@ -13933,13 +14854,13 @@ snapshots: '@optimize-lodash/rollup-plugin@5.0.0(rollup@4.28.1)': dependencies: '@optimize-lodash/transform': 3.0.4 - '@rollup/pluginutils': 5.1.3(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) rollup: 4.28.1 '@optimize-lodash/transform@3.0.4': dependencies: estree-walker: 2.0.2 - magic-string: 0.30.14 + magic-string: 0.30.17 '@oxc-resolver/binding-darwin-arm64@1.12.0': optional: true @@ -13981,11 +14902,11 @@ snapshots: '@pkgr/core@0.1.1': {} - '@playwright/experimental-ct-core@1.49.1(@types/node@22.10.1)(terser@5.37.0)': + '@playwright/experimental-ct-core@1.49.1(@types/node@22.10.2)(terser@5.37.0)': dependencies: playwright: 1.49.1 playwright-core: 1.49.1 - vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - '@types/node' - less @@ -13996,10 +14917,10 @@ snapshots: - sugarss - terser - '@playwright/experimental-ct-react@1.49.1(@types/node@22.10.1)(terser@5.37.0)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))': + '@playwright/experimental-ct-react@1.49.1(@types/node@22.10.2)(terser@5.37.0)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))': dependencies: - '@playwright/experimental-ct-core': 1.49.1(@types/node@22.10.1)(terser@5.37.0) - '@vitejs/plugin-react': 4.3.4(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0)) + '@playwright/experimental-ct-core': 1.49.1(@types/node@22.10.2)(terser@5.37.0) + '@vitejs/plugin-react': 4.3.4(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) transitivePeerDependencies: - '@types/node' - less @@ -14028,19 +14949,19 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@portabletext/editor@1.15.3(@sanity/block-tools@packages+@sanity+block-tools)(@sanity/schema@packages+@sanity+schema)(@sanity/types@packages+@sanity+types)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@portabletext/editor@1.16.4(@sanity/block-tools@packages+@sanity+block-tools)(@sanity/schema@packages+@sanity+schema)(@sanity/types@packages+@sanity+types)(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@portabletext/patches': 1.1.0 '@sanity/block-tools': link:packages/@sanity/block-tools '@sanity/schema': link:packages/@sanity/schema '@sanity/types': link:packages/@sanity/types - '@xstate/react': 5.0.0(@types/react@18.3.14)(react@18.3.1)(xstate@5.19.0) + '@xstate/react': 5.0.0(@types/react@18.3.17)(react@18.3.1)(xstate@5.19.0) debug: 4.4.0(supports-color@9.4.0) get-random-values-esm: 1.0.2 lodash: 4.17.21 lodash.startcase: 4.4.0 react: 18.3.1 - react-compiler-runtime: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + react-compiler-runtime: 19.0.0-beta-201e55d-20241215(react@18.3.1) rxjs: 7.8.1 slate: 0.112.0 slate-dom: 0.111.0(slate@0.112.0) @@ -14090,20 +15011,16 @@ snapshots: dependencies: ini: 1.3.8 - '@rexxars/react-json-inspector@8.0.1(react@18.3.1)': + '@rexxars/react-json-inspector@9.0.1(react@18.3.1)': dependencies: - create-react-class: 15.7.0 - debounce: 1.0.0 + debounce: 1.2.1 md5-o-matic: 0.1.1 react: 18.3.1 - '@rexxars/react-split-pane@0.1.93(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1)': + '@rexxars/react-split-pane@1.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1)': dependencies: - prop-types: 15.8.1 react: 18.3.1 react-dom: 19.0.0-rc-f994737d14-20240522(react@18.3.1) - react-lifecycles-compat: 3.0.4 - react-style-proptype: 3.2.2 '@rollup/plugin-alias@5.1.1(rollup@4.28.1)': optionalDependencies: @@ -14113,45 +15030,55 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 - '@rollup/pluginutils': 5.1.3(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) optionalDependencies: '@types/babel__core': 7.20.5 rollup: 4.28.1 transitivePeerDependencies: - supports-color - '@rollup/plugin-commonjs@28.0.1(rollup@4.28.1)': + '@rollup/plugin-commonjs@28.0.2(rollup@4.28.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.2(picomatch@4.0.2) is-reference: 1.2.1 - magic-string: 0.30.14 + magic-string: 0.30.17 picomatch: 4.0.2 optionalDependencies: rollup: 4.28.1 '@rollup/plugin-json@6.1.0(rollup@4.28.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + optionalDependencies: + rollup: 4.28.1 + + '@rollup/plugin-node-resolve@15.3.1(rollup@4.28.1)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.9 optionalDependencies: rollup: 4.28.1 - '@rollup/plugin-node-resolve@15.3.0(rollup@4.28.1)': + '@rollup/plugin-node-resolve@16.0.0(rollup@4.28.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.9 optionalDependencies: rollup: 4.28.1 - '@rollup/plugin-replace@6.0.1(rollup@4.28.1)': + '@rollup/plugin-replace@6.0.2(rollup@4.28.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.28.1) - magic-string: 0.30.14 + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + magic-string: 0.30.17 optionalDependencies: rollup: 4.28.1 @@ -14170,7 +15097,7 @@ snapshots: picomatch: 2.3.1 rollup: 4.28.1 - '@rollup/pluginutils@5.1.3(rollup@4.28.1)': + '@rollup/pluginutils@5.1.4(rollup@4.28.1)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 @@ -14235,11 +15162,15 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.28.1': optional: true + '@rrweb/types@2.0.0-alpha.16': + dependencies: + rrweb-snapshot: 2.0.0-alpha.18 + '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.10.4': {} - '@rushstack/node-core-library@5.10.0(@types/node@22.10.1)': + '@rushstack/node-core-library@5.10.1(@types/node@22.10.2)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -14247,26 +15178,26 @@ snapshots: fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.8 + resolve: 1.22.9 semver: 7.5.4 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@rushstack/rig-package@0.5.3': dependencies: - resolve: 1.22.8 + resolve: 1.22.9 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.3(@types/node@22.10.1)': + '@rushstack/terminal@0.14.4(@types/node@22.10.2)': dependencies: - '@rushstack/node-core-library': 5.10.0(@types/node@22.10.1) + '@rushstack/node-core-library': 5.10.1(@types/node@22.10.2) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 - '@rushstack/ts-command-line@4.23.1(@types/node@22.10.1)': + '@rushstack/ts-command-line@4.23.2(@types/node@22.10.2)': dependencies: - '@rushstack/terminal': 0.14.3(@types/node@22.10.1) + '@rushstack/terminal': 0.14.4(@types/node@22.10.2) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -14275,12 +15206,12 @@ snapshots: '@sanity/asset-utils@2.2.1': {} - '@sanity/assist@3.0.8(@emotion/is-prop-valid@1.3.1)(@sanity/mutator@packages+@sanity+mutator)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@sanity/assist@3.0.9(@emotion/is-prop-valid@1.3.1)(@sanity/mutator@packages+@sanity+mutator)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: - '@sanity/icons': 2.11.8(react@18.3.1) - '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/icons': 3.5.5(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@sanity/mutator': link:packages/@sanity/mutator - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(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.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) date-fns: 3.6.0 lodash: 4.17.21 lodash-es: 4.17.21 @@ -14300,7 +15231,7 @@ snapshots: nanoid: 3.3.8 rxjs: 7.8.1 - '@sanity/browserslist-config@1.0.3': {} + '@sanity/browserslist-config@1.0.5': {} '@sanity/client@6.24.1(debug@4.4.0)': dependencies: @@ -14310,9 +15241,9 @@ snapshots: transitivePeerDependencies: - debug - '@sanity/code-input@5.0.0(@babel/runtime@7.26.0)(@codemirror/theme-one-dark@6.1.2)(@emotion/is-prop-valid@1.3.1)(@lezer/common@1.2.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@sanity/code-input@5.1.2(@babel/runtime@7.26.0)(@codemirror/theme-one-dark@6.1.2)(@emotion/is-prop-valid@1.3.1)(codemirror@6.0.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: - '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3) + '@codemirror/autocomplete': 6.18.4 '@codemirror/commands': 6.7.1 '@codemirror/lang-html': 6.4.9 '@codemirror/lang-java': 6.0.1 @@ -14320,18 +15251,19 @@ snapshots: '@codemirror/lang-json': 6.0.1 '@codemirror/lang-markdown': 6.3.1 '@codemirror/lang-php': 6.0.1 - '@codemirror/lang-sql': 6.8.0(@codemirror/view@6.35.3) - '@codemirror/language': 6.10.6 + '@codemirror/lang-sql': 6.8.0 + '@codemirror/language': 6.10.7 '@codemirror/legacy-modes': 6.4.2 '@codemirror/search': 6.5.8 '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 '@juggle/resize-observer': 3.4.0 '@lezer/highlight': 1.2.1 - '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@uiw/codemirror-themes': 4.23.6(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3) - '@uiw/react-codemirror': 4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3))(@codemirror/language@6.10.6)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.35.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/icons': 3.5.5(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@uiw/codemirror-themes': 4.23.7(@codemirror/language@6.10.7)(@codemirror/state@6.5.0)(@codemirror/view@6.36.0) + '@uiw/react-codemirror': 4.23.7(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.4)(@codemirror/language@6.10.7)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.36.0)(codemirror@6.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) sanity: link:packages/sanity @@ -14341,15 +15273,14 @@ snapshots: - '@codemirror/lint' - '@codemirror/theme-one-dark' - '@emotion/is-prop-valid' - - '@lezer/common' - codemirror - react-is - '@sanity/color-input@4.0.1(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@sanity/color-input@4.0.2(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: - '@sanity/icons': 3.5.2(react@18.3.1) - '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/icons': 3.5.5(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) react: 18.3.1 react-color: 2.19.3(react@18.3.1) sanity: link:packages/sanity @@ -14362,7 +15293,7 @@ snapshots: '@sanity/color@3.0.6': {} - '@sanity/comlink@2.0.1': + '@sanity/comlink@2.0.2': dependencies: rxjs: 7.8.1 uuid: 10.0.0 @@ -14374,10 +15305,10 @@ snapshots: uuid: 10.0.0 xstate: 5.19.0 - '@sanity/core-loader@1.7.19': + '@sanity/core-loader@1.7.21': dependencies: '@sanity/client': 6.24.1(debug@4.4.0) - '@sanity/comlink': 2.0.1 + '@sanity/comlink': 2.0.2 transitivePeerDependencies: - debug @@ -14440,12 +15371,11 @@ snapshots: '@sanity/generate-help-url@3.0.0': {} - '@sanity/google-maps-input@4.0.1(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@sanity/google-maps-input@4.1.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: - '@sanity/icons': 2.11.8(react@18.3.1) - '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - lodash: 4.17.21 + '@sanity/icons': 3.5.5(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) react: 18.3.1 sanity: link:packages/sanity styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -14454,23 +15384,15 @@ snapshots: - react-dom - react-is - '@sanity/icons@1.3.10(react@18.3.1)': - dependencies: - react: 18.3.1 - - '@sanity/icons@2.11.8(react@18.3.1)': + '@sanity/icons@3.5.5(react@18.3.1)': dependencies: react: 18.3.1 + react-compiler-runtime: 19.0.0-beta-201e55d-20241215(react@18.3.1) - '@sanity/icons@3.5.2(react@18.3.1)': - dependencies: - react: 18.3.1 - react-compiler-runtime: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) - - '@sanity/icons@3.5.2(react@19.0.0-rc-f994737d14-20240522)': + '@sanity/icons@3.5.5(react@19.0.0-rc-f994737d14-20240522)': dependencies: react: 19.0.0-rc-f994737d14-20240522 - react-compiler-runtime: 19.0.0-beta-37ed2a7-20241206(react@19.0.0-rc-f994737d14-20240522) + react-compiler-runtime: 19.0.0-beta-201e55d-20241215(react@19.0.0-rc-f994737d14-20240522) '@sanity/image-url@1.1.0': {} @@ -14500,18 +15422,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@sanity/incompatible-plugin@1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@sanity/incompatible-plugin@1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@sanity/icons': 1.3.10(react@18.3.1) react: 18.3.1 - react-copy-to-clipboard: 5.1.0(react@18.3.1) react-dom: 18.3.1(react@18.3.1) '@sanity/insert-menu@1.0.16(@emotion/is-prop-valid@1.3.1)(@sanity/types@packages+@sanity+types)(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: - '@sanity/icons': 3.5.2(react@18.3.1) + '@sanity/icons': 3.5.5(react@18.3.1) '@sanity/types': link:packages/@sanity/types - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.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)) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.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)) lodash: 4.17.21 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -14522,9 +15442,9 @@ snapshots: '@sanity/insert-menu@1.0.16(@emotion/is-prop-valid@1.3.1)(@sanity/types@packages+@sanity+types)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1))': dependencies: - '@sanity/icons': 3.5.2(react@18.3.1) + '@sanity/icons': 3.5.5(react@18.3.1) '@sanity/types': link:packages/@sanity/types - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1)) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1)) lodash: 4.17.21 react: 18.3.1 react-dom: 19.0.0-rc-f994737d14-20240522(react@18.3.1) @@ -14558,12 +15478,13 @@ snapshots: '@sanity/color': 3.0.6 react: 18.3.1 - '@sanity/mutate@0.11.0-canary.3(xstate@5.19.0)': + '@sanity/mutate@0.11.0-canary.4(xstate@5.19.0)': dependencies: '@sanity/client': 6.24.1(debug@4.4.0) '@sanity/diff-match-patch': 3.1.1 hotscript: 1.0.13 lodash: 4.17.21 + lodash-es: 4.17.21 mendoza: 3.0.8 rxjs: 7.8.1 optionalDependencies: @@ -14583,26 +15504,26 @@ snapshots: transitivePeerDependencies: - debug - '@sanity/pkg-utils@6.11.15(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(debug@4.4.0)(typescript@5.7.2)': + '@sanity/pkg-utils@6.12.2(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(debug@4.4.0)(typescript@5.7.2)': dependencies: '@babel/core': 7.26.0 '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) '@babel/types': 7.26.3 - '@microsoft/api-extractor': 7.48.0(@types/node@22.10.1) + '@microsoft/api-extractor': 7.48.1(@types/node@22.10.2) '@microsoft/tsdoc-config': 0.17.1 '@optimize-lodash/rollup-plugin': 5.0.0(rollup@4.28.1) '@rollup/plugin-alias': 5.1.1(rollup@4.28.1) '@rollup/plugin-babel': 6.0.4(@babel/core@7.26.0)(@types/babel__core@7.20.5)(rollup@4.28.1) - '@rollup/plugin-commonjs': 28.0.1(rollup@4.28.1) + '@rollup/plugin-commonjs': 28.0.2(rollup@4.28.1) '@rollup/plugin-json': 6.1.0(rollup@4.28.1) - '@rollup/plugin-node-resolve': 15.3.0(rollup@4.28.1) - '@rollup/plugin-replace': 6.0.1(rollup@4.28.1) + '@rollup/plugin-node-resolve': 16.0.0(rollup@4.28.1) + '@rollup/plugin-replace': 6.0.2(rollup@4.28.1) '@rollup/plugin-terser': 0.4.4(rollup@4.28.1) - '@sanity/browserslist-config': 1.0.3 - browserslist: 4.24.2 + '@sanity/browserslist-config': 1.0.5 + browserslist: 4.24.3 cac: 6.7.14 chalk: 4.1.2 - chokidar: 4.0.1 + chokidar: 4.0.3 esbuild: 0.24.0 esbuild-register: 3.6.0(esbuild@0.24.0) find-config: 1.0.0 @@ -14625,36 +15546,36 @@ snapshots: treeify: 1.1.0 typescript: 5.7.2 uuid: 11.0.3 - zod: 3.23.8 - zod-validation-error: 3.4.0(zod@3.23.8) + zod: 3.24.1 + zod-validation-error: 3.4.0(zod@3.24.1) optionalDependencies: - babel-plugin-react-compiler: 19.0.0-beta-37ed2a7-20241206 + babel-plugin-react-compiler: 19.0.0-beta-201e55d-20241215 transitivePeerDependencies: - '@types/babel__core' - '@types/node' - debug - supports-color - '@sanity/pkg-utils@6.11.15(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(typescript@5.7.2)': + '@sanity/pkg-utils@6.12.2(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(typescript@5.7.2)': dependencies: '@babel/core': 7.26.0 '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) '@babel/types': 7.26.3 - '@microsoft/api-extractor': 7.48.0(@types/node@22.10.1) + '@microsoft/api-extractor': 7.48.1(@types/node@22.10.2) '@microsoft/tsdoc-config': 0.17.1 '@optimize-lodash/rollup-plugin': 5.0.0(rollup@4.28.1) '@rollup/plugin-alias': 5.1.1(rollup@4.28.1) '@rollup/plugin-babel': 6.0.4(@babel/core@7.26.0)(@types/babel__core@7.20.5)(rollup@4.28.1) - '@rollup/plugin-commonjs': 28.0.1(rollup@4.28.1) + '@rollup/plugin-commonjs': 28.0.2(rollup@4.28.1) '@rollup/plugin-json': 6.1.0(rollup@4.28.1) - '@rollup/plugin-node-resolve': 15.3.0(rollup@4.28.1) - '@rollup/plugin-replace': 6.0.1(rollup@4.28.1) + '@rollup/plugin-node-resolve': 16.0.0(rollup@4.28.1) + '@rollup/plugin-replace': 6.0.2(rollup@4.28.1) '@rollup/plugin-terser': 0.4.4(rollup@4.28.1) - '@sanity/browserslist-config': 1.0.3 - browserslist: 4.24.2 + '@sanity/browserslist-config': 1.0.5 + browserslist: 4.24.3 cac: 6.7.14 chalk: 4.1.2 - chokidar: 4.0.1 + chokidar: 4.0.3 esbuild: 0.24.0 esbuild-register: 3.6.0(esbuild@0.24.0) find-config: 1.0.0 @@ -14677,62 +15598,10 @@ snapshots: treeify: 1.1.0 typescript: 5.7.2 uuid: 11.0.3 - zod: 3.23.8 - zod-validation-error: 3.4.0(zod@3.23.8) + zod: 3.24.1 + zod-validation-error: 3.4.0(zod@3.24.1) optionalDependencies: - babel-plugin-react-compiler: 19.0.0-beta-37ed2a7-20241206 - transitivePeerDependencies: - - '@types/babel__core' - - '@types/node' - - debug - - supports-color - - '@sanity/pkg-utils@6.12.0(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(debug@4.4.0)(typescript@5.7.2)': - dependencies: - '@babel/core': 7.26.0 - '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) - '@babel/types': 7.26.3 - '@microsoft/api-extractor': 7.48.0(@types/node@22.10.1) - '@microsoft/tsdoc-config': 0.17.1 - '@optimize-lodash/rollup-plugin': 5.0.0(rollup@4.28.1) - '@rollup/plugin-alias': 5.1.1(rollup@4.28.1) - '@rollup/plugin-babel': 6.0.4(@babel/core@7.26.0)(@types/babel__core@7.20.5)(rollup@4.28.1) - '@rollup/plugin-commonjs': 28.0.1(rollup@4.28.1) - '@rollup/plugin-json': 6.1.0(rollup@4.28.1) - '@rollup/plugin-node-resolve': 15.3.0(rollup@4.28.1) - '@rollup/plugin-replace': 6.0.1(rollup@4.28.1) - '@rollup/plugin-terser': 0.4.4(rollup@4.28.1) - '@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.4.0) - git-url-parse: 16.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.4.2 - pretty-bytes: 5.6.0 - prompts: 2.4.2 - recast: 0.23.9 - rimraf: 4.4.1 - rollup: 4.28.1 - rollup-plugin-esbuild: 6.1.1(esbuild@0.24.0)(rollup@4.28.1) - rxjs: 7.8.1 - treeify: 1.1.0 - typescript: 5.7.2 - uuid: 11.0.3 - zod: 3.23.8 - zod-validation-error: 3.4.0(zod@3.23.8) - optionalDependencies: - babel-plugin-react-compiler: 19.0.0-beta-37ed2a7-20241206 + babel-plugin-react-compiler: 19.0.0-beta-201e55d-20241215 transitivePeerDependencies: - '@types/babel__core' - '@types/node' @@ -14743,10 +15612,10 @@ snapshots: dependencies: '@sanity/client': 6.24.1(debug@4.4.0) '@sanity/comlink': 2.0.2-release.0 - '@sanity/icons': 3.5.2(react@18.3.1) + '@sanity/icons': 3.5.5(react@18.3.1) '@sanity/logos': 2.1.13(@sanity/color@3.0.6)(react@18.3.1) '@sanity/preview-url-secret': 2.0.6-release.0(@sanity/client@6.24.1(debug@4.4.0)) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.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)) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.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)) '@sanity/uuid': 3.0.2 fast-deep-equal: 3.1.3 framer-motion: 11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -14782,10 +15651,10 @@ snapshots: '@sanity/client': 6.24.1(debug@4.4.0) '@sanity/uuid': 3.0.2 - '@sanity/react-loader@1.10.28(react@18.3.1)': + '@sanity/react-loader@1.10.30(react@18.3.1)': dependencies: '@sanity/client': 6.24.1(debug@4.4.0) - '@sanity/core-loader': 1.7.19 + '@sanity/core-loader': 1.7.21 react: 18.3.1 transitivePeerDependencies: - debug @@ -14804,6 +15673,20 @@ snapshots: rxjs: 7.8.1 typeid-js: 0.3.0 + '@sanity/template-validator@1.0.3(@types/babel__core@7.20.5)(@types/node@22.10.2)(debug@4.4.0)': + dependencies: + '@actions/core': 1.11.1 + '@actions/github': 6.0.0 + '@sanity/pkg-utils': 6.12.2(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(debug@4.4.0)(typescript@5.7.2) + typescript: 5.7.2 + yaml: 2.6.1 + transitivePeerDependencies: + - '@types/babel__core' + - '@types/node' + - babel-plugin-react-compiler + - debug + - supports-color + '@sanity/test@0.0.1-alpha.1': dependencies: '@playwright/test': 1.49.1 @@ -14813,24 +15696,24 @@ snapshots: transitivePeerDependencies: - debug - '@sanity/tsdoc@1.0.150(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(debug@4.4.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.37.0)(yaml@2.6.1)': + '@sanity/tsdoc@1.0.153(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(debug@4.4.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.37.0)(yaml@2.6.1)': dependencies: - '@microsoft/api-extractor': 7.48.0(@types/node@22.10.1) - '@microsoft/api-extractor-model': 7.30.0(@types/node@22.10.1) + '@microsoft/api-extractor': 7.48.1(@types/node@22.10.2) + '@microsoft/api-extractor-model': 7.30.1(@types/node@22.10.2) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 '@portabletext/react': 3.2.0(react@18.3.1) '@portabletext/toolkit': 2.0.16 '@sanity/client': 6.24.1(debug@4.4.0) '@sanity/color': 3.0.6 - '@sanity/icons': 3.5.2(react@18.3.1) - '@sanity/pkg-utils': 6.11.15(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(debug@4.4.0)(typescript@5.7.2) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.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)) + '@sanity/icons': 3.5.5(react@18.3.1) + '@sanity/pkg-utils': 6.12.2(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(debug@4.4.0)(typescript@5.7.2) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.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)) '@types/cpx': 1.5.5 - '@vitejs/plugin-react': 4.3.4(vite@6.0.3(@types/node@22.10.1)(terser@5.37.0)(yaml@2.6.1)) + '@vitejs/plugin-react': 4.3.4(vite@6.0.3(@types/node@22.10.2)(terser@5.37.0)(yaml@2.6.1)) cac: 6.7.14 chalk: 4.1.2 - chokidar: 4.0.1 + chokidar: 4.0.3 cors: 2.8.5 dotenv-flow: 3.3.0 esbuild: 0.24.0 @@ -14851,7 +15734,7 @@ snapshots: styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tmp: 0.2.3 typescript: 5.7.2 - vite: 6.0.3(@types/node@22.10.1)(terser@5.37.0)(yaml@2.6.1) + vite: 6.0.3(@types/node@22.10.2)(terser@5.37.0)(yaml@2.6.1) transitivePeerDependencies: - '@emotion/is-prop-valid' - '@types/babel__core' @@ -14871,24 +15754,24 @@ snapshots: - tsx - yaml - '@sanity/tsdoc@1.0.150(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.37.0)(yaml@2.6.1)': + '@sanity/tsdoc@1.0.153(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.37.0)(yaml@2.6.1)': dependencies: - '@microsoft/api-extractor': 7.48.0(@types/node@22.10.1) - '@microsoft/api-extractor-model': 7.30.0(@types/node@22.10.1) + '@microsoft/api-extractor': 7.48.1(@types/node@22.10.2) + '@microsoft/api-extractor-model': 7.30.1(@types/node@22.10.2) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 '@portabletext/react': 3.2.0(react@18.3.1) '@portabletext/toolkit': 2.0.16 '@sanity/client': 6.24.1(debug@4.4.0) '@sanity/color': 3.0.6 - '@sanity/icons': 3.5.2(react@18.3.1) - '@sanity/pkg-utils': 6.11.15(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(typescript@5.7.2) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/icons': 3.5.5(react@18.3.1) + '@sanity/pkg-utils': 6.12.2(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(typescript@5.7.2) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@types/cpx': 1.5.5 - '@vitejs/plugin-react': 4.3.4(vite@6.0.3(@types/node@22.10.1)(terser@5.37.0)(yaml@2.6.1)) + '@vitejs/plugin-react': 4.3.4(vite@6.0.3(@types/node@22.10.2)(terser@5.37.0)(yaml@2.6.1)) cac: 6.7.14 chalk: 4.1.2 - chokidar: 4.0.1 + chokidar: 4.0.3 cors: 2.8.5 dotenv-flow: 3.3.0 esbuild: 0.24.0 @@ -14909,7 +15792,7 @@ snapshots: styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tmp: 0.2.3 typescript: 5.7.2 - vite: 6.0.3(@types/node@22.10.1)(terser@5.37.0)(yaml@2.6.1) + vite: 6.0.3(@types/node@22.10.2)(terser@5.37.0)(yaml@2.6.1) transitivePeerDependencies: - '@emotion/is-prop-valid' - '@types/babel__core' @@ -14929,24 +15812,24 @@ snapshots: - tsx - yaml - '@sanity/tsdoc@1.0.150(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react-is@19.0.0-rc.1)(react@19.0.0-rc-f994737d14-20240522)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522))(terser@5.37.0)(yaml@2.6.1)': + '@sanity/tsdoc@1.0.153(@emotion/is-prop-valid@1.3.1)(@types/babel__core@7.20.5)(@types/node@22.10.2)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react-is@19.0.0-rc.1)(react@19.0.0-rc-f994737d14-20240522)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522))(terser@5.37.0)(yaml@2.6.1)': dependencies: - '@microsoft/api-extractor': 7.48.0(@types/node@22.10.1) - '@microsoft/api-extractor-model': 7.30.0(@types/node@22.10.1) + '@microsoft/api-extractor': 7.48.1(@types/node@22.10.2) + '@microsoft/api-extractor-model': 7.30.1(@types/node@22.10.2) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 '@portabletext/react': 3.2.0(react@19.0.0-rc-f994737d14-20240522) '@portabletext/toolkit': 2.0.16 '@sanity/client': 6.24.1(debug@4.4.0) '@sanity/color': 3.0.6 - '@sanity/icons': 3.5.2(react@19.0.0-rc-f994737d14-20240522) - '@sanity/pkg-utils': 6.11.15(@types/babel__core@7.20.5)(@types/node@22.10.1)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(typescript@5.7.2) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react-is@19.0.0-rc.1)(react@19.0.0-rc-f994737d14-20240522)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)) + '@sanity/icons': 3.5.5(react@19.0.0-rc-f994737d14-20240522) + '@sanity/pkg-utils': 6.12.2(@types/babel__core@7.20.5)(@types/node@22.10.2)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(typescript@5.7.2) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react-is@19.0.0-rc.1)(react@19.0.0-rc-f994737d14-20240522)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)) '@types/cpx': 1.5.5 - '@vitejs/plugin-react': 4.3.4(vite@6.0.3(@types/node@22.10.1)(terser@5.37.0)(yaml@2.6.1)) + '@vitejs/plugin-react': 4.3.4(vite@6.0.3(@types/node@22.10.2)(terser@5.37.0)(yaml@2.6.1)) cac: 6.7.14 chalk: 4.1.2 - chokidar: 4.0.1 + chokidar: 4.0.3 cors: 2.8.5 dotenv-flow: 3.3.0 esbuild: 0.24.0 @@ -14967,7 +15850,7 @@ snapshots: styled-components: 6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) tmp: 0.2.3 typescript: 5.7.2 - vite: 6.0.3(@types/node@22.10.1)(terser@5.37.0)(yaml@2.6.1) + vite: 6.0.3(@types/node@22.10.2)(terser@5.37.0)(yaml@2.6.1) transitivePeerDependencies: - '@emotion/is-prop-valid' - '@types/babel__core' @@ -14990,15 +15873,15 @@ snapshots: '@sanity/types@3.37.2(debug@4.4.0)': dependencies: '@sanity/client': 6.24.1(debug@4.4.0) - '@types/react': 18.3.14 + '@types/react': 18.3.17 transitivePeerDependencies: - debug - '@sanity/ui-workshop@1.2.11(@sanity/icons@3.5.2(react@18.3.1))(@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.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)))(@types/node@22.10.1)(react-dom@18.3.1(react@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))(terser@5.37.0)': + '@sanity/ui-workshop@1.2.11(@sanity/icons@3.5.5(react@18.3.1))(@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.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)))(@types/node@22.10.2)(react-dom@18.3.1(react@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))(terser@5.37.0)': dependencies: - '@sanity/icons': 3.5.2(react@18.3.1) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.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)) - '@vitejs/plugin-react': 4.3.4(vite@4.5.5(@types/node@22.10.1)(terser@5.37.0)) + '@sanity/icons': 3.5.5(react@18.3.1) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.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)) + '@vitejs/plugin-react': 4.3.4(vite@4.5.5(@types/node@22.10.2)(terser@5.37.0)) axe-core: 4.10.2 cac: 6.7.14 chokidar: 3.6.0 @@ -15014,7 +15897,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) segmented-property: 3.0.3 styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - vite: 4.5.5(@types/node@22.10.1)(terser@5.37.0) + vite: 4.5.5(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - '@types/node' - less @@ -15025,11 +15908,11 @@ snapshots: - supports-color - terser - '@sanity/ui-workshop@1.2.11(@sanity/icons@3.5.2(react@18.3.1))(@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/node@22.10.1)(react-dom@18.3.1(react@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))(terser@5.37.0)': + '@sanity/ui-workshop@1.2.11(@sanity/icons@3.5.5(react@18.3.1))(@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/node@22.10.2)(react-dom@18.3.1(react@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))(terser@5.37.0)': dependencies: - '@sanity/icons': 3.5.2(react@18.3.1) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@vitejs/plugin-react': 4.3.4(vite@4.5.5(@types/node@22.10.1)(terser@5.37.0)) + '@sanity/icons': 3.5.5(react@18.3.1) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@vitejs/plugin-react': 4.3.4(vite@4.5.5(@types/node@22.10.2)(terser@5.37.0)) axe-core: 4.10.2 cac: 6.7.14 chokidar: 3.6.0 @@ -15045,7 +15928,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) segmented-property: 3.0.3 styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - vite: 4.5.5(@types/node@22.10.1)(terser@5.37.0) + vite: 4.5.5(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - '@types/node' - less @@ -15056,15 +15939,15 @@ snapshots: - supports-color - terser - '@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.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))': + '@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.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: '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@sanity/color': 3.0.6 - '@sanity/icons': 3.5.2(react@18.3.1) + '@sanity/icons': 3.5.5(react@18.3.1) csstype: 3.1.3 - framer-motion: 11.13.5(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + framer-motion: 11.15.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - react-compiler-runtime: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + react-compiler-runtime: 19.0.0-beta-201e55d-20241215(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 react-refractor: 2.2.0(react@18.3.1) @@ -15073,15 +15956,15 @@ snapshots: transitivePeerDependencies: - '@emotion/is-prop-valid' - '@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(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.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@sanity/color': 3.0.6 - '@sanity/icons': 3.5.2(react@18.3.1) + '@sanity/icons': 3.5.5(react@18.3.1) csstype: 3.1.3 - framer-motion: 11.13.5(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + framer-motion: 11.15.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - react-compiler-runtime: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + react-compiler-runtime: 19.0.0-beta-201e55d-20241215(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-is: 19.0.0-rc.1 react-refractor: 2.2.0(react@18.3.1) @@ -15090,15 +15973,15 @@ snapshots: transitivePeerDependencies: - '@emotion/is-prop-valid' - '@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1))': + '@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1))': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1) '@sanity/color': 3.0.6 - '@sanity/icons': 3.5.2(react@18.3.1) + '@sanity/icons': 3.5.5(react@18.3.1) csstype: 3.1.3 - framer-motion: 11.13.5(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1) + framer-motion: 11.15.0(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1) react: 18.3.1 - react-compiler-runtime: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + react-compiler-runtime: 19.0.0-beta-201e55d-20241215(react@18.3.1) react-dom: 19.0.0-rc-f994737d14-20240522(react@18.3.1) react-is: 19.0.0-rc.1 react-refractor: 2.2.0(react@18.3.1) @@ -15107,15 +15990,15 @@ snapshots: transitivePeerDependencies: - '@emotion/is-prop-valid' - '@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react-is@19.0.0-rc.1)(react@19.0.0-rc-f994737d14-20240522)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522))': + '@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react-is@19.0.0-rc.1)(react@19.0.0-rc-f994737d14-20240522)(styled-components@6.1.13(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522))': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) '@sanity/color': 3.0.6 - '@sanity/icons': 3.5.2(react@19.0.0-rc-f994737d14-20240522) + '@sanity/icons': 3.5.5(react@19.0.0-rc-f994737d14-20240522) csstype: 3.1.3 - framer-motion: 11.13.5(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + framer-motion: 11.15.0(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) react: 19.0.0-rc-f994737d14-20240522 - react-compiler-runtime: 19.0.0-beta-37ed2a7-20241206(react@19.0.0-rc-f994737d14-20240522) + react-compiler-runtime: 19.0.0-beta-201e55d-20241215(react@19.0.0-rc-f994737d14-20240522) react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) react-is: 19.0.0-rc.1 react-refractor: 2.2.0(react@19.0.0-rc-f994737d14-20240522) @@ -15139,15 +16022,15 @@ snapshots: '@types/uuid': 8.3.4 uuid: 8.3.2 - '@sanity/visual-editing@2.10.6(@sanity/client@6.24.1)(next@15.0.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@sanity/visual-editing@2.10.10(@sanity/client@6.24.1)(next@15.1.1(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@sanity/comlink': 2.0.1 - '@sanity/mutate': 0.11.0-canary.3(xstate@5.19.0) + '@sanity/comlink': 2.0.2 + '@sanity/mutate': 0.11.0-canary.4(xstate@5.19.0) '@sanity/preview-url-secret': 2.0.5(@sanity/client@6.24.1) '@vercel/stega': 0.1.2 get-random-values-esm: 1.0.2 react: 18.3.1 - react-compiler-runtime: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + react-compiler-runtime: 19.0.0-beta-201e55d-20241215(react@18.3.1) react-dom: 18.3.1(react@18.3.1) rxjs: 7.8.1 scroll-into-view-if-needed: 3.1.0 @@ -15156,48 +16039,48 @@ snapshots: xstate: 5.19.0 optionalDependencies: '@sanity/client': 6.24.1(debug@4.4.0) - next: 15.0.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.1.1(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - debug - '@sentry-internal/browser-utils@8.42.0': + '@sentry-internal/browser-utils@8.46.0': dependencies: - '@sentry/core': 8.42.0 + '@sentry/core': 8.46.0 - '@sentry-internal/feedback@8.42.0': + '@sentry-internal/feedback@8.46.0': dependencies: - '@sentry/core': 8.42.0 + '@sentry/core': 8.46.0 - '@sentry-internal/replay-canvas@8.42.0': + '@sentry-internal/replay-canvas@8.46.0': dependencies: - '@sentry-internal/replay': 8.42.0 - '@sentry/core': 8.42.0 + '@sentry-internal/replay': 8.46.0 + '@sentry/core': 8.46.0 - '@sentry-internal/replay@8.42.0': + '@sentry-internal/replay@8.46.0': dependencies: - '@sentry-internal/browser-utils': 8.42.0 - '@sentry/core': 8.42.0 + '@sentry-internal/browser-utils': 8.46.0 + '@sentry/core': 8.46.0 - '@sentry/browser@8.42.0': + '@sentry/browser@8.46.0': dependencies: - '@sentry-internal/browser-utils': 8.42.0 - '@sentry-internal/feedback': 8.42.0 - '@sentry-internal/replay': 8.42.0 - '@sentry-internal/replay-canvas': 8.42.0 - '@sentry/core': 8.42.0 + '@sentry-internal/browser-utils': 8.46.0 + '@sentry-internal/feedback': 8.46.0 + '@sentry-internal/replay': 8.46.0 + '@sentry-internal/replay-canvas': 8.46.0 + '@sentry/core': 8.46.0 - '@sentry/core@8.42.0': {} + '@sentry/core@8.46.0': {} - '@sentry/react@8.42.0(react@18.3.1)': + '@sentry/react@8.46.0(react@18.3.1)': dependencies: - '@sentry/browser': 8.42.0 - '@sentry/core': 8.42.0 + '@sentry/browser': 8.46.0 + '@sentry/core': 8.46.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 - '@sentry/types@8.42.0': + '@sentry/types@8.46.0': dependencies: - '@sentry/core': 8.42.0 + '@sentry/core': 8.46.0 '@sigstore/bundle@2.3.2': dependencies: @@ -15233,16 +16116,18 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@swc-node/core@1.13.3(@swc/core@1.10.1(@swc/helpers@0.5.13))(@swc/types@0.1.17)': + '@socket.io/component-emitter@3.1.2': {} + + '@swc-node/core@1.13.3(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)': dependencies: - '@swc/core': 1.10.1(@swc/helpers@0.5.13) + '@swc/core': 1.10.1(@swc/helpers@0.5.15) '@swc/types': 0.1.17 - '@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.13))(@swc/types@0.1.17)(typescript@5.7.2)': + '@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2)': dependencies: - '@swc-node/core': 1.13.3(@swc/core@1.10.1(@swc/helpers@0.5.13))(@swc/types@0.1.17) + '@swc-node/core': 1.13.3(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17) '@swc-node/sourcemap-support': 0.5.1 - '@swc/core': 1.10.1(@swc/helpers@0.5.13) + '@swc/core': 1.10.1(@swc/helpers@0.5.15) colorette: 2.0.20 debug: 4.4.0(supports-color@9.4.0) oxc-resolver: 1.12.0 @@ -15288,7 +16173,7 @@ snapshots: '@swc/core-win32-x64-msvc@1.10.1': optional: true - '@swc/core@1.10.1(@swc/helpers@0.5.13)': + '@swc/core@1.10.1(@swc/helpers@0.5.15)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.17 @@ -15303,11 +16188,11 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.10.1 '@swc/core-win32-ia32-msvc': 1.10.1 '@swc/core-win32-x64-msvc': 1.10.1 - '@swc/helpers': 0.5.13 + '@swc/helpers': 0.5.15 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.13': + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -15327,20 +16212,21 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/react-table@8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-table@8.20.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/table-core': 8.20.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/react-virtual@3.0.0-beta.54(react@18.3.1)': + '@tanstack/react-virtual@3.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/virtual-core': 3.0.0-beta.54 + '@tanstack/virtual-core': 3.11.2 react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) '@tanstack/table-core@8.20.5': {} - '@tanstack/virtual-core@3.0.0-beta.54': {} + '@tanstack/virtual-core@3.11.2': {} '@testing-library/dom@10.4.0': dependencies: @@ -15363,15 +16249,15 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@15.0.7(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@15.0.7(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 '@testing-library/dom': 10.4.0 - '@types/react-dom': 18.3.3(@types/react@18.3.14) + '@types/react-dom': 18.3.5(@types/react@18.3.17) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.14 + '@types/react': 18.3.17 '@testing-library/user-event@13.5.0(@testing-library/dom@10.4.0)': dependencies: @@ -15388,6 +16274,8 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@tsconfig/svelte@1.0.13': {} + '@tufjs/canonical-json@2.0.0': {} '@tufjs/models@2.0.1': @@ -15430,12 +16318,6 @@ snapshots: '@types/aria-query@5.0.4': {} - '@types/arrify@1.0.4': {} - - '@types/arrify@2.0.5': - dependencies: - arrify: 2.0.1 - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.3 @@ -15469,9 +16351,17 @@ snapshots: '@types/configstore@5.0.1': {} + '@types/cookie@0.4.1': {} + + '@types/cors@2.8.17': + dependencies: + '@types/node': 22.10.2 + '@types/cpx@1.5.5': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 + + '@types/css-font-loading-module@0.0.7': {} '@types/debug@4.1.12': dependencies: @@ -15479,7 +16369,7 @@ snapshots: '@types/decompress@4.2.7': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/estree@0.0.39': {} @@ -15491,12 +16381,12 @@ snapshots: '@types/follow-redirects@1.14.4': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/hast@2.3.10': dependencies: @@ -15504,7 +16394,7 @@ snapshots: '@types/hoist-non-react-statics@3.3.6': dependencies: - '@types/react': 18.3.14 + '@types/react': 18.3.17 hoist-non-react-statics: 3.3.2 '@types/inquirer@6.5.0': @@ -15514,7 +16404,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/tough-cookie': 4.0.5 parse5: 7.2.1 @@ -15538,11 +16428,11 @@ snapshots: '@types/ms@0.7.34': {} - '@types/node@18.19.67': + '@types/node@18.19.68': dependencies: undici-types: 5.26.5 - '@types/node@22.10.1': + '@types/node@22.10.2': dependencies: undici-types: 6.20.0 @@ -15558,43 +16448,39 @@ snapshots: '@types/progress-stream@2.0.5': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/prop-types@15.7.14': {} '@types/raf@3.4.3': {} - '@types/react-copy-to-clipboard@5.0.7': - dependencies: - '@types/react': 18.3.14 - - '@types/react-dom@18.3.3(@types/react@18.3.14)': + '@types/react-dom@18.3.5(@types/react@18.3.17)': dependencies: - '@types/react': 18.3.14 + '@types/react': 18.3.17 '@types/react-is@18.3.1': dependencies: - '@types/react': 18.3.14 + '@types/react': 18.3.17 '@types/react-redux@7.1.34': dependencies: '@types/hoist-non-react-statics': 3.3.6 - '@types/react': 18.3.14 + '@types/react': 18.3.17 hoist-non-react-statics: 3.3.2 redux: 4.2.1 - '@types/react-transition-group@4.4.11': + '@types/react-transition-group@4.4.12(@types/react@18.3.17)': dependencies: - '@types/react': 18.3.14 + '@types/react': 18.3.17 - '@types/react@18.3.14': + '@types/react@18.3.17': dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 '@types/readdir-glob@1.1.5': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/refractor@3.4.1': dependencies: @@ -15603,7 +16489,7 @@ snapshots: '@types/request@2.48.12': dependencies: '@types/caseless': 0.12.5 - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/tough-cookie': 4.0.5 form-data: 2.5.2 @@ -15619,7 +16505,7 @@ snapshots: '@types/serve-handler@6.1.4': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/shallow-equals@1.0.3': {} @@ -15629,16 +16515,16 @@ snapshots: '@types/tar-fs@2.0.4': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/tar-stream': 3.1.3 '@types/tar-stream@3.1.3': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/tar@6.1.13': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 minipass: 4.2.8 '@types/tern@0.23.9': @@ -15647,10 +16533,13 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 '@types/tough-cookie@4.0.5': {} + '@types/trusted-types@2.0.7': + optional: true + '@types/unist@2.0.11': {} '@types/use-sync-external-store@0.0.6': {} @@ -15748,31 +16637,31 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@uiw/codemirror-extensions-basic-setup@4.23.6(@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3))(@codemirror/commands@6.7.1)(@codemirror/language@6.10.6)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)': + '@uiw/codemirror-extensions-basic-setup@4.23.7(@codemirror/autocomplete@6.18.4)(@codemirror/commands@6.7.1)(@codemirror/language@6.10.7)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/view@6.36.0)': dependencies: - '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3) + '@codemirror/autocomplete': 6.18.4 '@codemirror/commands': 6.7.1 - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@codemirror/lint': 6.8.4 '@codemirror/search': 6.5.8 '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 - '@uiw/codemirror-themes@4.23.6(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)': + '@uiw/codemirror-themes@4.23.7(@codemirror/language@6.10.7)(@codemirror/state@6.5.0)(@codemirror/view@6.36.0)': dependencies: - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 + '@codemirror/view': 6.36.0 - '@uiw/react-codemirror@4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3))(@codemirror/language@6.10.6)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.35.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1)': + '@uiw/react-codemirror@4.23.7(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.4)(@codemirror/language@6.10.7)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.36.0)(codemirror@6.0.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 '@codemirror/commands': 6.7.1 '@codemirror/state': 6.5.0 '@codemirror/theme-one-dark': 6.1.2 - '@codemirror/view': 6.35.3 - '@uiw/codemirror-extensions-basic-setup': 4.23.6(@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3))(@codemirror/commands@6.7.1)(@codemirror/language@6.10.6)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3) - codemirror: 6.0.1(@lezer/common@1.2.3) + '@codemirror/view': 6.36.0 + '@uiw/codemirror-extensions-basic-setup': 4.23.7(@codemirror/autocomplete@6.18.4)(@codemirror/commands@6.7.1)(@codemirror/language@6.10.7)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/view@6.36.0) + codemirror: 6.0.1 react: 18.3.1 react-dom: 19.0.0-rc-f994737d14-20240522(react@18.3.1) transitivePeerDependencies: @@ -15781,15 +16670,15 @@ snapshots: - '@codemirror/lint' - '@codemirror/search' - '@uiw/react-codemirror@4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3))(@codemirror/language@6.10.6)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.35.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@uiw/react-codemirror@4.23.7(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.4)(@codemirror/language@6.10.7)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.36.0)(codemirror@6.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 '@codemirror/commands': 6.7.1 '@codemirror/state': 6.5.0 '@codemirror/theme-one-dark': 6.1.2 - '@codemirror/view': 6.35.3 - '@uiw/codemirror-extensions-basic-setup': 4.23.6(@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3))(@codemirror/commands@6.7.1)(@codemirror/language@6.10.6)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3) - codemirror: 6.0.1(@lezer/common@1.2.3) + '@codemirror/view': 6.36.0 + '@uiw/codemirror-extensions-basic-setup': 4.23.7(@codemirror/autocomplete@6.18.4)(@codemirror/commands@6.7.1)(@codemirror/language@6.10.7)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.8)(@codemirror/state@6.5.0)(@codemirror/view@6.36.0) + codemirror: 6.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -15826,40 +16715,40 @@ snapshots: '@vercel/stega@0.1.2': {} - '@vitejs/plugin-react@4.3.4(vite@4.5.5(@types/node@22.10.1)(terser@5.37.0))': + '@vitejs/plugin-react@4.3.4(vite@4.5.5(@types/node@22.10.2)(terser@5.37.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 4.5.5(@types/node@22.10.1)(terser@5.37.0) + vite: 4.5.5(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))': + '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.4(vite@6.0.3(@types/node@22.10.1)(terser@5.37.0)(yaml@2.6.1))': + '@vitejs/plugin-react@4.3.4(vite@6.0.3(@types/node@22.10.2)(terser@5.37.0)(yaml@2.6.1))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.0.3(@types/node@22.10.1)(terser@5.37.0)(yaml@2.6.1) + vite: 6.0.3(@types/node@22.10.2)(terser@5.37.0)(yaml@2.6.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.8(vitest@2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0))': + '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.2)(jsdom@23.2.0)(terser@5.37.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -15868,12 +16757,12 @@ snapshots: istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 - magic-string: 0.30.14 + magic-string: 0.30.17 magicast: 0.3.5 std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0) + vitest: 2.1.8(@types/node@22.10.2)(jsdom@23.2.0)(terser@5.37.0) transitivePeerDependencies: - supports-color @@ -15884,21 +16773,28 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.11(@types/node@18.19.67)(terser@5.37.0))': + '@vitest/expect@2.1.8': + dependencies: + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))': dependencies: '@vitest/spy': 2.1.1 estree-walker: 3.0.3 - magic-string: 0.30.14 + magic-string: 0.30.17 optionalDependencies: - vite: 5.4.11(@types/node@18.19.67)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) - '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))': + '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))': dependencies: - '@vitest/spy': 2.1.1 + '@vitest/spy': 2.1.8 estree-walker: 3.0.3 - magic-string: 0.30.14 + magic-string: 0.30.17 optionalDependencies: - vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) '@vitest/pretty-format@2.1.1': dependencies: @@ -15913,22 +16809,43 @@ snapshots: '@vitest/utils': 2.1.1 pathe: 1.1.2 + '@vitest/runner@2.1.8': + dependencies: + '@vitest/utils': 2.1.8 + pathe: 1.1.2 + '@vitest/snapshot@2.1.1': dependencies: '@vitest/pretty-format': 2.1.1 - magic-string: 0.30.14 + magic-string: 0.30.17 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.17 pathe: 1.1.2 '@vitest/spy@2.1.1': dependencies: tinyspy: 3.0.2 + '@vitest/spy@2.1.8': + dependencies: + tinyspy: 3.0.2 + '@vitest/utils@2.1.1': dependencies: '@vitest/pretty-format': 2.1.1 loupe: 3.1.2 tinyrainbow: 1.2.0 + '@vitest/utils@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + '@vue/compiler-core@3.5.13': dependencies: '@babel/parser': 7.26.3 @@ -15950,7 +16867,7 @@ snapshots: '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 estree-walker: 2.0.2 - magic-string: 0.30.14 + magic-string: 0.30.17 postcss: 8.4.49 source-map-js: 1.2.1 @@ -15963,10 +16880,12 @@ snapshots: '@vvo/tzdb@6.137.0': {} - '@xstate/react@5.0.0(@types/react@18.3.14)(react@18.3.1)(xstate@5.19.0)': + '@xstate/fsm@1.6.5': {} + + '@xstate/react@5.0.0(@types/react@18.3.17)(react@18.3.1)(xstate@5.19.0)': dependencies: react: 18.3.1 - use-isomorphic-layout-effect: 1.2.0(@types/react@18.3.14)(react@18.3.1) + use-isomorphic-layout-effect: 1.2.0(@types/react@18.3.17)(react@18.3.1) use-sync-external-store: 1.4.0(react@18.3.1) optionalDependencies: xstate: 5.19.0 @@ -16145,7 +17064,7 @@ snapshots: array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.8 - is-array-buffer: 3.0.4 + is-array-buffer: 3.0.5 array-differ@3.0.0: {} @@ -16157,10 +17076,10 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.5 - is-string: 1.1.0 + get-intrinsic: 1.2.6 + is-string: 1.1.1 array-union@2.1.0: {} @@ -16172,7 +17091,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -16181,43 +17100,42 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.2: + array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-shim-unscopables: 1.0.2 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-errors: 1.3.0 - get-intrinsic: 1.2.5 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.2.6 + is-array-buffer: 3.0.5 arrify@1.0.1: {} @@ -16229,6 +17147,10 @@ snapshots: ast-types-flow@0.0.8: {} + ast-types@0.14.2: + dependencies: + tslib: 2.8.1 + ast-types@0.16.1: dependencies: tslib: 2.8.1 @@ -16275,7 +17197,7 @@ snapshots: dependencies: '@babel/runtime': 7.26.0 cosmiconfig: 7.1.0 - resolve: 1.22.8 + resolve: 1.22.9 babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): dependencies: @@ -16301,11 +17223,7 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206: - dependencies: - '@babel/types': 7.26.3 - - babel-plugin-react-compiler@19.0.0-beta-df7b47d-20241124: + babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215: dependencies: '@babel/types': 7.26.3 @@ -16321,6 +17239,10 @@ snapshots: - '@babel/core' - supports-color + babel-plugin-syntax-hermes-parser@0.21.1: + dependencies: + hermes-parser: 0.21.1 + babel-runtime@6.26.0: dependencies: core-js: 2.6.12 @@ -16331,8 +17253,12 @@ snapshots: bare-events@2.5.0: optional: true + base64-arraybuffer@1.0.2: {} + base64-js@1.5.1: {} + base64id@2.0.0: {} + base@0.11.2: dependencies: cache-base: 1.0.1 @@ -16410,6 +17336,17 @@ snapshots: type-fest: 0.8.1 widest-line: 3.1.0 + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -16448,12 +17385,12 @@ snapshots: dependencies: pako: 0.2.9 - browserslist@4.24.2: + browserslist@4.24.3: dependencies: - caniuse-lite: 1.0.30001687 - electron-to-chromium: 1.5.71 - node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.2) + caniuse-lite: 1.0.30001689 + electron-to-chromium: 1.5.74 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) buffer-alloc-unsafe@1.1.0: {} @@ -16534,9 +17471,14 @@ snapshots: dependencies: call-bind-apply-helpers: 1.0.1 es-define-property: 1.0.1 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 set-function-length: 1.2.2 + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.6 + callsite@1.0.0: {} callsites@3.1.0: {} @@ -16553,7 +17495,7 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001687: {} + caniuse-lite@1.0.30001689: {} castable-video@1.0.10: dependencies: @@ -16627,7 +17569,7 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.1: + chokidar@4.0.3: dependencies: readdirp: 4.0.2 @@ -16637,6 +17579,8 @@ snapshots: chownr@3.0.0: {} + ci-info@2.0.0: {} + ci-info@3.9.0: {} ci-info@4.1.0: {} @@ -16674,6 +17618,13 @@ snapshots: dependencies: restore-cursor: 5.1.0 + cli-high@0.4.3: + dependencies: + '@clack/prompts': 0.7.0 + sugar-high: 0.7.5 + xycolors: 0.1.2 + yargs: 17.7.2 + cli-spinners@2.6.1: {} cli-spinners@2.9.2: {} @@ -16724,21 +17675,19 @@ snapshots: codemirror-spell-checker@1.1.2: dependencies: - typo-js: 1.2.4 + typo-js: 1.2.5 codemirror@5.65.18: {} - codemirror@6.0.1(@lezer/common@1.2.3): + codemirror@6.0.1: dependencies: - '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3) + '@codemirror/autocomplete': 6.18.4 '@codemirror/commands': 6.7.1 - '@codemirror/language': 6.10.6 + '@codemirror/language': 6.10.7 '@codemirror/lint': 6.8.4 '@codemirror/search': 6.5.8 '@codemirror/state': 6.5.0 - '@codemirror/view': 6.35.3 - transitivePeerDependencies: - - '@lezer/common' + '@codemirror/view': 6.36.0 collection-visit@1.0.0: dependencies: @@ -16912,6 +17861,8 @@ snapshots: cookie@0.7.1: {} + cookie@0.7.2: {} + copy-descriptor@0.1.1: {} copy-to-clipboard@3.3.3: @@ -16920,7 +17871,7 @@ snapshots: core-js-compat@3.39.0: dependencies: - browserslist: 4.24.2 + browserslist: 4.24.3 core-js@2.6.12: {} @@ -16957,7 +17908,7 @@ snapshots: glob2base: 0.0.12 minimatch: 3.1.2 mkdirp: 0.5.6 - resolve: 1.22.8 + resolve: 1.22.9 safe-buffer: 5.2.1 shell-quote: 1.8.2 subarg: 1.0.0 @@ -16971,11 +17922,6 @@ snapshots: crc-32: 1.2.2 readable-stream: 4.5.2 - create-react-class@15.7.0: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - create-require@1.1.1: {} crelt@1.0.6: {} @@ -17048,19 +17994,19 @@ snapshots: dependencies: call-bind: 1.0.8 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.8 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.8 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 dataloader@2.2.3: {} @@ -17074,13 +18020,9 @@ snapshots: date-fns@3.6.0: {} - date-now@1.0.1: {} - dateformat@3.0.3: {} - debounce@1.0.0: - dependencies: - date-now: 1.0.1 + debounce@1.2.1: {} debug@2.6.9: dependencies: @@ -17090,6 +18032,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.3.7: + dependencies: + ms: 2.1.3 + debug@4.4.0(supports-color@5.5.0): dependencies: ms: 2.1.3 @@ -17218,7 +18164,7 @@ snapshots: deps-regex: 0.2.0 findup-sync: 5.0.0 ignore: 5.3.2 - is-core-module: 2.15.1 + is-core-module: 2.16.0 js-yaml: 3.14.1 json5: 2.2.3 lodash: 4.17.21 @@ -17227,7 +18173,7 @@ snapshots: please-upgrade-node: 3.2.0 readdirp: 3.6.0 require-package-name: 2.0.1 - resolve: 1.22.8 + resolve: 1.22.9 resolve-from: 5.0.0 semver: 7.6.3 yargs: 16.2.0 @@ -17261,6 +18207,8 @@ snapshots: diff@4.0.2: {} + diff@5.2.0: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -17300,6 +18248,10 @@ snapshots: dependencies: domelementtype: 2.3.0 + dompurify@3.2.3: + optionalDependencies: + '@types/trusted-types': 2.0.7 + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 @@ -17326,7 +18278,7 @@ snapshots: dotenv@8.6.0: {} - dunder-proto@1.0.0: + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.1 es-errors: 1.3.0 @@ -17364,11 +18316,15 @@ snapshots: ee-first@1.1.1: {} + effect@3.11.8: + dependencies: + fast-check: 3.23.2 + ejs@3.1.10: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.71: {} + electron-to-chromium@1.5.74: {} emoji-regex@10.4.0: {} @@ -17385,9 +18341,40 @@ snapshots: iconv-lite: 0.6.3 optional: true - end-of-stream@1.4.4: + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + engine.io-client@6.6.2: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + + engine.io@6.6.2: dependencies: - once: 1.4.0 + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 22.10.2 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate enhanced-resolve@5.17.1: dependencies: @@ -17414,12 +18401,13 @@ snapshots: dependencies: stackframe: 1.3.4 - es-abstract@1.23.5: + es-abstract@1.23.6: dependencies: array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 + call-bound: 1.0.3 data-view-buffer: 1.0.1 data-view-byte-length: 1.0.1 data-view-byte-offset: 1.0.0 @@ -17428,8 +18416,8 @@ snapshots: es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 es-to-primitive: 1.3.0 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.5 + function.prototype.name: 1.1.7 + get-intrinsic: 1.2.6 get-symbol-description: 1.0.2 globalthis: 1.0.4 gopd: 1.2.0 @@ -17437,30 +18425,31 @@ snapshots: has-proto: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-data-view: 1.0.1 + is-data-view: 1.0.2 is-negative-zero: 2.0.3 - is-regex: 1.2.0 + is-regex: 1.2.1 is-shared-array-buffer: 1.0.3 - is-string: 1.1.0 + is-string: 1.1.1 is-typed-array: 1.1.13 - is-weakref: 1.0.2 + is-weakref: 1.1.0 + math-intrinsics: 1.0.0 object-inspect: 1.13.3 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.3 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + safe-array-concat: 1.1.3 + safe-regex-test: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.3 typed-array-length: 1.0.7 - unbox-primitive: 1.0.2 + unbox-primitive: 1.1.0 which-typed-array: 1.1.16 es-define-property@1.0.1: {} @@ -17471,19 +18460,19 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - internal-slot: 1.0.7 - iterator.prototype: 1.1.3 - safe-array-concat: 1.1.2 + internal-slot: 1.1.0 + iterator.prototype: 1.1.4 + safe-array-concat: 1.1.3 es-module-lexer@1.5.4: {} @@ -17493,7 +18482,7 @@ snapshots: es-set-tostringtag@2.0.3: dependencies: - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -17504,8 +18493,8 @@ snapshots: es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.1.0 + is-date-object: 1.1.0 + is-symbol: 1.1.1 esbuild-register@3.6.0(esbuild@0.19.12): dependencies: @@ -17579,6 +18568,32 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -17634,6 +18649,8 @@ snapshots: escalade@3.2.0: {} + escape-goat@2.1.1: {} + escape-html@1.0.3: {} escape-string-regexp@1.0.5: {} @@ -17646,7 +18663,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-config-sanity@7.1.3(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1): + eslint-config-sanity@7.1.3(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1): dependencies: eslint: 8.57.1 eslint-plugin-simple-import-sort: 12.1.1(eslint@8.57.1) @@ -17665,8 +18682,8 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.15.1 - resolve: 1.22.8 + is-core-module: 2.16.0 + resolve: 1.22.9 transitivePeerDependencies: - supports-color @@ -17686,7 +18703,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -17697,7 +18714,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -17708,12 +18725,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-boundaries@4.2.2(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-boundaries@4.2.2(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): dependencies: chalk: 4.1.2 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) micromatch: 4.0.7 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -17731,22 +18748,22 @@ snapshots: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) hasown: 2.0.2 - is-core-module: 2.15.1 + is-core-module: 2.16.0 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.0 semver: 6.3.1 - string.prototype.trimend: 1.0.8 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) @@ -17759,7 +18776,7 @@ snapshots: dependencies: aria-query: 5.3.2 array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 axe-core: 4.10.2 axobject-query: 4.1.0 @@ -17771,7 +18788,7 @@ snapshots: language-tags: 1.0.9 minimatch: 3.1.2 object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 + safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2): @@ -17783,15 +18800,15 @@ snapshots: optionalDependencies: eslint-config-prettier: 9.1.0(eslint@8.57.1) - eslint-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206(eslint@8.57.1): + eslint-plugin-react-compiler@19.0.0-beta-201e55d-20241215(eslint@8.57.1): dependencies: '@babel/core': 7.26.0 '@babel/parser': 7.26.3 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.0) eslint: 8.57.1 hermes-parser: 0.25.1 - zod: 3.23.8 - zod-validation-error: 3.4.0(zod@3.23.8) + zod: 3.24.1 + zod-validation-error: 3.4.0(zod@3.24.1) transitivePeerDependencies: - supports-color @@ -17803,7 +18820,7 @@ snapshots: dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.0 @@ -17847,7 +18864,7 @@ snapshots: esquery: 1.6.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 - jsesc: 3.0.2 + jsesc: 3.1.0 pluralize: 8.0.0 read-pkg-up: 7.0.1 regexp-tree: 0.1.27 @@ -18029,6 +19046,8 @@ snapshots: dependencies: homedir-polyfill: 1.0.3 + expect-type@1.1.0: {} + exponential-backoff@3.1.1: {} express@4.21.2: @@ -18101,6 +19120,10 @@ snapshots: transitivePeerDependencies: - supports-color + fast-check@3.23.2: + dependencies: + pure-rand: 6.1.0 + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -18119,10 +19142,14 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-xml-parser@4.5.0: + fast-xml-parser@4.5.1: dependencies: strnum: 1.0.5 + faster-babel-types@0.1.0(@babel/types@7.26.0): + dependencies: + '@babel/types': 7.26.0 + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -18135,6 +19162,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fetch-retry@6.0.0: {} + + fflate@0.4.8: {} + figures@2.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -18311,30 +19342,30 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - framer-motion@11.13.5(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + framer-motion@11.15.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - motion-dom: 11.13.0 - motion-utils: 11.13.0 + motion-dom: 11.14.3 + motion-utils: 11.14.3 tslib: 2.8.1 optionalDependencies: '@emotion/is-prop-valid': 1.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - framer-motion@11.13.5(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1): + framer-motion@11.15.0(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@18.3.1))(react@18.3.1): dependencies: - motion-dom: 11.13.0 - motion-utils: 11.13.0 + motion-dom: 11.14.3 + motion-utils: 11.14.3 tslib: 2.8.1 optionalDependencies: '@emotion/is-prop-valid': 1.3.1 react: 18.3.1 react-dom: 19.0.0-rc-f994737d14-20240522(react@18.3.1) - framer-motion@11.13.5(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522): + framer-motion@11.15.0(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522): dependencies: - motion-dom: 11.13.0 - motion-utils: 11.13.0 + motion-dom: 11.14.3 + motion-utils: 11.14.3 tslib: 2.8.1 optionalDependencies: '@emotion/is-prop-valid': 1.3.1 @@ -18397,12 +19428,13 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.7: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -18431,16 +19463,18 @@ snapshots: get-east-asian-width@1.3.0: {} - get-intrinsic@1.2.5: + get-intrinsic@1.2.6: dependencies: call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.0 + dunder-proto: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.0.0 function-bind: 1.1.2 gopd: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.0.0 get-it@8.6.5(debug@4.4.0): dependencies: @@ -18499,7 +19533,7 @@ snapshots: dependencies: call-bind: 1.0.8 es-errors: 1.3.0 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 get-tsconfig@4.8.1: dependencies: @@ -18748,7 +19782,7 @@ snapshots: has-proto@1.2.0: dependencies: - dunder-proto: 1.0.0 + dunder-proto: 1.0.1 has-symbols@1.1.0: {} @@ -18777,6 +19811,8 @@ snapshots: is-number: 3.0.0 kind-of: 4.0.0 + has-yarn@2.1.0: {} + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -18793,8 +19829,14 @@ snapshots: he@1.2.0: {} + hermes-estree@0.21.1: {} + hermes-estree@0.25.1: {} + hermes-parser@0.21.1: + dependencies: + hermes-estree: 0.21.1 + hermes-parser@0.25.1: dependencies: hermes-estree: 0.25.1 @@ -18813,6 +19855,8 @@ snapshots: dependencies: parse-passwd: 1.0.0 + hono@4.6.14: {} + hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -18911,6 +19955,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-lazy@2.1.0: {} + import-lazy@4.0.0: {} import-local@3.1.0: @@ -18983,11 +20029,11 @@ snapshots: through: 2.3.8 wrap-ansi: 6.2.0 - internal-slot@1.0.7: + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 ip-address@9.0.5: dependencies: @@ -19007,10 +20053,11 @@ snapshots: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - is-array-buffer@3.0.4: + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 - get-intrinsic: 1.2.5 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 is-arrayish@0.2.1: {} @@ -19033,9 +20080,9 @@ snapshots: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.0: + is-boolean-object@1.2.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-buffer@1.1.6: {} @@ -19050,11 +20097,15 @@ snapshots: is-callable@1.2.7: {} + is-ci@2.0.0: + dependencies: + ci-info: 2.0.0 + is-ci@3.0.1: dependencies: ci-info: 3.9.0 - is-core-module@2.15.1: + is-core-module@2.16.0: dependencies: hasown: 2.0.2 @@ -19062,12 +20113,15 @@ snapshots: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + is-data-view@1.0.2: dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.6 is-typed-array: 1.1.13 - is-date-object@1.0.5: + is-date-object@1.1.0: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-decimal@1.0.4: {} @@ -19102,9 +20156,9 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.1.0: + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-fullwidth-code-point@2.0.0: {} @@ -19153,9 +20207,11 @@ snapshots: is-negative-zero@2.0.3: {} - is-number-object@1.1.0: + is-npm@5.0.0: {} + + is-number-object@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-number@2.1.0: @@ -19194,9 +20250,9 @@ snapshots: dependencies: '@types/estree': 1.0.6 - is-regex@1.2.0: + is-regex@1.2.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -19219,16 +20275,16 @@ snapshots: is-stream@2.0.1: {} - is-string@1.1.0: + is-string@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-symbol@1.1.0: + is-symbol@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 has-symbols: 1.1.0 - safe-regex-test: 1.0.3 + safe-regex-test: 1.1.0 is-tar@1.0.0: {} @@ -19250,14 +20306,14 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.0.2: + is-weakref@1.1.0: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 - is-weakset@2.0.3: + is-weakset@2.0.4: dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.2.5 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 is-windows@1.0.2: {} @@ -19265,6 +20321,8 @@ snapshots: dependencies: is-docker: 2.2.1 + is-yarn-global@0.3.0: {} + isarray@0.0.1: {} isarray@1.0.0: {} @@ -19283,6 +20341,23 @@ snapshots: isobject@3.0.1: {} + isomorphic-dompurify@2.19.0: + dependencies: + dompurify: 3.2.3 + jsdom: 25.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + isomorphic-fetch@3.0.0(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + whatwg-fetch: 3.6.20 + transitivePeerDependencies: + - encoding + istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: @@ -19304,10 +20379,11 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterator.prototype@1.1.3: + iterator.prototype@1.1.4: dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.5 + define-data-property: 1.1.4 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.6 has-symbols: 1.1.0 reflect.getprototypeof: 1.0.8 set-function-name: 2.0.2 @@ -19392,10 +20468,40 @@ 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.1 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.16 + parse5: 7.2.1 + 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.1.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsesc@0.5.0: {} jsesc@3.0.2: {} + jsesc@3.1.0: {} + json-2-csv@5.5.7: dependencies: deeks: 3.1.0 @@ -19456,7 +20562,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 - array.prototype.flat: 1.3.2 + array.prototype.flat: 1.3.3 object.assign: 4.1.5 object.values: 1.2.0 @@ -19491,6 +20597,8 @@ snapshots: kleur@3.0.3: {} + kleur@4.1.5: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -19501,13 +20609,13 @@ snapshots: dependencies: readable-stream: 2.3.8 - lerna@8.1.9(@swc-node/register@1.10.9(@swc/core@1.10.1)(typescript@5.7.2))(@swc/core@1.10.1)(babel-plugin-macros@3.1.0)(encoding@0.1.13): + lerna@8.1.9(@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2))(@swc/core@1.10.1(@swc/helpers@0.5.15))(babel-plugin-macros@3.1.0)(encoding@0.1.13): dependencies: - '@lerna/create': 8.1.9(@swc-node/register@1.10.9(@swc/core@1.10.1)(typescript@5.7.2))(@swc/core@1.10.1)(babel-plugin-macros@3.1.0)(encoding@0.1.13)(typescript@5.7.2) + '@lerna/create': 8.1.9(@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2))(@swc/core@1.10.1(@swc/helpers@0.5.15))(babel-plugin-macros@3.1.0)(encoding@0.1.13)(typescript@5.7.2) '@npmcli/arborist': 7.5.4 '@npmcli/package-json': 5.2.0 '@npmcli/run-script': 8.1.0 - '@nx/devkit': 20.2.1(nx@20.2.1(@swc-node/register@1.10.9(@swc/core@1.10.1)(typescript@5.7.2))(@swc/core@1.10.1)) + '@nx/devkit': 20.2.2(nx@20.2.2(@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2))(@swc/core@1.10.1(@swc/helpers@0.5.15))) '@octokit/plugin-enterprise-rest': 6.0.1 '@octokit/rest': 19.0.11(encoding@0.1.13) aproba: 2.0.0 @@ -19552,7 +20660,7 @@ snapshots: npm-package-arg: 11.0.2 npm-packlist: 8.0.2 npm-registry-fetch: 17.1.0 - nx: 20.2.1(@swc-node/register@1.10.9(@swc/core@1.10.1)(typescript@5.7.2))(@swc/core@1.10.1) + nx: 20.2.2(@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2))(@swc/core@1.10.1(@swc/helpers@0.5.15)) p-map: 4.0.0 p-map-series: 2.1.0 p-pipe: 3.1.0 @@ -19752,7 +20860,7 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.30.14: + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -19812,6 +20920,8 @@ snapshots: material-colors@1.2.6: {} + math-intrinsics@1.0.0: {} + math-random@1.0.4: {} md5-o-matic@0.1.1: {} @@ -20046,6 +21156,8 @@ snapshots: stream-each: 1.2.3 through2: 3.0.2 + mitt@3.0.1: {} + mixin-deep@1.3.2: dependencies: for-in: 1.0.2 @@ -20073,9 +21185,11 @@ snapshots: moment@2.30.1: {} - motion-dom@11.13.0: {} + motion-dom@11.14.3: {} + + motion-utils@11.14.3: {} - motion-utils@11.13.0: {} + mri@1.2.0: {} ms@2.0.0: {} @@ -20135,7 +21249,7 @@ snapshots: '@next/env': 14.2.20 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001687 + caniuse-lite: 1.0.30001689 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -20156,56 +21270,56 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.0.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.1.1(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 15.0.4 + '@next/env': 15.1.1 '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.13 + '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001687 + caniuse-lite: 1.0.30001689 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.6(@babel/core@7.26.0)(babel-plugin-macros@3.1.0)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.0.4 - '@next/swc-darwin-x64': 15.0.4 - '@next/swc-linux-arm64-gnu': 15.0.4 - '@next/swc-linux-arm64-musl': 15.0.4 - '@next/swc-linux-x64-gnu': 15.0.4 - '@next/swc-linux-x64-musl': 15.0.4 - '@next/swc-win32-arm64-msvc': 15.0.4 - '@next/swc-win32-x64-msvc': 15.0.4 + '@next/swc-darwin-arm64': 15.1.1 + '@next/swc-darwin-x64': 15.1.1 + '@next/swc-linux-arm64-gnu': 15.1.1 + '@next/swc-linux-arm64-musl': 15.1.1 + '@next/swc-linux-x64-gnu': 15.1.1 + '@next/swc-linux-x64-musl': 15.1.1 + '@next/swc-win32-arm64-msvc': 15.1.1 + '@next/swc-win32-x64-msvc': 15.1.1 '@playwright/test': 1.49.1 - babel-plugin-react-compiler: 19.0.0-beta-37ed2a7-20241206 + babel-plugin-react-compiler: 19.0.0-beta-201e55d-20241215 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros optional: true - next@15.0.4(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1): + next@15.1.1(@babel/core@7.26.0)(@playwright/test@1.49.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-201e55d-20241215)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1): dependencies: - '@next/env': 15.0.4 + '@next/env': 15.1.1 '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.13 + '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001687 + caniuse-lite: 1.0.30001689 postcss: 8.4.31 react: 19.0.0-rc.1 react-dom: 19.0.0-rc.1(react@19.0.0-rc.1) styled-jsx: 5.1.6(@babel/core@7.26.0)(babel-plugin-macros@3.1.0)(react@19.0.0-rc.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.0.4 - '@next/swc-darwin-x64': 15.0.4 - '@next/swc-linux-arm64-gnu': 15.0.4 - '@next/swc-linux-arm64-musl': 15.0.4 - '@next/swc-linux-x64-gnu': 15.0.4 - '@next/swc-linux-x64-musl': 15.0.4 - '@next/swc-win32-arm64-msvc': 15.0.4 - '@next/swc-win32-x64-msvc': 15.0.4 + '@next/swc-darwin-arm64': 15.1.1 + '@next/swc-darwin-x64': 15.1.1 + '@next/swc-linux-arm64-gnu': 15.1.1 + '@next/swc-linux-arm64-musl': 15.1.1 + '@next/swc-linux-x64-gnu': 15.1.1 + '@next/swc-linux-x64-musl': 15.1.1 + '@next/swc-win32-arm64-msvc': 15.1.1 + '@next/swc-win32-x64-msvc': 15.1.1 '@playwright/test': 1.49.1 - babel-plugin-react-compiler: 19.0.0-beta-37ed2a7-20241206 + babel-plugin-react-compiler: 19.0.0-beta-201e55d-20241215 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' @@ -20257,7 +21371,7 @@ snapshots: which: 2.0.2 optional: true - node-releases@2.0.18: {} + node-releases@2.0.19: {} node-test-github-reporter@1.2.0: dependencies: @@ -20275,14 +21389,14 @@ snapshots: normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 + resolve: 1.22.9 semver: 5.7.2 validate-npm-package-license: 3.0.4 normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.15.1 + is-core-module: 2.16.0 semver: 7.6.3 validate-npm-package-license: 3.0.4 @@ -20374,7 +21488,9 @@ snapshots: dependencies: boolbase: 1.0.0 - nx@20.2.1(@swc-node/register@1.10.9(@swc/core@1.10.1)(typescript@5.7.2))(@swc/core@1.10.1): + nwsapi@2.2.16: {} + + nx@20.2.2(@swc-node/register@1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2))(@swc/core@1.10.1(@swc/helpers@0.5.15)): dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -20410,18 +21526,18 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 20.2.1 - '@nx/nx-darwin-x64': 20.2.1 - '@nx/nx-freebsd-x64': 20.2.1 - '@nx/nx-linux-arm-gnueabihf': 20.2.1 - '@nx/nx-linux-arm64-gnu': 20.2.1 - '@nx/nx-linux-arm64-musl': 20.2.1 - '@nx/nx-linux-x64-gnu': 20.2.1 - '@nx/nx-linux-x64-musl': 20.2.1 - '@nx/nx-win32-arm64-msvc': 20.2.1 - '@nx/nx-win32-x64-msvc': 20.2.1 - '@swc-node/register': 1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.13))(@swc/types@0.1.17)(typescript@5.7.2) - '@swc/core': 1.10.1(@swc/helpers@0.5.13) + '@nx/nx-darwin-arm64': 20.2.2 + '@nx/nx-darwin-x64': 20.2.2 + '@nx/nx-freebsd-x64': 20.2.2 + '@nx/nx-linux-arm-gnueabihf': 20.2.2 + '@nx/nx-linux-arm64-gnu': 20.2.2 + '@nx/nx-linux-arm64-musl': 20.2.2 + '@nx/nx-linux-x64-gnu': 20.2.2 + '@nx/nx-linux-x64-musl': 20.2.2 + '@nx/nx-win32-arm64-msvc': 20.2.2 + '@nx/nx-win32-x64-msvc': 20.2.2 + '@swc-node/register': 1.10.9(@swc/core@1.10.1(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.7.2) + '@swc/core': 1.10.1(@swc/helpers@0.5.15) transitivePeerDependencies: - debug @@ -20458,14 +21574,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-object-atoms: 1.0.0 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 object.omit@2.0.1: dependencies: @@ -20488,6 +21604,8 @@ snapshots: dependencies: rxjs: 7.8.1 + ohash@1.1.4: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -20744,10 +21862,12 @@ snapshots: dependencies: '@babel/code-frame': 7.26.2 index-to-position: 0.1.2 - type-fest: 4.30.0 + type-fest: 4.30.2 parse-ms@2.1.0: {} + parse-ms@3.0.0: {} + parse-passwd@1.0.0: {} parse-path@7.0.0: @@ -20851,6 +21971,10 @@ snapshots: pirates@4.0.6: {} + piscina@4.8.0: + optionalDependencies: + '@napi-rs/nice': 1.0.1 + pkg-dir@3.0.0: dependencies: find-up: 3.0.0 @@ -20958,6 +22082,10 @@ snapshots: dependencies: parse-ms: 2.1.0 + pretty-ms@8.0.0: + dependencies: + parse-ms: 3.0.0 + prismjs@1.27.0: {} proc-log@4.2.0: {} @@ -21040,13 +22168,19 @@ snapshots: punycode@2.3.1: {} + pupa@2.1.1: + dependencies: + escape-goat: 2.1.1 + + pure-rand@6.1.0: {} + qs@6.13.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 qs@6.13.1: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 querystringify@2.2.0: {} @@ -21096,7 +22230,7 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 - react-clientside-effect@1.2.6(react@18.3.1): + react-clientside-effect@1.2.7(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 react: 18.3.1 @@ -21112,11 +22246,11 @@ snapshots: reactcss: 1.2.3(react@18.3.1) tinycolor2: 1.6.0 - react-compiler-runtime@19.0.0-beta-37ed2a7-20241206(react@18.3.1): + react-compiler-runtime@19.0.0-beta-201e55d-20241215(react@18.3.1): dependencies: react: 18.3.1 - react-compiler-runtime@19.0.0-beta-37ed2a7-20241206(react@19.0.0-rc-f994737d14-20240522): + react-compiler-runtime@19.0.0-beta-201e55d-20241215(react@19.0.0-rc-f994737d14-20240522): dependencies: react: 19.0.0-rc-f994737d14-20240522 @@ -21124,12 +22258,6 @@ snapshots: dependencies: react: 18.3.1 - react-copy-to-clipboard@5.1.0(react@18.3.1): - dependencies: - copy-to-clipboard: 3.3.3 - prop-types: 15.8.1 - react: 18.3.1 - react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -21167,19 +22295,19 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-focus-lock@2.13.2(@types/react@18.3.14)(react@18.3.1): + react-focus-lock@2.13.5(@types/react@18.3.17)(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 focus-lock: 1.3.5 prop-types: 15.8.1 react: 18.3.1 - react-clientside-effect: 1.2.6(react@18.3.1) - use-callback-ref: 1.3.2(@types/react@18.3.14)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.14)(react@18.3.1) + react-clientside-effect: 1.2.7(react@18.3.1) + use-callback-ref: 1.3.3(@types/react@18.3.17)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.17)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.14 + '@types/react': 18.3.17 - react-hook-form@7.54.0(react@18.3.1): + react-hook-form@7.54.1(react@18.3.1): dependencies: react: 18.3.1 @@ -21204,8 +22332,6 @@ snapshots: react-is@19.0.0-rc.1: {} - react-lifecycles-compat@3.0.4: {} - react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 @@ -21234,27 +22360,35 @@ snapshots: react-refresh@0.14.2: {} - react-rx@4.1.8(react@18.3.1)(rxjs@7.8.1): + react-rx@4.1.10(react@18.3.1)(rxjs@7.8.1): dependencies: observable-callback: 1.0.3(rxjs@7.8.1) react: 18.3.1 - react-compiler-runtime: 19.0.0-beta-37ed2a7-20241206(react@18.3.1) + react-compiler-runtime: 19.0.0-beta-201e55d-20241215(react@18.3.1) rxjs: 7.8.1 use-effect-event: 1.0.2(react@18.3.1) - react-select@5.8.3(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-scan@0.0.31: + dependencies: + '@clack/core': 0.3.5 + '@clack/prompts': 0.8.2 + kleur: 4.1.5 + mri: 1.2.0 + playwright: 1.49.1 + + react-select@5.9.0(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 '@emotion/cache': 11.14.0 - '@emotion/react': 11.14.0(@types/react@18.3.14)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.17)(react@18.3.1) '@floating-ui/dom': 1.6.12 - '@types/react-transition-group': 4.4.11 + '@types/react-transition-group': 4.4.12(@types/react@18.3.17) memoize-one: 6.0.0 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - use-isomorphic-layout-effect: 1.2.0(@types/react@18.3.14)(react@18.3.1) + use-isomorphic-layout-effect: 1.2.0(@types/react@18.3.17)(react@18.3.1) transitivePeerDependencies: - '@types/react' - supports-color @@ -21266,10 +22400,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-style-proptype@3.2.2: - dependencies: - prop-types: 15.8.1 - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 @@ -21308,7 +22438,7 @@ snapshots: dependencies: find-up-simple: 1.0.0 read-pkg: 9.0.1 - type-fest: 4.30.0 + type-fest: 4.30.2 read-pkg-up@3.0.0: dependencies: @@ -21339,7 +22469,7 @@ snapshots: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 parse-json: 8.1.0 - type-fest: 4.30.0 + type-fest: 4.30.2 unicorn-magic: 0.1.0 read@3.0.1: @@ -21426,12 +22556,12 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - dunder-proto: 1.0.0 - es-abstract: 1.23.5 + dunder-proto: 1.0.1 + es-abstract: 1.23.6 es-errors: 1.3.0 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 gopd: 1.2.0 - which-builtin-type: 1.2.0 + which-builtin-type: 1.2.1 refractor@3.6.0: dependencies: @@ -21539,15 +22669,15 @@ snapshots: resolve.exports@2.0.3: {} - resolve@1.22.8: + resolve@1.22.9: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -21604,7 +22734,7 @@ snapshots: rollup-plugin-esbuild@6.1.1(esbuild@0.24.0)(rollup@4.28.1): dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.28.1) debug: 4.4.0(supports-color@9.4.0) es-module-lexer: 1.5.4 esbuild: 0.24.0 @@ -21613,13 +22743,13 @@ snapshots: transitivePeerDependencies: - supports-color - rollup-plugin-sourcemaps@0.6.3(@types/node@22.10.1)(rollup@4.28.1): + rollup-plugin-sourcemaps@0.6.3(@types/node@22.10.2)(rollup@4.28.1): dependencies: '@rollup/pluginutils': 3.1.0(rollup@4.28.1) rollup: 4.28.1 source-map-resolve: 0.6.0 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 rollup@3.29.5: optionalDependencies: @@ -21650,10 +22780,36 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.28.1 fsevents: 2.3.3 + rrdom@0.1.7: + dependencies: + rrweb-snapshot: 2.0.0-alpha.4 + rrweb-cssom@0.6.0: {} rrweb-cssom@0.7.1: {} + rrweb-player@1.0.0-alpha.4: + dependencies: + '@tsconfig/svelte': 1.0.13 + rrweb: 2.0.0-alpha.4 + + rrweb-snapshot@2.0.0-alpha.18: + dependencies: + postcss: 8.4.49 + + rrweb-snapshot@2.0.0-alpha.4: {} + + rrweb@2.0.0-alpha.4: + dependencies: + '@rrweb/types': 2.0.0-alpha.16 + '@types/css-font-loading-module': 0.0.7 + '@xstate/fsm': 1.6.5 + base64-arraybuffer: 1.0.2 + fflate: 0.4.8 + mitt: 3.0.1 + rrdom: 0.1.7 + rrweb-snapshot: 2.0.0-alpha.4 + run-async@2.4.1: {} run-parallel@1.2.0: @@ -21681,10 +22837,11 @@ snapshots: dependencies: tslib: 2.8.1 - safe-array-concat@1.1.2: + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 - get-intrinsic: 1.2.5 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 has-symbols: 1.1.0 isarray: 2.0.5 @@ -21692,11 +22849,11 @@ snapshots: safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: + safe-regex-test@1.1.0: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 - is-regex: 1.2.0 + is-regex: 1.2.1 safe-regex@1.1.0: dependencies: @@ -21708,26 +22865,27 @@ snapshots: dependencies: '@sanity/diff-match-patch': 3.1.1 - sanity-plugin-hotspot-array@2.1.2(@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + sanity-plugin-hotspot-array@2.1.2(@emotion/is-prop-valid@1.3.1)(@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: '@sanity/asset-utils': 2.2.1 '@sanity/image-url': 1.1.0 - '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/incompatible-plugin': 1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@sanity/util': link:packages/@sanity/util '@types/lodash-es': 4.17.12 - framer-motion: 11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + framer-motion: 11.15.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) lodash-es: 4.17.21 react: 18.3.1 sanity: link:packages/sanity styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: + - '@emotion/is-prop-valid' - react-dom sanity-plugin-markdown@5.0.0(@emotion/is-prop-valid@1.3.1)(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: - '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/incompatible-plugin': 1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) easymde: 2.18.0 react: 18.3.1 react-simplemde-editor: 5.2.0(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -21738,12 +22896,12 @@ snapshots: - react-dom - react-is - sanity-plugin-media@2.3.2(@sanity/ui@2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + sanity-plugin-media@2.3.2(@sanity/ui@2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: - '@hookform/resolvers': 3.9.1(react-hook-form@7.54.0(react@18.3.1)) + '@hookform/resolvers': 3.9.1(react-hook-form@7.54.1(react@18.3.1)) '@reduxjs/toolkit': 1.9.7(react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) - '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/incompatible-plugin': 1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@sanity/uuid': 3.0.2 '@tanem/react-nprogress': 5.0.53(react-dom@18.3.1(react@18.3.1))(react@18.3.1) copy-to-clipboard: 3.3.3 @@ -21758,42 +22916,42 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-dropzone: 11.7.1(react@18.3.1) react-file-icon: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-hook-form: 7.54.0(react@18.3.1) + react-hook-form: 7.54.1(react@18.3.1) react-redux: 7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-select: 5.8.3(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-select: 5.9.0(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-virtuoso: 4.12.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) redux: 4.2.1 redux-observable: 2.0.0(redux@4.2.1) rxjs: 7.8.1 sanity: link:packages/sanity styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - zod: 3.23.8 + zod: 3.24.1 transitivePeerDependencies: - '@types/react' - react-native - supports-color - sanity-plugin-mux-input@2.4.0(@emotion/is-prop-valid@1.3.1)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + sanity-plugin-mux-input@2.4.0(@emotion/is-prop-valid@1.3.1)(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(sanity@packages+sanity)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: - '@mux/mux-player-react': 2.9.1(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mux/mux-player-react': 2.9.1(@types/react@18.3.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mux/upchunk': 3.4.0 - '@sanity/icons': 3.5.2(react@18.3.1) - '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@sanity/ui': 2.10.9(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/icons': 3.5.5(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.10.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react-is@19.0.0-rc.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@sanity/uuid': 3.0.2 iso-639-1: 3.1.3 jsonwebtoken-esm: 1.0.5 lodash: 4.17.21 react: 18.3.1 react-is: 19.0.0-rc.1 - react-rx: 4.1.8(react@18.3.1)(rxjs@7.8.1) + react-rx: 4.1.10(react@18.3.1)(rxjs@7.8.1) rxjs: 7.8.1 sanity: link:packages/sanity scroll-into-view-if-needed: 3.1.0 styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) suspend-react: 0.1.3(react@18.3.1) swr: 2.2.5(react@18.3.1) - type-fest: 4.30.0 + type-fest: 4.30.2 use-error-boundary: 2.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@emotion/is-prop-valid' @@ -21825,6 +22983,10 @@ snapshots: semver-compare@1.0.0: {} + semver-diff@3.1.1: + dependencies: + semver: 6.3.1 + semver@5.7.2: {} semver@6.1.1: {} @@ -21885,7 +23047,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -21957,12 +23119,33 @@ snapshots: shellwords@0.1.1: optional: true - side-channel@1.0.6: + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: dependencies: - call-bind: 1.0.8 es-errors: 1.3.0 - get-intrinsic: 1.2.5 object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 siginfo@2.0.0: {} @@ -22071,6 +23254,47 @@ snapshots: transitivePeerDependencies: - supports-color + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-client@4.8.1: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.6.2 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.8.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.2 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 @@ -22205,11 +23429,11 @@ snapshots: streamsearch@1.1.0: {} - streamx@2.21.0: + streamx@2.21.1: dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 - text-decoder: 1.2.2 + text-decoder: 1.2.3 optionalDependencies: bare-events: 2.5.0 @@ -22242,45 +23466,49 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-errors: 1.3.0 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.5 + get-intrinsic: 1.2.6 gopd: 1.2.0 has-symbols: 1.1.0 - internal-slot: 1.0.7 + internal-slot: 1.1.0 regexp.prototype.flags: 1.5.3 set-function-name: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 string.prototype.padend@3.1.6: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-object-atoms: 1.0.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.6 es-object-atoms: 1.0.0 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -22453,6 +23681,8 @@ snapshots: dependencies: minimist: 1.2.8 + sugar-high@0.7.5: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -22517,7 +23747,7 @@ snapshots: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.21.0 + streamx: 2.21.1 tar@6.2.1: dependencies: @@ -22565,7 +23795,7 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 - text-decoder@1.2.2: + text-decoder@1.2.3: dependencies: b4a: 1.6.7 @@ -22608,6 +23838,12 @@ snapshots: tinyspy@3.0.2: {} + tldts-core@6.1.68: {} + + tldts@6.1.68: + dependencies: + tldts-core: 6.1.68 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -22647,6 +23883,10 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 + tough-cookie@5.0.0: + dependencies: + tldts: 6.1.68 + tr46@0.0.3: {} tr46@5.0.0: @@ -22663,14 +23903,14 @@ snapshots: dependencies: typescript: 5.7.2 - ts-node@10.9.2(@swc/core@1.10.1)(@types/node@18.19.67)(typescript@5.7.2): + ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@18.19.68)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.67 + '@types/node': 18.19.68 acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -22681,7 +23921,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.10.1(@swc/helpers@0.5.13) + '@swc/core': 1.10.1(@swc/helpers@0.5.15) tsconfck@3.1.4(typescript@5.7.2): optionalDependencies: @@ -22765,7 +24005,7 @@ snapshots: type-fest@0.8.1: {} - type-fest@4.30.0: {} + type-fest@4.30.2: {} type-is@1.6.18: dependencies: @@ -22819,17 +24059,17 @@ snapshots: typescript@5.7.2: {} - typo-js@1.2.4: {} + typo-js@1.2.5: {} uglify-js@3.19.3: optional: true - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 has-bigints: 1.0.2 has-symbols: 1.1.0 - which-boxed-primitive: 1.1.0 + which-boxed-primitive: 1.1.1 unbzip2-stream@1.4.3: dependencies: @@ -22897,6 +24137,11 @@ snapshots: unpipe@1.0.0: {} + unplugin@1.16.0: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + unset-value@1.0.0: dependencies: has-value: 0.3.1 @@ -22904,12 +24149,33 @@ snapshots: upath@2.0.1: {} - update-browserslist-db@1.1.1(browserslist@4.24.2): + update-browserslist-db@1.1.1(browserslist@4.24.3): dependencies: - browserslist: 4.24.2 + browserslist: 4.24.3 escalade: 3.2.0 picocolors: 1.1.1 + update-notifier-cjs@5.1.6(encoding@0.1.13): + dependencies: + boxen: 5.1.2 + chalk: 4.1.2 + configstore: 5.0.1 + has-yarn: 2.1.0 + import-lazy: 2.1.0 + is-ci: 2.0.0 + is-installed-globally: 0.4.0 + is-npm: 5.0.0 + is-yarn-global: 0.3.0 + isomorphic-fetch: 3.0.0(encoding@0.1.13) + pupa: 2.1.1 + registry-auth-token: 5.0.3 + registry-url: 5.1.0 + semver: 7.6.3 + semver-diff: 3.1.1 + xdg-basedir: 4.0.0 + transitivePeerDependencies: + - encoding + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -22921,12 +24187,12 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-callback-ref@1.3.2(@types/react@18.3.14)(react@18.3.1): + use-callback-ref@1.3.3(@types/react@18.3.17)(react@18.3.1): dependencies: react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.14 + '@types/react': 18.3.17 use-device-pixel-ratio@1.1.2(react@18.3.1): dependencies: @@ -22950,19 +24216,19 @@ snapshots: dependencies: react: 18.3.1 - use-isomorphic-layout-effect@1.2.0(@types/react@18.3.14)(react@18.3.1): + use-isomorphic-layout-effect@1.2.0(@types/react@18.3.17)(react@18.3.1): dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.14 + '@types/react': 18.3.17 - use-sidecar@1.1.2(@types/react@18.3.14)(react@18.3.1): + use-sidecar@1.1.3(@types/react@18.3.17)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.14 + '@types/react': 18.3.17 use-sync-external-store@1.4.0(react@18.3.1): dependencies: @@ -23005,12 +24271,30 @@ snapshots: vary@1.1.2: {} - vite-node@2.1.1(@types/node@18.19.67)(terser@5.37.0): + vite-node@2.1.1(@types/node@22.10.2)(terser@5.37.0): + dependencies: + cac: 6.7.14 + debug: 4.4.0(supports-color@9.4.0) + pathe: 1.1.2 + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-node@2.1.8(@types/node@18.19.68)(terser@5.37.0): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@9.4.0) + es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.11(@types/node@18.19.67)(terser@5.37.0) + vite: 5.4.11(@types/node@18.19.68)(terser@5.37.0) transitivePeerDependencies: - '@types/node' - less @@ -23022,12 +24306,13 @@ snapshots: - supports-color - terser - vite-node@2.1.1(@types/node@22.10.1)(terser@5.37.0): + vite-node@2.1.8(@types/node@22.10.2)(terser@5.37.0): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@9.4.0) + es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - '@types/node' - less @@ -23039,62 +24324,62 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0)): + vite-tsconfig-paths@4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)): dependencies: debug: 4.4.0(supports-color@9.4.0) globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.7.2) optionalDependencies: - vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - supports-color - typescript - vite@4.5.5(@types/node@22.10.1)(terser@5.37.0): + vite@4.5.5(@types/node@22.10.2)(terser@5.37.0): dependencies: esbuild: 0.18.20 postcss: 8.4.49 rollup: 3.29.5 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 fsevents: 2.3.3 terser: 5.37.0 - vite@5.4.11(@types/node@18.19.67)(terser@5.37.0): + vite@5.4.11(@types/node@18.19.68)(terser@5.37.0): dependencies: esbuild: 0.21.5 postcss: 8.4.49 rollup: 4.28.1 optionalDependencies: - '@types/node': 18.19.67 + '@types/node': 18.19.68 fsevents: 2.3.3 terser: 5.37.0 - vite@5.4.11(@types/node@22.10.1)(terser@5.37.0): + vite@5.4.11(@types/node@22.10.2)(terser@5.37.0): dependencies: esbuild: 0.21.5 postcss: 8.4.49 rollup: 4.28.1 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 fsevents: 2.3.3 terser: 5.37.0 - vite@6.0.3(@types/node@22.10.1)(terser@5.37.0)(yaml@2.6.1): + vite@6.0.3(@types/node@22.10.2)(terser@5.37.0)(yaml@2.6.1): dependencies: esbuild: 0.24.0 postcss: 8.4.49 rollup: 4.28.1 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 fsevents: 2.3.3 terser: 5.37.0 yaml: 2.6.1 - vitest@2.1.1(@types/node@18.19.67)(jsdom@23.2.0)(terser@5.37.0): + vitest@2.1.1(@types/node@22.10.2)(jsdom@23.2.0)(terser@5.37.0): dependencies: '@vitest/expect': 2.1.1 - '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.11(@types/node@18.19.67)(terser@5.37.0)) + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.1 '@vitest/snapshot': 2.1.1 @@ -23102,18 +24387,18 @@ snapshots: '@vitest/utils': 2.1.1 chai: 5.1.2 debug: 4.4.0(supports-color@9.4.0) - magic-string: 0.30.14 + magic-string: 0.30.17 pathe: 1.1.2 std-env: 3.8.0 tinybench: 2.9.0 tinyexec: 0.3.1 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.11(@types/node@18.19.67)(terser@5.37.0) - vite-node: 2.1.1(@types/node@18.19.67)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + vite-node: 2.1.1(@types/node@22.10.2)(terser@5.37.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 18.19.67 + '@types/node': 22.10.2 jsdom: 23.2.0 transitivePeerDependencies: - less @@ -23126,29 +24411,66 @@ snapshots: - supports-color - terser - vitest@2.1.1(@types/node@22.10.1)(jsdom@23.2.0)(terser@5.37.0): + vitest@2.1.8(@types/node@18.19.68)(jsdom@25.0.1)(terser@5.37.0): dependencies: - '@vitest/expect': 2.1.1 - '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0)) + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) '@vitest/pretty-format': 2.1.8 - '@vitest/runner': 2.1.1 - '@vitest/snapshot': 2.1.1 - '@vitest/spy': 2.1.1 - '@vitest/utils': 2.1.1 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + debug: 4.4.0(supports-color@9.4.0) + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.11(@types/node@18.19.68)(terser@5.37.0) + vite-node: 2.1.8(@types/node@18.19.68)(terser@5.37.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 18.19.68 + jsdom: 25.0.1 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vitest@2.1.8(@types/node@22.10.2)(jsdom@23.2.0)(terser@5.37.0): + dependencies: + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 chai: 5.1.2 debug: 4.4.0(supports-color@9.4.0) - magic-string: 0.30.14 + expect-type: 1.1.0 + magic-string: 0.30.17 pathe: 1.1.2 std-env: 3.8.0 tinybench: 2.9.0 tinyexec: 0.3.1 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0) - vite-node: 2.1.1(@types/node@22.10.1)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + vite-node: 2.1.8(@types/node@22.10.2)(terser@5.37.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.2 jsdom: 23.2.0 transitivePeerDependencies: - less @@ -23161,6 +24483,42 @@ snapshots: - supports-color - terser + vitest@2.1.8(@types/node@22.10.2)(jsdom@25.0.1)(terser@5.37.0): + dependencies: + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + debug: 4.4.0(supports-color@9.4.0) + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) + vite-node: 2.1.8(@types/node@22.10.2)(terser@5.37.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.10.2 + 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: {} @@ -23179,10 +24537,14 @@ snapshots: webidl-conversions@7.0.0: {} + webpack-virtual-modules@0.6.2: {} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 + whatwg-fetch@3.6.20: {} + whatwg-mimetype@4.0.0: {} whatwg-url@14.1.0: @@ -23195,27 +24557,27 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.1.0: + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.0 - is-number-object: 1.1.0 - is-string: 1.1.0 - is-symbol: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 - which-builtin-type@1.2.0: + which-builtin-type@1.2.1: dependencies: - call-bind: 1.0.8 - function.prototype.name: 1.1.6 + call-bound: 1.0.3 + function.prototype.name: 1.1.7 has-tostringtag: 1.0.2 is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.1.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 is-generator-function: 1.0.10 - is-regex: 1.2.0 - is-weakref: 1.0.2 + is-regex: 1.2.1 + is-weakref: 1.1.0 isarray: 2.0.5 - which-boxed-primitive: 1.1.0 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 which-typed-array: 1.1.16 @@ -23224,7 +24586,7 @@ snapshots: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-weakset: 2.0.4 which-pm@2.2.0: dependencies: @@ -23325,6 +24687,8 @@ snapshots: type-fest: 0.4.1 write-json-file: 3.2.0 + ws@8.17.1: {} + ws@8.18.0: {} xdg-basedir@4.0.0: {} @@ -23340,12 +24704,16 @@ snapshots: xmlchars@2.2.0: {} + xmlhttprequest-ssl@2.1.2: {} + xregexp@2.0.0: {} xstate@5.19.0: {} xtend@4.0.2: {} + xycolors@0.1.2: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -23407,8 +24775,8 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.5.2 - zod-validation-error@3.4.0(zod@3.23.8): + zod-validation-error@3.4.0(zod@3.24.1): dependencies: - zod: 3.23.8 + zod: 3.24.1 - zod@3.23.8: {} + zod@3.24.1: {} diff --git a/scripts/reactCompilerBailouts.cjs b/scripts/reactCompilerBailouts.cjs new file mode 100644 index 00000000000..849d615bace --- /dev/null +++ b/scripts/reactCompilerBailouts.cjs @@ -0,0 +1,42 @@ +/* eslint-disable tsdoc/syntax */ +/** + * @typedef {Object} ESLintMessage + * @property {string} ruleId - The ID of the rule that generated the message + * @property {number} line - Line number where the issue occurred + * @property {number} column - Column number where the issue occurred + * @property {string} message - The message to display + * @property {1|2} severity - 1 for warning, 2 for error + */ + +/** + * @typedef {Object} ESLintResult + * @property {string} filePath - The file path relative to the root + * @property {ESLintMessage[]} messages - Array of message objects + * @property {number} errorCount - Number of errors + * @property {number} warningCount - Number of warnings + * @property {number} fixableErrorCount - Number of fixable errors + * @property {number} fixableWarningCount - Number of fixable warnings + */ + +const {writeFile} = require('node:fs/promises') +const path = require('node:path') + +/** + * ESLint custom formatter + * @param {ESLintResult[]} results - The results from ESLint's execution + * @returns {Promise<string>} Formatted output + */ +module.exports = async function (results) { + const projectRoot = path.resolve(__dirname, '..') + const outputPath = path.join(projectRoot, 'dev/test-studio/.react-compiler-bailout-report.json') + const paths = [] + for (const result of results) { + if (result.messages.length) { + const relativePath = path.relative(projectRoot, result.filePath) + paths.push(relativePath) + } + } + const formattedResults = JSON.stringify(paths, null, 2) + await writeFile(outputPath, formattedResults, 'utf8') + return `${paths.length} files have React compiler bailouts. See ${outputPath} for the full list.` +}