{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import * as React from \"react\";\n\n/**\n * Provider component type.\n */\ntype ProviderComponent = React.ComponentType<any>;\n\n/**\n * Provider component props without the `children` prop.\n */\ntype ProviderProps<C extends ProviderComponent> = Omit<\n    React.ComponentProps<C>,\n    \"children\"\n>;\n\n/**\n * A provider entry: either a component, [Component], or [Component, Props].\n * Validates props against the component and omits the `children` prop.\n */\ntype ProviderEntry<T> =\n    // Component\n    T extends ProviderComponent\n        ? T\n        : // [Component]\n          T extends [\n                infer C extends ProviderComponent,\n            ]\n          ? [\n                C,\n            ]\n          : // [Component, Props]\n            T extends [\n                  infer C extends ProviderComponent,\n                  infer P,\n              ]\n            ? P extends ProviderProps<C>\n                ? // Valid: all props match the component's expected shape\n                  T\n                : // Invalid: surface a type error by narrowing mismatched\n                  // keys to never, so the user sees which props are invalid\n                  [\n                      C,\n                      ProviderProps<C> & {\n                          [K in keyof P]: K extends keyof ProviderProps<C>\n                              ? ProviderProps<C>[K]\n                              : never;\n                      },\n                  ]\n            : never;\n\n/**\n * A provider entries tuple with validated props.\n */\ntype ProviderEntries<T> = {\n    [K in keyof T]: ProviderEntry<T[K]>;\n};\n\n/**\n * Props for the composed providers component.\n */\ntype ComposedProvidersProps = {\n    children?: React.ReactNode;\n};\n\n/**\n * The composed providers component.\n */\ntype ComposedProviders = (props: ComposedProvidersProps) => React.ReactNode;\n\n/**\n * Create a `Providers` component with the given providers.\n *\n * ### Example\n *\n * ```ts\n * import type * as React from \"react\";\n * import type { ComposedProviders } from \"react-compose-context-providers\";\n *\n * import { composeProviders } from \"react-compose-context-providers\";\n *\n * import { ThemeProvider } from \"./contexts/theme\";\n * import { LocaleProvider } from \"./contexts/locale\";\n *\n * const Providers: ComposedProviders = composeProviders([\n *     [\n *         ThemeProvider,\n *         {\n *             defaultTheme: \"dark\",\n *         },\n *     ],\n *     LocaleProvider,\n * ]);\n *\n * type ComponentProps = {\n *     children: React.ReactNode;\n * };\n *\n * const Component = (props: ComponentProps): React.JSX.Element => {\n *     return <Providers>{props.children}</Providers>;\n * };\n * ```\n */\nconst composeProviders = <\n    const T extends readonly (\n        | ProviderComponent\n        | [\n              ProviderComponent,\n          ]\n        | [\n              ProviderComponent,\n              Record<string, unknown>,\n          ]\n    )[],\n>(\n    providers: [\n        ...ProviderEntries<T>,\n    ],\n): ComposedProviders => {\n    return (props: ComposedProvidersProps): React.ReactNode => {\n        return providers.reduceRight(\n            (\n                acc: React.ReactNode,\n                entry: ProviderEntries<T>[number],\n            ): React.ReactNode => {\n                const normalized: [\n                    ProviderComponent,\n                    Record<string, unknown> | undefined,\n                ] = Array.isArray(entry)\n                    ? [\n                          entry[0],\n                          entry[1],\n                      ]\n                    : [\n                          entry,\n                          void 0,\n                      ];\n\n                return React.createElement(\n                    normalized[0],\n                    normalized[1] ?? null,\n                    acc,\n                );\n            },\n            props.children,\n        );\n    };\n};\n\nexport type {\n    ComposedProviders,\n    ComposedProvidersProps,\n    ProviderComponent,\n    ProviderEntries,\n    ProviderEntry,\n    ProviderProps,\n};\nexport { composeProviders };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsGA,MAAM,oBAYF,cAGoB;CACpB,QAAQ,UAAmD;EACvD,OAAO,UAAU,aAET,KACA,UACkB;GAClB,MAAM,aAGF,MAAM,QAAQ,KAAK,IACjB,CACI,MAAM,IACN,MAAM,EACV,IACA,CACI,OACA,KAAK,CACT;GAEN,OAAO,MAAM,cACT,WAAW,IACX,WAAW,MAAM,MACjB,GACJ;EACJ,GACA,MAAM,QACV;CACJ;AACJ"}