react-providers-tree
v1.0.0
Published
A utility to build a tree of React providers with their props
Downloads
3
Maintainers
Readme
Here's an updated and polished version of your README.md with clearer structure, consistent formatting, improved grammar, and better code formatting. I've also added a small enhancement for clarity on the usage of satisfies and other best practices:
🧩 buildProvidersTree – Compose Multiple React Context Providers Elegantly
A tiny utility to help you compose multiple React providers into a single clean component — perfect for organizing your root component tree.
🚀 Features
- ✅ Fully type-safe (no
any) - ✅ Simple, declarative API
- ✅ Works seamlessly with TypeScript’s
satisfieskeyword - ✅ Cleans up your root layout logic
📦 Installation
npm install build-providers-tree
# or
yarn add build-providers-tree✨ Usage Example
✅ With buildProvidersTree
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { buildProvidersTree, ProviderComponent } from "build-providers-tree";
import App from "./App";
import { ThemeProvider } from "./providers/ThemeProvider";
import { TanStackQueryProvider } from "./providers/TanStackQueryProvider";
import { ToasterProvider } from "./providers/ToasterProvider";
const Providers = buildProvidersTree([
[ThemeProvider, {}] satisfies ProviderComponent<typeof ThemeProvider>,
[TanStackQueryProvider, {}] satisfies ProviderComponent<typeof TanStackQueryProvider>,
[ToasterProvider, {}] satisfies ProviderComponent<typeof ToasterProvider>,
] as const);
const root = createRoot(document.getElementById("root")!);
root.render(
<StrictMode>
<Providers>
<App />
</Providers>
</StrictMode>
);❌ Without buildProvidersTree
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App";
import { ThemeProvider } from "./providers/ThemeProvider";
import { TanStackQueryProvider } from "./providers/TanStackQueryProvider";
import { ToasterProvider } from "./providers/ToasterProvider";
const root = createRoot(document.getElementById("root")!);
root.render(
<StrictMode>
<ThemeProvider>
<TanStackQueryProvider>
<ToasterProvider>
<App />
</ToasterProvider>
</TanStackQueryProvider>
</ThemeProvider>
</StrictMode>
);🧠 API Reference
buildProvidersTree(providers)
Wraps multiple providers in a nested tree.
Parameters
buildProvidersTree([
[ProviderComponent, props],
...
] as const);Each tuple must satisfy ProviderComponent<T>, ensuring props are validated against each provider’s expected props.
ProviderComponent<T>
type ProviderComponent<T extends React.ElementType> = [
T,
Omit<React.ComponentProps<T>, "children">
];Using satisfies ProviderComponent<typeof X> ensures strict type safety for each provider and its props.
🛡️ Type Safety Tips
- ✅ Use
as conston the providers array to preserve the tuple structure. - ✅ Use
satisfiesto enforce prop types at compile time. - ✅ Any React provider that accepts
childrenwill work.
✅ Tested With
styled-componentsThemeProvider@tanstack/react-queryQueryClientProvider- Custom React context providers
📁 Suggested Directory Structure
src/
│
├── providers/
│ ├── buildProvidersTree.ts
│ └── index.ts # exports composed Providers
│
├── App.tsx
└── main.tsx📝 License
MIT © [Mohammad Garmabi]
Would you like me to generate the package.json, tsconfig.json, and entry files to publish this as a complete NPM package?
