Skip to content

Commit

Permalink
fix: correct types for non-string Link Resolver functions
Browse files Browse the repository at this point in the history
  • Loading branch information
angeloashmore committed Mar 31, 2022
1 parent 3f774db commit b0f61cc
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 17 deletions.
13 changes: 8 additions & 5 deletions src/PrismicLink.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ export interface LinkProps {
export type PrismicLinkProps<
InternalComponent extends React.ElementType<LinkProps> = React.ElementType<LinkProps>,
ExternalComponent extends React.ElementType<LinkProps> = React.ElementType<LinkProps>,
LinkResolverFunction extends prismicH.LinkResolverFunction = prismicH.LinkResolverFunction,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
LinkResolverFunction extends prismicH.LinkResolverFunction<any> = prismicH.LinkResolverFunction,
> = Omit<
React.ComponentPropsWithoutRef<InternalComponent> &
React.ComponentPropsWithoutRef<ExternalComponent>,
Expand Down Expand Up @@ -133,9 +134,10 @@ const defaultExternalComponent = "a";
* link is internal or external.
*/
const _PrismicLink = <
InternalComponent extends React.ElementType<LinkProps> = typeof defaultInternalComponent,
ExternalComponent extends React.ElementType<LinkProps> = typeof defaultExternalComponent,
LinkResolverFunction extends prismicH.LinkResolverFunction = prismicH.LinkResolverFunction,
InternalComponent extends React.ElementType<LinkProps>,
ExternalComponent extends React.ElementType<LinkProps>,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
LinkResolverFunction extends prismicH.LinkResolverFunction<any>,
>(
props: PrismicLinkProps<
InternalComponent,
Expand Down Expand Up @@ -216,7 +218,8 @@ const _PrismicLink = <
export const PrismicLink = React.forwardRef(_PrismicLink) as <
InternalComponent extends React.ElementType<LinkProps>,
ExternalComponent extends React.ElementType<LinkProps>,
LinkResolverFunction extends prismicH.LinkResolverFunction,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
LinkResolverFunction extends prismicH.LinkResolverFunction<any>,
>(
props: PrismicLinkProps<
InternalComponent,
Expand Down
20 changes: 14 additions & 6 deletions src/PrismicProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ import { JSXFunctionSerializer, JSXMapSerializer } from "./types";
* React context value containing shared configuration for `@prismicio/react`
* components and hooks.
*/
export type PrismicContextValue = {
export type PrismicContextValue<
// eslint-disable-next-line @typescript-eslint/no-explicit-any
LinkResolverFunction extends prismicH.LinkResolverFunction<any> = prismicH.LinkResolverFunction,
> = {
/**
* A `@prismicio/client` instance used to fetch content from a Prismic
* repository. This is used by `@prismicio/react` hooks, such as
Expand All @@ -26,7 +29,7 @@ export type PrismicContextValue = {
* repository's content, a Link Resolver does not need to be provided.
* @see Learn about Link Resolvers and Route Resolvers {@link https://prismic.io/docs/core-concepts/link-resolver-route-resolver}
*/
linkResolver?: prismicH.LinkResolverFunction;
linkResolver?: LinkResolverFunction;

/**
* A map or function that maps a Rich Text block to a React component.
Expand Down Expand Up @@ -81,23 +84,28 @@ export const PrismicContext = React.createContext<PrismicContextValue>({});
/**
* Props for `<PrismicProvider>`.
*/
export type PrismicProviderProps = PrismicContextValue;
export type PrismicProviderProps<
LinkResolverFunction extends prismicH.LinkResolverFunction,
> = PrismicContextValue<LinkResolverFunction>;

/**
* React context provider to share configuration for `@prismicio/react`
* components and hooks.
*
* @returns A React context provider with shared configuration.
*/
export const PrismicProvider = ({
export const PrismicProvider = <
// eslint-disable-next-line @typescript-eslint/no-explicit-any
LinkResolverFunction extends prismicH.LinkResolverFunction<any>,
>({
client,
linkResolver,
richTextComponents,
internalLinkComponent,
externalLinkComponent,
children,
}: PrismicProviderProps): JSX.Element => {
const value = React.useMemo<PrismicContextValue>(
}: PrismicProviderProps<LinkResolverFunction>): JSX.Element => {
const value = React.useMemo<PrismicContextValue<LinkResolverFunction>>(
() => ({
client,
linkResolver,
Expand Down
21 changes: 15 additions & 6 deletions src/PrismicRichText.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ import { usePrismicContext } from "./usePrismicContext";
/**
* Props for `<PrismicRichText>`.
*/
export type PrismicRichTextProps = {
export type PrismicRichTextProps<
// eslint-disable-next-line @typescript-eslint/no-explicit-any
LinkResolverFunction extends prismicH.LinkResolverFunction<any> = prismicH.LinkResolverFunction,
> = {
/**
* The Prismic Rich Text field to render.
*/
Expand All @@ -27,7 +30,7 @@ export type PrismicRichTextProps = {
* repository's content, a Link Resolver does not need to be provided.
* @see Learn about Link Resolvers and Route Resolvers {@link https://prismic.io/docs/core-concepts/link-resolver-route-resolver}
*/
linkResolver?: PrismicLinkProps["linkResolver"];
linkResolver?: LinkResolverFunction;

/**
* A function that maps a Rich Text block to a React component.
Expand Down Expand Up @@ -87,8 +90,11 @@ export type PrismicRichTextProps = {
fallback?: React.ReactNode;
};

type CreateDefaultSerializerArgs = {
linkResolver: prismicH.LinkResolverFunction<string> | undefined;
type CreateDefaultSerializerArgs<
// eslint-disable-next-line @typescript-eslint/no-explicit-any
LinkResolverFunction extends prismicH.LinkResolverFunction<any> = prismicH.LinkResolverFunction,
> = {
linkResolver: LinkResolverFunction | undefined;
internalLinkComponent: PrismicRichTextProps["internalLinkComponent"];
externalLinkComponent: PrismicRichTextProps["externalLinkComponent"];
};
Expand Down Expand Up @@ -220,8 +226,11 @@ const createDefaultSerializer = (
* @see Learn about Rich Text fields {@link https://prismic.io/docs/core-concepts/rich-text-title}
* @see Learn about Rich Text serializers {@link https://prismic.io/docs/core-concepts/html-serializer}
*/
export const PrismicRichText = (
props: PrismicRichTextProps,
export const PrismicRichText = <
// eslint-disable-next-line @typescript-eslint/no-explicit-any
LinkResolverFunction extends prismicH.LinkResolverFunction<any> = prismicH.LinkResolverFunction,
>(
props: PrismicRichTextProps<LinkResolverFunction>,
): JSX.Element | null => {
const context = usePrismicContext();

Expand Down

0 comments on commit b0f61cc

Please sign in to comment.