Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Restrict aria roles by element type #4607

Open
wants to merge 34 commits into
base: v11-2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
bc93185
test: Add simple test for button roles
rschristian Dec 13, 2024
0c0b5fa
refactor: Make roles signalish
rschristian Dec 13, 2024
8279ed6
test: Add tests for `never` roles
rschristian Dec 15, 2024
12b5a02
refactor: Remove half-implemented select roles
rschristian Dec 16, 2024
40c1d25
fix: Ensure attributes w/ `never` roles can be constructed
rschristian Dec 16, 2024
78c7349
refactor: Restrict more complex aria roles
rschristian Dec 17, 2024
6d0a28c
refactor: Remove unused input type interface, fix select multiple type
rschristian Dec 17, 2024
90de7f0
fix: Ensure partials extend EventTarget
rschristian Dec 17, 2024
9a98461
revert: Bring back input type attribute
rschristian Dec 17, 2024
eef3c0d
test: Fix test typo
rschristian Dec 17, 2024
b29de5e
Remove replaceNode
JoviDeCroock Nov 10, 2024
784ac34
Leverage Object.assign
JoviDeCroock Nov 10, 2024
9562798
Remove IE11 unmount hack
JoviDeCroock Nov 10, 2024
7f3e8c9
Remove select IE11 fix
JoviDeCroock Nov 10, 2024
6f39f81
Switch to queueMicrotask
JoviDeCroock Nov 10, 2024
034ccbf
Expand todo
JoviDeCroock Nov 10, 2024
80123ac
Remove SuspenseList
JoviDeCroock Nov 10, 2024
b175f8e
Remove component.base
JoviDeCroock Nov 10, 2024
e6f6b33
Remove more compat IE11 stuff
JoviDeCroock Nov 10, 2024
eaf7ce9
test: Drop unused/broken test (#4653)
rschristian Feb 11, 2025
756f8a7
Review feedback v11 (#4655)
JoviDeCroock Feb 12, 2025
699b4b5
Forward ref by default (#4658)
JoviDeCroock Feb 12, 2025
cdb0341
Use Object.is instead of the adhoc func
JoviDeCroock Feb 12, 2025
593b951
Move `defaultProps` into `preact/compat` (#4657)
JoviDeCroock Feb 13, 2025
4e74070
Look at impact of removing deprecated lifecycles (#4656)
JoviDeCroock Feb 13, 2025
13014a5
Remove unused imports
JoviDeCroock Feb 13, 2025
a25570b
Merge branch 'v11-2' of github.com:preactjs/preact into v11-2
JoviDeCroock Feb 13, 2025
89308f0
fix: Mangle `_listeners` as `__l` instead of `l` (#4463)
rschristian Feb 13, 2025
552fd70
Comment denoted hydration (#4636)
JoviDeCroock Feb 13, 2025
d41b18e
Move back to function
JoviDeCroock Feb 13, 2025
2dacc0a
Save bytes
JoviDeCroock Feb 13, 2025
5094a51
refactor: Switch to Object.is for hook args (#4663)
rschristian Feb 14, 2025
efee7ad
refactor: Restrict aria roles by element type
rschristian Dec 13, 2024
7d16078
refactor: Remove 'generic' aria role from allowed values
rschristian Feb 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 2 additions & 16 deletions compat/src/forwardRef.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,6 @@
import { options } from 'preact';
import { assign } from './util';

let oldDiffHook = options._diff;
options._diff = vnode => {
if (vnode.type && vnode.type._forwarded && vnode.ref) {
vnode.props.ref = vnode.ref;
vnode.ref = null;
}
if (oldDiffHook) oldDiffHook(vnode);
};

export const REACT_FORWARD_SYMBOL =
(typeof Symbol != 'undefined' &&
Symbol.for &&
Symbol.for('react.forward_ref')) ||
0xf47;
export const REACT_FORWARD_SYMBOL = Symbol.for('react.forward_ref');

/**
* Pass ref down to a child. This is mainly used in libraries with HOCs that
Expand All @@ -38,7 +24,7 @@ export function forwardRef(fn) {
// mobx-react throws.
Forwarded.render = Forwarded;

Forwarded.prototype.isReactComponent = Forwarded._forwarded = true;
Forwarded.prototype.isReactComponent = true;
Forwarded.displayName = 'ForwardRef(' + (fn.displayName || fn.name) + ')';
return Forwarded;
}
3 changes: 1 addition & 2 deletions compat/src/hooks.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { useState, useLayoutEffect, useEffect } from 'preact/hooks';
import { is } from './util';

/**
* This is taken from https://github.com/facebook/react/blob/main/packages/use-sync-external-store/src/useSyncExternalStoreShimClient.js#L84
Expand Down Expand Up @@ -47,7 +46,7 @@ function didSnapshotChange(inst) {
const prevValue = inst._value;
try {
const nextValue = latestGetSnapshot();
return !is(prevValue, nextValue);
return !Object.is(prevValue, nextValue);
} catch (error) {
return true;
}
Expand Down
202 changes: 144 additions & 58 deletions compat/src/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import * as _hooks from '../../hooks';
// Intentionally not using a relative path to take advantage of
// the TS version resolution mechanism
import * as preact from 'preact';
import * as preact1 from 'preact';
import { JSXInternal } from '../../src/jsx';
import * as _Suspense from './suspense';
import * as _SuspenseList from './suspense-list';

interface SignalLike<T> {
value: T;
Expand All @@ -14,6 +13,99 @@ interface SignalLike<T> {

type Signalish<T> = T | SignalLike<T>;

declare namespace preact {
export interface FunctionComponent<P = {}> {
(
props: preact1.RenderableProps<P>,
context?: any
): preact1.ComponentChildren;
displayName?: string;
defaultProps?: Partial<P> | undefined;
}

export interface ComponentClass<P = {}, S = {}> {
new (props: P, context?: any): preact1.Component<P, S>;
displayName?: string;
defaultProps?: Partial<P>;
contextType?: preact1.Context<any>;
getDerivedStateFromProps?(
props: Readonly<P>,
state: Readonly<S>
): Partial<S> | null;
getDerivedStateFromError?(error: any): Partial<S> | null;
}

export interface Component<P = {}, S = {}> {
componentWillMount?(): void;
componentDidMount?(): void;
componentWillUnmount?(): void;
getChildContext?(): object;
componentWillReceiveProps?(nextProps: Readonly<P>, nextContext: any): void;
shouldComponentUpdate?(
nextProps: Readonly<P>,
nextState: Readonly<S>,
nextContext: any
): boolean;
componentWillUpdate?(
nextProps: Readonly<P>,
nextState: Readonly<S>,
nextContext: any
): void;
getSnapshotBeforeUpdate?(oldProps: Readonly<P>, oldState: Readonly<S>): any;
componentDidUpdate?(
previousProps: Readonly<P>,
previousState: Readonly<S>,
snapshot: any
): void;
componentDidCatch?(error: any, errorInfo: preact1.ErrorInfo): void;
}

export abstract class Component<P, S> {
constructor(props?: P, context?: any);

static displayName?: string;
static defaultProps?: any;
static contextType?: preact1.Context<any>;

// Static members cannot reference class type parameters. This is not
// supported in TypeScript. Reusing the same type arguments from `Component`
// will lead to an impossible state where one cannot satisfy the type
// constraint under no circumstances, see #1356.In general type arguments
// seem to be a bit buggy and not supported well at the time of this
// writing with TS 3.3.3333.
static getDerivedStateFromProps?(
props: Readonly<object>,
state: Readonly<object>
): object | null;
static getDerivedStateFromError?(error: any): object | null;

state: Readonly<S>;
props: preact1.RenderableProps<P>;
context: any;

// From https://github.com/DefinitelyTyped/DefinitelyTyped/blob/e836acc75a78cf0655b5dfdbe81d69fdd4d8a252/types/react/index.d.ts#L402
// // We MUST keep setState() as a unified signature because it allows proper checking of the method return type.
// // See: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/18365#issuecomment-351013257
setState<K extends keyof S>(
state:
| ((
prevState: Readonly<S>,
props: Readonly<P>
) => Pick<S, K> | Partial<S> | null)
| (Pick<S, K> | Partial<S> | null),
callback?: () => void
): void;

forceUpdate(callback?: () => void): void;

abstract render(
props?: preact1.RenderableProps<P>,
state?: Readonly<S>,
context?: any
): preact1.ComponentChildren;
}
}

// export default React;
export = React;
export as namespace React;
Expand Down Expand Up @@ -50,33 +142,32 @@ declare namespace React {
): T;

// Preact Defaults
export import Context = preact.Context;
export import ContextType = preact.ContextType;
export import RefObject = preact.RefObject;
export import Context = preact1.Context;
export import ContextType = preact1.ContextType;
export import RefObject = preact1.RefObject;
export import Component = preact.Component;
export import FunctionComponent = preact.FunctionComponent;
export import ComponentType = preact.ComponentType;
export import ComponentType = preact1.ComponentType;
export import ComponentClass = preact.ComponentClass;
export import FC = preact.FunctionComponent;
export import createContext = preact.createContext;
export import Ref = preact.Ref;
export import createRef = preact.createRef;
export import Fragment = preact.Fragment;
export import createElement = preact.createElement;
export import cloneElement = preact.cloneElement;
export import ComponentProps = preact.ComponentProps;
export import ReactNode = preact.ComponentChild;
export import ReactElement = preact.VNode;
export import Consumer = preact.Consumer;
export import ErrorInfo = preact.ErrorInfo;
export import FC = preact1.FunctionComponent;
export import createContext = preact1.createContext;
export import Ref = preact1.Ref;
export import createRef = preact1.createRef;
export import Fragment = preact1.Fragment;
export import createElement = preact1.createElement;
export import cloneElement = preact1.cloneElement;
export import ComponentProps = preact1.ComponentProps;
export import ReactNode = preact1.ComponentChild;
export import ReactElement = preact1.VNode;
export import Consumer = preact1.Consumer;
export import ErrorInfo = preact1.ErrorInfo;

// Suspense
export import Suspense = _Suspense.Suspense;
export import lazy = _Suspense.lazy;
export import SuspenseList = _SuspenseList.SuspenseList;

// Compat
export import StrictMode = preact.Fragment;
export import StrictMode = preact1.Fragment;
export const version: string;
export function startTransition(cb: () => void): void;

Expand All @@ -85,15 +176,15 @@ declare namespace React {
extends JSXInternal.HTMLAttributes<T> {}
export interface HTMLProps<T extends EventTarget>
extends JSXInternal.AllHTMLAttributes<T>,
preact.ClassAttributes<T> {}
preact1.ClassAttributes<T> {}
export interface AllHTMLAttributes<T extends EventTarget>
extends JSXInternal.AllHTMLAttributes<T> {}
export import DetailedHTMLProps = JSXInternal.DetailedHTMLProps;
export import CSSProperties = JSXInternal.CSSProperties;

export interface SVGProps<T extends EventTarget>
extends JSXInternal.SVGAttributes<T>,
preact.ClassAttributes<T> {}
preact1.ClassAttributes<T> {}

interface SVGAttributes extends JSXInternal.SVGAttributes {}

Expand Down Expand Up @@ -188,81 +279,81 @@ declare namespace React {
export import TransitionEventHandler = JSXInternal.TransitionEventHandler;

export function createPortal(
vnode: preact.ComponentChildren,
container: preact.ContainerNode
): preact.VNode<any>;
vnode: preact1.ComponentChildren,
container: preact1.ContainerNode
): preact1.VNode<any>;

export function render(
vnode: preact.ComponentChild,
parent: preact.ContainerNode,
vnode: preact1.ComponentChild,
parent: preact1.ContainerNode,
callback?: () => void
): Component | null;

export function hydrate(
vnode: preact.ComponentChild,
parent: preact.ContainerNode,
vnode: preact1.ComponentChild,
parent: preact1.ContainerNode,
callback?: () => void
): Component | null;

export function unmountComponentAtNode(
container: preact.ContainerNode
container: preact1.ContainerNode
): boolean;

export function createFactory(
type: preact.VNode<any>['type']
type: preact1.VNode<any>['type']
): (
props?: any,
...children: preact.ComponentChildren[]
) => preact.VNode<any>;
...children: preact1.ComponentChildren[]
) => preact1.VNode<any>;
export function isValidElement(element: any): boolean;
export function isFragment(element: any): boolean;
export function isMemo(element: any): boolean;
export function findDOMNode(
component: preact.Component | Element
component: preact1.Component | Element
): Element | null;

export abstract class PureComponent<
P = {},
S = {},
SS = any
> extends preact.Component<P, S> {
> extends preact1.Component<P, S> {
isPureReactComponent: boolean;
}

export type MemoExoticComponent<C extends preact.FunctionalComponent<any>> =
preact.FunctionComponent<ComponentProps<C>> & {
export type MemoExoticComponent<C extends preact1.FunctionalComponent<any>> =
preact1.FunctionComponent<ComponentProps<C>> & {
readonly type: C;
};

export function memo<P = {}>(
component: preact.FunctionalComponent<P>,
component: preact1.FunctionalComponent<P>,
comparer?: (prev: P, next: P) => boolean
): preact.FunctionComponent<P>;
export function memo<C extends preact.FunctionalComponent<any>>(
): preact1.FunctionComponent<P>;
export function memo<C extends preact1.FunctionalComponent<any>>(
component: C,
comparer?: (
prev: preact.ComponentProps<C>,
next: preact.ComponentProps<C>
prev: preact1.ComponentProps<C>,
next: preact1.ComponentProps<C>
) => boolean
): C;

export interface RefAttributes<R> extends preact.Attributes {
ref?: preact.Ref<R> | undefined;
export interface RefAttributes<R> extends preact1.Attributes {
ref?: preact1.Ref<R> | undefined;
}

export interface ForwardFn<P = {}, T = any> {
(props: P, ref: ForwardedRef<T>): preact.ComponentChild;
(props: P, ref: ForwardedRef<T>): preact1.ComponentChild;
displayName?: string;
}

export interface ForwardRefExoticComponent<P>
extends preact.FunctionComponent<P> {
extends preact1.FunctionComponent<P> {
defaultProps?: Partial<P> | undefined;
}

export function forwardRef<R, P = {}>(
fn: ForwardFn<P, R>
): preact.FunctionalComponent<PropsWithoutRef<P> & { ref?: preact.Ref<R> }>;
): preact1.FunctionalComponent<PropsWithoutRef<P> & { ref?: preact1.Ref<R> }>;

export type PropsWithoutRef<P> = Omit<P, 'ref'>;

Expand Down Expand Up @@ -309,27 +400,22 @@ declare namespace React {
export function flushSync<R>(fn: () => R): R;
export function flushSync<A, R>(fn: (a: A) => R, a: A): R;

export function unstable_batchedUpdates(
callback: (arg?: any) => void,
arg?: any
): void;

export type PropsWithChildren<P = unknown> = P & {
children?: preact.ComponentChildren | undefined;
children?: preact1.ComponentChildren | undefined;
};

export const Children: {
map<T extends preact.ComponentChild, R>(
map<T extends preact1.ComponentChild, R>(
children: T | T[],
fn: (child: T, i: number) => R
): R[];
forEach<T extends preact.ComponentChild>(
forEach<T extends preact1.ComponentChild>(
children: T | T[],
fn: (child: T, i: number) => void
): void;
count: (children: preact.ComponentChildren) => number;
only: (children: preact.ComponentChildren) => preact.ComponentChild;
toArray: (children: preact.ComponentChildren) => preact.VNode<{}>[];
count: (children: preact1.ComponentChildren) => number;
only: (children: preact1.ComponentChildren) => preact1.ComponentChild;
toArray: (children: preact1.ComponentChildren) => preact1.VNode<{}>[];
};

// scheduler
Expand Down
Loading