Research
Security News
Kill Switch Hidden in npm Packages Typosquatting Chalk and Chokidar
Socket researchers found several malicious npm packages typosquatting Chalk and Chokidar, targeting Node.js developers with kill switches and data theft.
@rbxts/react-roblox
Advanced tools
TypeScript type definitions for React Lua.
npm package →
TypeScript type definitions for React Lua and roblox-ts, sourced from the official React types. Currently, only @rbxts/react
and
@rbxts/react-roblox
are available.
If we're missing any deviations from React Lua, please open an issue or pull request to let us know!
[!IMPORTANT] This package uses unreleased roblox-ts features, and requires
roblox-ts@next
to be installed. If you're encountering issues with@rbxts/react
, please see the Troubleshooting section for more information.
Get started by adding React and ReactRoblox to your project:
npm install @rbxts/react @rbxts/react-roblox
yarn add @rbxts/react @rbxts/react-roblox
pnpm add @rbxts/react @rbxts/react-roblox # 🔴 See below
roblox-ts
must also be installed with the next
tag:
npm install -D roblox-ts@next
yarn add -D roblox-ts@next
pnpm add -D roblox-ts@next
Set up your tsconfig.json
to use the React JSX factory.
"compilerOptions": {
"jsxFactory": "React.createElement",
"jsxFragmentFactory": "React.Fragment"
}
If you're using PNPM as your package manager, you'll need to create a .npmrc
file in the root of your project with the following content:
node-linker=hoisted
import React, { StrictMode } from "@rbxts/react";
import { createPortal, createRoot } from "@rbxts/react-roblox";
const root = createRoot(new Instance("Folder"));
root.render(<StrictMode>{createPortal(<App />, playerGui)}</StrictMode>);
import React, { useState } from "@rbxts/react";
interface CounterProps {
initialCount: number;
}
export function Counter({ initialCount }: CounterProps) {
const [count, setCount] = useState(initialCount);
return (
<textbutton
Text={`Count: ${count}`}
AnchorPoint={new Vector2(0.5, 0.5)}
Size={new UDim2(0, 100, 0, 50)}
Position={new UDim2(0.5, 0, 0.5, 0)}
Event={{
Activated: () => setCount(count + 1),
}}
/>
);
}
import React, { Component, ReactComponent } from "@rbxts/react";
interface CounterProps {
initialCount: number;
}
interface CounterState {
count: number;
}
@ReactComponent
export class Counter extends Component<CounterProps, CounterState> {
state: CounterState = {
count: this.props.initialCount,
};
render() {
return (
<textbutton
Text={`Count: ${this.state.count}`}
AnchorPoint={new Vector2(0.5, 0.5)}
Size={new UDim2(0, 100, 0, 50)}
Position={new UDim2(0.5, 0, 0.5, 0)}
Event={{
Activated: () => this.setState({ count: this.state.count + 1 }),
}}
/>
);
}
}
import React, { Component, ErrorInfo, ReactComponent } from "@rbxts/react";
interface ErrorBoundaryProps {
fallback: (error: unknown) => React.Element;
}
interface ErrorBoundaryState {
hasError: boolean;
message?: unknown;
}
@ReactComponent
export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
state: ErrorBoundaryState = {
hasError: false,
};
componentDidCatch(message: unknown, info: ErrorInfo) {
warn(message, info.componentStack);
this.setState({
hasError: true,
message: `${message} ${info.componentStack}`,
});
}
render() {
if (this.state.hasError) {
return this.props.fallback(this.state.message);
} else {
return this.props.children;
}
}
}
Roact.createElement
!If you encounter this error during compilation, it means that you're using an older version of roblox-ts
. Make sure to install roblox-ts@next
and uninstall any global installations of roblox-ts
:
npm uninstall -g roblox-ts
npm install -D roblox-ts@next
(X)
cannot be used as a JSX component. Its return type Element
is not a valid JSX element.This error occurs when a conflicting installation of react-ts is present in your project. This can be for one of two reasons:
npm uninstall @rbxts/roact
)The most common cause is an outdated package. To view the packages that depend on @rbxts/react-ts
(which will be under the alias @rbxts/roact
), run the following command:
npm ls @rbxts/roact
If you find any packages that depend on @rbxts/react-ts
, you should update them to the latest version, or open an issue on their repository to request an update.
useMemo
(or other hooks)This error happens when React can't figure out how to retrieve the current instance of the component. This can be for a number of reasons:
Hooks must be used inside the body of a function component. A common mistake is to call hooks conditionally, or inside a callback function. Make sure you're calling hooks at the top level of your function component.
Do not call a function component directly. To render a function component, wrap it in a JSX tag:
<App />; // 🟢 Good
App(); // 🔴 Bad
When multiple versions of React are present in your node_modules, any packages that depend on React might try to use the wrong one.
Make sure your rbxts_include.node_module.@rbxts
folder in Roblox Studio doesn't contain a module named "React" (capital R). This module is a sign Rojo has not fully removed react-ts. If so, you should delete your node_modules
folder and restart Rojo.
If a fresh install doesn't fix the issue, you might have a package installed that depends on react-ts. See the previous section for more information.
If you're encountering an issue that isn't listed here, please post your issue in the roblox-ts Discord server.
This project is licensed under the MIT license.
FAQs
React DOM bindings for Roblox
The npm package @rbxts/react-roblox receives a total of 542 weekly downloads. As such, @rbxts/react-roblox popularity was classified as not popular.
We found that @rbxts/react-roblox demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers found several malicious npm packages typosquatting Chalk and Chokidar, targeting Node.js developers with kill switches and data theft.
Security News
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
Product
Socket now supports uv.lock files to ensure consistent, secure dependency resolution for Python projects and enhance supply chain security.