Skip to content

Commit

Permalink
chore: upgrade test studios to react 19, remove next studios (#8178)
Browse files Browse the repository at this point in the history
stipsan authored Jan 6, 2025
1 parent b57cb26 commit 9ed1ff7
Showing 48 changed files with 535 additions and 1,262 deletions.
1 change: 0 additions & 1 deletion .eslintignore.react-compiler
Original file line number Diff line number Diff line change
@@ -19,7 +19,6 @@ dev/test-studio/workshop/scopes.js
dev/design-studio/*
dev/embedded-studio/*
dev/starter-cra-studio/*
dev/starter-next-studio/*
dev/starter-studio/*
dev/strict-studio/*
dev/studio-e2e-studio/*
3 changes: 0 additions & 3 deletions dev/starter-next-studio/.depcheckignore.json

This file was deleted.

3 changes: 0 additions & 3 deletions dev/starter-next-studio/.eslintrc

This file was deleted.

4 changes: 0 additions & 4 deletions dev/starter-next-studio/.gitignore

This file was deleted.

13 changes: 0 additions & 13 deletions dev/starter-next-studio/components/Studio.tsx

This file was deleted.

5 changes: 0 additions & 5 deletions dev/starter-next-studio/next-env.d.ts

This file was deleted.

16 changes: 0 additions & 16 deletions dev/starter-next-studio/next.config.js

This file was deleted.

19 changes: 0 additions & 19 deletions dev/starter-next-studio/package.json

This file was deleted.

8 changes: 0 additions & 8 deletions dev/starter-next-studio/pages/_app.tsx

This file was deleted.

17 changes: 0 additions & 17 deletions dev/starter-next-studio/pages/index.tsx

This file was deleted.

11 changes: 0 additions & 11 deletions dev/starter-next-studio/pages/studio/[[...tool]].tsx

This file was deleted.

9 changes: 0 additions & 9 deletions dev/starter-next-studio/reset.css

This file was deleted.

8 changes: 0 additions & 8 deletions dev/starter-next-studio/sanity.cli.ts

This file was deleted.

25 changes: 0 additions & 25 deletions dev/starter-next-studio/sanity.config.ts

This file was deleted.

18 changes: 0 additions & 18 deletions dev/starter-next-studio/tsconfig.json

This file was deleted.

5 changes: 2 additions & 3 deletions dev/studio-e2e-testing/package.json
Original file line number Diff line number Diff line change
@@ -21,9 +21,8 @@
"@sanity/ui": "^2.11.0",
"@sanity/vision": "3.68.3",
"babel-plugin-react-compiler": "19.0.0-beta-63e3235-20250105",
"react": "^18.3.1",
"react-compiler-runtime": "19.0.0-beta-55955c9-20241229",
"react-dom": "^18.3.1",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"sanity": "workspace:*",
"sanity-plugin-markdown": "^5.0.0",
"sanity-plugin-media": "^2.3.1",
2 changes: 1 addition & 1 deletion dev/studio-e2e-testing/sanity.cli.ts
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ export default defineCliConfig({
projectId: process.env.SANITY_E2E_PROJECT_ID,
dataset: process.env.SANITY_E2E_DATASET,
},
reactCompiler: {target: '18'},
reactCompiler: {target: '19'},
vite: {
define: {
'process.env.SANITY_E2E_PROJECT_ID': JSON.stringify(process.env.SANITY_E2E_PROJECT_ID),
13 changes: 0 additions & 13 deletions dev/test-next-studio/.depcheckignore.json

This file was deleted.

3 changes: 0 additions & 3 deletions dev/test-next-studio/.depcheckrc.json

This file was deleted.

2 changes: 0 additions & 2 deletions dev/test-next-studio/.gitignore

This file was deleted.

107 changes: 0 additions & 107 deletions dev/test-next-studio/app/GlobalStyle.tsx

This file was deleted.

12 changes: 0 additions & 12 deletions dev/test-next-studio/app/PreloadResources.tsx

This file was deleted.

8 changes: 0 additions & 8 deletions dev/test-next-studio/app/[[...tool]]/Studio.tsx

This file was deleted.

9 changes: 0 additions & 9 deletions dev/test-next-studio/app/[[...tool]]/page.tsx

This file was deleted.

17 changes: 0 additions & 17 deletions dev/test-next-studio/app/layout.tsx

This file was deleted.

33 changes: 0 additions & 33 deletions dev/test-next-studio/app/registry.tsx

This file was deleted.

5 changes: 0 additions & 5 deletions dev/test-next-studio/next-env.d.ts

This file was deleted.

158 changes: 0 additions & 158 deletions dev/test-next-studio/next.config.mjs

This file was deleted.

25 changes: 0 additions & 25 deletions dev/test-next-studio/package.json

This file was deleted.

24 changes: 0 additions & 24 deletions dev/test-next-studio/tsconfig.json

This file was deleted.

16 changes: 0 additions & 16 deletions dev/test-next-studio/turbo.json

This file was deleted.

5 changes: 2 additions & 3 deletions dev/test-studio/package.json
Original file line number Diff line number Diff line change
@@ -51,9 +51,8 @@
"history": "^5.3.0",
"lodash": "^4.17.21",
"qs": "^6.10.2",
"react": "^18.3.1",
"react-compiler-runtime": "19.0.0-beta-55955c9-20241229",
"react-dom": "^18.3.1",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-refractor": "^2.1.6",
"refractor": "^3.6.0",
"rxjs": "^7.8.0",
52 changes: 29 additions & 23 deletions dev/test-studio/sanity.cli.ts
Original file line number Diff line number Diff line change
@@ -4,9 +4,10 @@ import {defineCliConfig} from 'sanity/cli'
import {type UserConfig} from 'vite'

const millionLintEnabled = process.env.REACT_MILLION_LINT === 'true'
const millionLintEverything = process.env.REACT_MILLION_LINT_EVERYTHING === 'true'
const millionInclude: string[] = []
try {
if (millionLintEnabled) {
if (millionLintEnabled && !millionLintEverything) {
for (const filePath of require('./.react-compiler-bailout-report.json')) {
millionInclude.push(`**/${filePath}`)
}
@@ -27,23 +28,24 @@ 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: 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'},
reactCompiler:
millionLintEnabled && !millionLintEverything
? {
target: '19',
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: '19'},
vite(viteConfig: UserConfig): UserConfig {
const reactProductionProfiling = process.env.REACT_PRODUCTION_PROFILING === 'true'

@@ -55,11 +57,15 @@ export default defineCliConfig({
* 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,
},
}),
require('@million/lint').vite(
millionLintEverything
? {}
: {
filter: {
include: millionInclude,
},
},
),
...(viteConfig.plugins || []),
]
: viteConfig.plugins,
2 changes: 1 addition & 1 deletion dev/test-studio/turbo.json
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
"extends": ["//"],
"tasks": {
"build": {
"env": ["REACT_PRODUCTION_PROFILING", "REACT_MILLION_LINT"],
"env": ["REACT_PRODUCTION_PROFILING", "REACT_MILLION_LINT", "REACT_MILLION_LINT_EVERYTHING"],
"outputs": [".sanity/**", "dist/**", "workshop/scopes.js"]
},
"start": {
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -43,9 +43,8 @@
"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:million-lint-everything": "REACT_MILLION_LINT=true REACT_MILLION_LINT_EVERYTHING=true pnpm --filter sanity-test-studio dev",
"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",
"docs:report:cleanup": "node -r dotenv-flow/config -r esbuild-register scripts/doc-report/docReportCleanup",
"docs:report:create": "node -r dotenv-flow/config -r esbuild-register scripts/doc-report/docReportCreate",
Original file line number Diff line number Diff line change
@@ -2,8 +2,8 @@
"name": "prj-with-react-19",
"private": true,
"dependencies": {
"react": "19.0.0-rc-f994737d14-20240522",
"react-dom": "19.0.0-rc-f994737d14-20240522",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"styled-components": "^6.1.0"
}
}
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@ import {sortBy} from 'lodash'
import {useCallback, useMemo, useState} from 'react'

import {type Reported} from '../../components/react-track-elements'
import {ScrollMonitor} from '../../components/scroll'
import {useOnScroll} from '../../components/scroll'
import {DEBUG_LAYER_BOUNDS} from '../constants'
import {findMostSpecificTarget} from '../helpers/findMostSpecificTarget'
import {getOffsetsTo} from '../helpers/getOffsetsTo'
@@ -121,27 +121,26 @@ export function ConnectorsOverlay(props: ConnectorsOverlayProps) {
}, [byId, allReportedValues, hovered, rootElement])

useResizeObserver(rootElement, handleScrollOrResize)
useOnScroll(handleScrollOrResize)

return (
<ScrollMonitor onScroll={handleScrollOrResize}>
<SvgWrapper style={{zIndex: visibleConnectors[0] && visibleConnectors[0].field.zIndex}}>
{visibleConnectors.map(({field, change}) => {
if (!change) {
return null
}

return (
<ConnectorGroup
field={field}
change={change}
key={field.id}
onSetFocus={onSetFocus}
setHovered={setHovered}
/>
)
})}
</SvgWrapper>
</ScrollMonitor>
<SvgWrapper style={{zIndex: visibleConnectors[0] && visibleConnectors[0].field.zIndex}}>
{visibleConnectors.map(({field, change}) => {
if (!change) {
return null
}

return (
<ConnectorGroup
field={field}
change={change}
key={field.id}
onSetFocus={onSetFocus}
setHovered={setHovered}
/>
)
})}
</SvgWrapper>
)
}

1 change: 0 additions & 1 deletion packages/sanity/src/core/components/scroll/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export * from './hooks'
export * from './scrollContainer'
export * from './scrollMonitor'
export * from './types'
29 changes: 16 additions & 13 deletions packages/sanity/src/core/components/scroll/scrollContainer.tsx
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ import {
type ForwardedRef,
forwardRef,
type HTMLProps,
memo,
useContext,
useEffect,
useImperativeHandle,
@@ -19,19 +20,9 @@ export interface ScrollContainerProps<T extends ElementType>
onScroll?: (event: Event) => () => void
}

/**
* 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
* NOTE: this is used by different studio utilities to track positions of elements on screen
* NOTE: It will call any given `onScroll` callback with a Native DOM Event, and not a React Synthetic event
* NOTE: It will not make sure the element is actually scrollable, this still needs to be done with css as usual
*
* @internal
*/
export const ScrollContainer = forwardRef(function ScrollContainer<T extends ElementType = 'div'>(
props: ScrollContainerProps<T>,
forwardedRef: ForwardedRef<HTMLDivElement>,
) {
const ScrollContainerComponent = forwardRef(function ScrollContainerComponent<
T extends ElementType = 'div',
>(props: ScrollContainerProps<T>, forwardedRef: ForwardedRef<HTMLDivElement>) {
const {as: As = 'div', onScroll, ...rest} = props
const ref = useRef<HTMLDivElement | null>(null)

@@ -79,3 +70,15 @@ export const ScrollContainer = forwardRef(function ScrollContainer<T extends Ele
</ScrollContext.Provider>
)
})

/**
* 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
* NOTE: this is used by different studio utilities to track positions of elements on screen
* NOTE: It will call any given `onScroll` callback with a Native DOM Event, and not a React Synthetic event
* NOTE: It will not make sure the element is actually scrollable, this still needs to be done with css as usual
*
* @internal
*/
export const ScrollContainer = memo(ScrollContainerComponent)
ScrollContainer.displayName = 'Memo(Forwardref(ScrollContainer))'
16 changes: 0 additions & 16 deletions packages/sanity/src/core/components/scroll/scrollMonitor.tsx

This file was deleted.

Original file line number Diff line number Diff line change
@@ -169,6 +169,11 @@ export function DocumentLayout() {
[onPathOpen, onFocus],
)

const portalElements = useMemo(
() => ({[DOCUMENT_PANEL_PORTAL_ELEMENT]: documentPanelPortalElement}),
[documentPanelPortalElement],
)

if (!schemaType) {
return (
<DocumentLayoutError
@@ -250,9 +255,7 @@ export function DocumentLayout() {

{/* These providers are added because we want the dialogs in `DocumentStatusBar` to be scoped to the document pane. */}
{/* The portal element comes from `DocumentPanel`. */}
<PortalProvider
__unstable_elements={{[DOCUMENT_PANEL_PORTAL_ELEMENT]: documentPanelPortalElement}}
>
<PortalProvider __unstable_elements={portalElements}>
<DialogProvider position={DIALOG_PROVIDER_POSITION} zOffset={zOffsets.portal}>
{StartInCreateBanner && (
<ShowWhenPaneOpen>
Original file line number Diff line number Diff line change
@@ -121,87 +121,111 @@ export const DocumentPanelHeader = memo(
[contextMenuNodes, referenceElement],
)

const title = useMemo(() => <DocumentHeaderTitle />, [])
const tabs = useMemo(() => showTabs && <DocumentHeaderTabs />, [showTabs])
const backButton = useMemo(
() =>
showBackButton && (
<Button
as={BackLink}
data-as="a"
icon={ArrowLeftIcon}
mode="bleed"
tooltipProps={{content: t('pane-header.back-button.text')}}
/>
),
[BackLink, showBackButton, t],
)
const renderedActions = useMemo(
() => (
<Flex align="center" gap={1}>
{unstable_languageFilter.length > 0 && (
<>
{unstable_languageFilter.map((LanguageFilterComponent, idx) => {
return (
<LanguageFilterComponent
// eslint-disable-next-line react/no-array-index-key
key={`language-filter-${idx}`}
schemaType={schemaType}
/>
)
})}
</>
)}

{menuButtonNodes.map((item) => (
<PaneHeaderActionButton key={item.key} node={item} />
))}
{editState && (
<RenderActionCollectionState
actions={actions}
actionProps={editState}
group="paneActions"
>
{renderPaneActions}
</RenderActionCollectionState>
)}

{showSplitPaneButton && (
<Button
aria-label={t('buttons.split-pane-button.aria-label')}
icon={SplitVerticalIcon}
key="split-pane-button"
mode="bleed"
onClick={onPaneSplit}
tooltipProps={{content: t('buttons.split-pane-button.tooltip')}}
/>
)}

{showSplitPaneCloseButton && (
<Button
icon={CloseIcon}
key="close-view-button"
mode="bleed"
onClick={onPaneClose}
tooltipProps={{content: t('buttons.split-pane-close-button.title')}}
/>
)}

{showPaneGroupCloseButton && (
<Button
icon={CloseIcon}
key="close-view-button"
mode="bleed"
tooltipProps={{content: t('buttons.split-pane-close-group-button.title')}}
as={BackLink}
/>
)}
</Flex>
),
[
BackLink,
actions,
editState,
menuButtonNodes,
onPaneClose,
onPaneSplit,
renderPaneActions,
schemaType,
showPaneGroupCloseButton,
showSplitPaneButton,
showSplitPaneCloseButton,
t,
unstable_languageFilter,
],
)

return (
<TooltipDelayGroupProvider>
<PaneHeader
border
ref={ref}
loading={connectionState === 'connecting' && !editState?.draft && !editState?.published}
title={<DocumentHeaderTitle />}
tabs={showTabs && <DocumentHeaderTabs />}
title={title}
tabs={tabs}
tabIndex={tabIndex}
backButton={
showBackButton && (
<Button
as={BackLink}
data-as="a"
icon={ArrowLeftIcon}
mode="bleed"
tooltipProps={{content: t('pane-header.back-button.text')}}
/>
)
}
actions={
<Flex align="center" gap={1}>
{unstable_languageFilter.length > 0 && (
<>
{unstable_languageFilter.map((LanguageFilterComponent, idx) => {
return (
<LanguageFilterComponent
// eslint-disable-next-line react/no-array-index-key
key={`language-filter-${idx}`}
schemaType={schemaType}
/>
)
})}
</>
)}

{menuButtonNodes.map((item) => (
<PaneHeaderActionButton key={item.key} node={item} />
))}
{editState && (
<RenderActionCollectionState
actions={actions}
actionProps={editState}
group="paneActions"
>
{renderPaneActions}
</RenderActionCollectionState>
)}

{showSplitPaneButton && (
<Button
aria-label={t('buttons.split-pane-button.aria-label')}
icon={SplitVerticalIcon}
key="split-pane-button"
mode="bleed"
onClick={onPaneSplit}
tooltipProps={{content: t('buttons.split-pane-button.tooltip')}}
/>
)}

{showSplitPaneCloseButton && (
<Button
icon={CloseIcon}
key="close-view-button"
mode="bleed"
onClick={onPaneClose}
tooltipProps={{content: t('buttons.split-pane-close-button.title')}}
/>
)}

{showPaneGroupCloseButton && (
<Button
icon={CloseIcon}
key="close-view-button"
mode="bleed"
tooltipProps={{content: t('buttons.split-pane-close-group-button.title')}}
as={BackLink}
/>
)}
</Flex>
}
backButton={backButton}
actions={renderedActions}
/>
</TooltipDelayGroupProvider>
)
2 changes: 1 addition & 1 deletion perf/.depcheckrc.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"ignores": ["@repo/tsconfig", "sanity", "babel-plugin-react-compiler", "react-compiler-runtime"]
"ignores": ["@repo/tsconfig", "sanity", "babel-plugin-react-compiler"]
}
3 changes: 1 addition & 2 deletions perf/efps/.depcheckrc.json
Original file line number Diff line number Diff line change
@@ -3,7 +3,6 @@
"@swc-node/register",
"@types/react",
"@types/react-dom",
"babel-plugin-react-compiler",
"react-compiler-runtime"
"babel-plugin-react-compiler"
]
}
5 changes: 2 additions & 3 deletions perf/efps/package.json
Original file line number Diff line number Diff line change
@@ -30,9 +30,8 @@
"globby": "^11.1.0",
"ora": "^8.0.1",
"playwright": "^1.46.1",
"react": "^18.3.1",
"react-compiler-runtime": "19.0.0-beta-55955c9-20241229",
"react-dom": "^18.3.1",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"rollup-plugin-sourcemaps": "^0.6.3",
"sanity": "workspace:*",
"serve-handler": "^6.1.5",
5 changes: 2 additions & 3 deletions perf/studio/package.json
Original file line number Diff line number Diff line change
@@ -15,9 +15,8 @@
},
"dependencies": {
"babel-plugin-react-compiler": "19.0.0-beta-63e3235-20250105",
"react": "^18.3.1",
"react-compiler-runtime": "19.0.0-beta-55955c9-20241229",
"react-dom": "^18.3.1",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"sanity": "workspace:*",
"styled-components": "^6.1.0"
}
2 changes: 1 addition & 1 deletion perf/studio/sanity.cli.ts
Original file line number Diff line number Diff line change
@@ -7,5 +7,5 @@ export default defineCliConfig({
projectId: STUDIO_PROJECT_ID,
dataset: STUDIO_DATASET,
},
reactCompiler: {target: '18'},
reactCompiler: {target: '19'},
})
849 changes: 351 additions & 498 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

0 comments on commit 9ed1ff7

Please sign in to comment.