diff --git a/.changeset/solid-hook-naming-react-compiler.md b/.changeset/solid-hook-naming-react-compiler.md new file mode 100644 index 00000000..0785e0d3 --- /dev/null +++ b/.changeset/solid-hook-naming-react-compiler.md @@ -0,0 +1,13 @@ +--- +'@tanstack/devtools-ui': minor +'@tanstack/devtools': patch +'@tanstack/devtools-a11y': patch +--- + +fix: rename Solid `use*` primitives to `create*` so React Compiler doesn't transform them + +The devtools packages are written in Solid but used React-style naming (`useStyles`, `useTheme`, `useDevtoolsState`, …) for their custom primitives. When an app enables React Compiler, the compiler matches the `use*` naming convention and transforms/optimizes this Solid code as if it were React, breaking the panel (it is Solid JSX, not React). + +All custom Solid primitives in `@tanstack/devtools`, `@tanstack/devtools-ui`, and `@tanstack/devtools-a11y` are renamed from `use*` to `create*`, and Solid's own `useContext` / `@solid-primitives` `useKeyDownList` are imported under non-`use` aliases (`getContext`, `getKeyDownList`). + +Breaking for `@tanstack/devtools-ui`: the exported `useTheme` is renamed to `createTheme`. diff --git a/packages/devtools-a11y/src/core/components/IssueCard.tsx b/packages/devtools-a11y/src/core/components/IssueCard.tsx index 8fb8db85..4420616d 100644 --- a/packages/devtools-a11y/src/core/components/IssueCard.tsx +++ b/packages/devtools-a11y/src/core/components/IssueCard.tsx @@ -2,7 +2,7 @@ import { For, Show } from 'solid-js' import { Button } from '@tanstack/devtools-ui' -import { useStyles } from '../styles/styles' +import { createStyles } from '../styles/styles' // types import type { A11yIssue, SeverityThreshold } from '../types/types' @@ -17,7 +17,7 @@ interface A11yIssueCardProps { export function A11yIssueCard(props: A11yIssueCardProps) { const selector = () => props.issue.nodes[0]?.selector || 'unknown' - const styles = useStyles() + const styles = createStyles() return (
{ diff --git a/packages/devtools-a11y/src/core/components/Settings.tsx b/packages/devtools-a11y/src/core/components/Settings.tsx index 71a3bd43..943d7c6e 100644 --- a/packages/devtools-a11y/src/core/components/Settings.tsx +++ b/packages/devtools-a11y/src/core/components/Settings.tsx @@ -3,8 +3,8 @@ import { For, Show, createMemo, createSignal } from 'solid-js' import { Button, Input, Select } from '@tanstack/devtools-ui' import { getAvailableRules } from '../utils/ally-audit.utils' -import { useAllyContext } from '../contexts/allyContext' -import { CATEGORIES, CATEGORY_LABELS, useStyles } from '../styles/styles' +import { createAllyContext } from '../contexts/allyContext' +import { CATEGORIES, CATEGORY_LABELS, createStyles } from '../styles/styles' // types import type { @@ -18,8 +18,8 @@ interface A11ySettingsOverlayProps { } export function A11ySettingsOverlay(props: A11ySettingsOverlayProps) { - const { config, setConfig } = useAllyContext() - const styles = useStyles() + const { config, setConfig } = createAllyContext() + const styles = createStyles() const disabledRulesSet = createMemo(() => new Set(config.disabledRules)) const availableRules = createMemo(() => getAvailableRules()) diff --git a/packages/devtools-a11y/src/core/components/Shell.tsx b/packages/devtools-a11y/src/core/components/Shell.tsx index d049ae71..f5ed7970 100644 --- a/packages/devtools-a11y/src/core/components/Shell.tsx +++ b/packages/devtools-a11y/src/core/components/Shell.tsx @@ -2,18 +2,18 @@ import { Match, Show, Switch, createMemo, createSignal } from 'solid-js' import { Button, Header, MainPanel } from '@tanstack/devtools-ui' -import { useAllyContext } from '../contexts/allyContext' +import { createAllyContext } from '../contexts/allyContext' import { RULE_SET_LABELS, SEVERITY_LABELS } from '../utils/ui.utils' -import { useStyles } from '../styles/styles' +import { createStyles } from '../styles/styles' import { A11yIssueList } from './IssueList' import { A11ySettingsOverlay } from './Settings' export function Shell() { - const styles = useStyles() + const styles = createStyles() // ally context const { filteredIssues, allyResult, config, setConfig, triggerAllyScan } = - useAllyContext() + createAllyContext() // ui state const selectedIssueSignal = createSignal('') diff --git a/packages/devtools-a11y/src/core/contexts/allyContext.tsx b/packages/devtools-a11y/src/core/contexts/allyContext.tsx index c6abc8c9..920eae9c 100644 --- a/packages/devtools-a11y/src/core/contexts/allyContext.tsx +++ b/packages/devtools-a11y/src/core/contexts/allyContext.tsx @@ -5,7 +5,7 @@ import { createEffect, createMemo, createSignal, - useContext, + useContext as getContext, } from 'solid-js' import { createStore } from 'solid-js/store' import { filterIssuesAboveThreshold, runAudit } from '../utils/ally-audit.utils' @@ -24,7 +24,7 @@ import type { ParentComponent } from 'solid-js' // context state // -function useAllyValue() { +function createAllyValue() { const [config, setConfig] = createStore>(mergeConfig()) @@ -89,7 +89,7 @@ function useAllyValue() { } } -type ContextType = ReturnType +type ContextType = ReturnType // // context @@ -100,18 +100,18 @@ const AllyContext = createContext(null) type AllyProviderProps = {} export const AllyProvider: ParentComponent = (props) => { - const value = useAllyValue() + const value = createAllyValue() return ( {props.children} ) } -export function useAllyContext() { - const context = useContext(AllyContext) +export function createAllyContext() { + const context = getContext(AllyContext) if (context === null) { - throw new Error('useAllyContext must be used within an AllyProvider') + throw new Error('createAllyContext must be used within an AllyProvider') } return context diff --git a/packages/devtools-a11y/src/core/styles/styles.ts b/packages/devtools-a11y/src/core/styles/styles.ts index 64b40104..d7d41e46 100644 --- a/packages/devtools-a11y/src/core/styles/styles.ts +++ b/packages/devtools-a11y/src/core/styles/styles.ts @@ -1,5 +1,5 @@ import * as goober from 'goober' -import { useTheme } from '@tanstack/devtools-ui' +import { createTheme } from '@tanstack/devtools-ui' import { createMemo } from 'solid-js' import type { TanStackDevtoolsTheme } from '@tanstack/devtools-ui' @@ -548,8 +548,8 @@ function createA11yPanelStyles(theme: TanStackDevtoolsTheme) { } } -export function useStyles() { - const { theme } = useTheme() +export function createStyles() { + const { theme } = createTheme() const styles = createMemo(() => createA11yPanelStyles(theme())) return styles diff --git a/packages/devtools-ui/src/components/button.tsx b/packages/devtools-ui/src/components/button.tsx index b96b453c..f292cdc6 100644 --- a/packages/devtools-ui/src/components/button.tsx +++ b/packages/devtools-ui/src/components/button.tsx @@ -1,6 +1,6 @@ import { createMemo } from 'solid-js' import clsx from 'clsx' -import { useStyles } from '../styles/use-styles' +import { createStyles } from '../styles/use-styles' // types import type { JSX } from 'solid-js' @@ -20,7 +20,7 @@ type ButtonProps = JSX.ButtonHTMLAttributes & { className?: string } export function Button(props: ButtonProps) { - const styles = useStyles() + const styles = createStyles() const classes = createMemo(() => { const variant = props.variant || 'primary' diff --git a/packages/devtools-ui/src/components/checkbox.tsx b/packages/devtools-ui/src/components/checkbox.tsx index de16270e..d87a4efc 100644 --- a/packages/devtools-ui/src/components/checkbox.tsx +++ b/packages/devtools-ui/src/components/checkbox.tsx @@ -1,5 +1,5 @@ import { createSignal } from 'solid-js' -import { useStyles } from '../styles/use-styles' +import { createStyles } from '../styles/use-styles' interface CheckboxProps { label?: string @@ -9,7 +9,7 @@ interface CheckboxProps { } export function Checkbox(props: CheckboxProps) { - const styles = useStyles() + const styles = createStyles() const [isChecked, setIsChecked] = createSignal(props.checked || false) const handleChange = (e: Event) => { diff --git a/packages/devtools-ui/src/components/header.tsx b/packages/devtools-ui/src/components/header.tsx index 29b23aa0..5f52f0c7 100644 --- a/packages/devtools-ui/src/components/header.tsx +++ b/packages/devtools-ui/src/components/header.tsx @@ -1,5 +1,5 @@ import clsx from 'clsx' -import { useStyles } from '../styles/use-styles' +import { createStyles } from '../styles/use-styles' import type { JSX } from 'solid-js/jsx-runtime' export function Header({ @@ -7,7 +7,7 @@ export function Header({ class: className, ...rest }: JSX.IntrinsicElements['header']) { - const styles = useStyles() + const styles = createStyles() return (
}) { - const styles = useStyles() + const styles = createStyles() return (