Skip to content

Commit

Permalink
refactor: simplify types / suggest module augmentation for extensibility
Browse files Browse the repository at this point in the history
BREAKING CHANGE: A few TypeScript types names have been changed and
some type parameters have been removed for simplicity. Use module
augmentation if you need to specify `RenderersProps` or
`PropsFromParent`.
  • Loading branch information
jsamr committed Jun 4, 2021
1 parent 1e418cc commit 02aa624
Show file tree
Hide file tree
Showing 21 changed files with 169 additions and 139 deletions.
12 changes: 8 additions & 4 deletions packages/render-html/src/RenderHTMLConfigProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import RenderersPropsProvider from './context/RenderersPropsProvider';
import SharedPropsProvider from './context/SharedPropsProvider';
import TChildrenRenderersContext from './context/TChildrenRendererContext';
import { RenderHTMLConfig, RenderersPropsBase } from './shared-types';
import { RenderHTMLConfig } from './shared-types';
import TNodeChildrenRenderer from './TNodeChildrenRenderer';
import TChildrenRenderer from './TChildrenRenderer';
import sourceLoaderContext from './context/sourceLoaderContext';
Expand Down Expand Up @@ -34,9 +34,13 @@ export const renderHTMLConfigPropTypes: RenderHTMLConfigPropTypes = {
renderers: PropTypes.object
};

export default function RenderHTMLConfigProvider<
P extends RenderersPropsBase = RenderersPropsBase
>(props: PropsWithChildren<RenderHTMLConfig<P>>): ReactElement {
/**
* A component to provide configuration for {@link RenderHTMLSource}
* descendants, to be used in conjunction with {@link TRenderEngineProvider}.
*/
export default function RenderHTMLConfigProvider(
props: PropsWithChildren<RenderHTMLConfig>
): ReactElement {
const {
remoteErrorView,
remoteLoadingView,
Expand Down
8 changes: 4 additions & 4 deletions packages/render-html/src/RenderHTMLDebug.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import React, { Fragment, PropsWithChildren } from 'react';
import debugMessage from './debugMessages';
import { RenderersPropsBase, RenderHTMLProps } from './shared-types';
import { RenderHTMLProps } from './shared-types';

const RenderHTMLDebug = function RenderHTMLDebug<
P extends RenderersPropsBase = RenderersPropsBase
>(props: PropsWithChildren<RenderHTMLProps<P>>) {
const RenderHTMLDebug = function RenderHTMLDebug(
props: PropsWithChildren<RenderHTMLProps>
) {
if (__DEV__) {
if (typeof props.contentWidth !== 'number') {
console.warn(debugMessage.contentWidth);
Expand Down
3 changes: 2 additions & 1 deletion packages/render-html/src/TBlockRenderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ import React from 'react';
import { View } from 'react-native';
import { TBlock } from '@native-html/transient-render-engine';
import { useTNodeChildrenRenderer } from './context/TChildrenRendererContext';
import { TDefaultRenderer, TNodeSubRendererProps } from './shared-types';
import { TDefaultRenderer } from './shared-types';
import { TNodeSubRendererProps } from './internal-types';
import GenericPressable from './GenericPressable';
import useAssembledCommonProps from './hooks/useAssembledCommonProps';

Expand Down
3 changes: 2 additions & 1 deletion packages/render-html/src/TPhrasingRenderer.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import React from 'react';
import { TPhrasing } from '@native-html/transient-render-engine';
import { useTNodeChildrenRenderer } from './context/TChildrenRendererContext';
import { TDefaultRenderer, TNodeSubRendererProps } from './shared-types';
import { TDefaultRenderer } from './shared-types';
import { TNodeSubRendererProps } from './internal-types';
import useAssembledCommonProps from './hooks/useAssembledCommonProps';
import TDefaultTextualRenderer from './TDefaultTextualRenderer';

Expand Down
7 changes: 2 additions & 5 deletions packages/render-html/src/TTextRenderer.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import React from 'react';
import { TText } from '@native-html/transient-render-engine';
import {
TDefaultRenderer,
TDefaultRendererProps,
TNodeSubRendererProps
} from './shared-types';
import { TDefaultRenderer, TDefaultRendererProps } from './shared-types';
import { TNodeSubRendererProps } from './internal-types';
import { useInternalTextRenderer } from './context/RenderRegistryProvider';
import useAssembledCommonProps from './hooks/useAssembledCommonProps';
import TDefaultTextualRenderer from './TDefaultTextualRenderer';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,9 @@ describe('RenderHTML', () => {
const SpanRenderer: CustomTextualRenderer = ({
TDefaultRenderer,
...props
}) => <TDefaultRenderer {...props} propsForChildren={{ test: 1 }} />;
}) => (
<TDefaultRenderer {...props} propsForChildren={{ test: 1 } as any} />
);
const EmRenderer: CustomTextualRenderer = ({
TDefaultRenderer,
...props
Expand All @@ -240,7 +242,9 @@ describe('RenderHTML', () => {
const SpanRenderer: CustomTextualRenderer = ({
TDefaultRenderer,
...props
}) => <TDefaultRenderer {...props} propsForChildren={{ test: 1 }} />;
}) => (
<TDefaultRenderer {...props} propsForChildren={{ test: 1 } as any} />
);
const EmRenderer: CustomTextualRenderer = ({
TDefaultRenderer,
...props
Expand Down
4 changes: 2 additions & 2 deletions packages/render-html/src/__tests__/utils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export function expectTranslatedInlineCSSRuleTo({
cssInlineRules: string;
test: (v: any) => void;
render: typeof renderTestingLib;
extraProps?: Partial<RenderHTMLProps<any>>;
extraProps?: Partial<RenderHTMLProps>;
}) {
const { getByText } = render(
<RenderHTML
Expand Down Expand Up @@ -69,7 +69,7 @@ export function expectTranslatedInlineCSSValueToEqual({
reactNativePropStyleName: string;
render: typeof renderTestingLib;
value: any;
extraProps?: Partial<RenderHTMLProps<any>>;
extraProps?: Partial<RenderHTMLProps>;
}) {
expectTranslatedInlineCSSRuleTo({
cssInlineRules,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export function useRendererProps<
* @internal
*/
export default function RenderersPropsProvider(
props: PropsWithChildren<RenderHTMLPassedProps<RenderersPropsBase>>
props: PropsWithChildren<RenderHTMLPassedProps>
) {
const mergedRenderersProps = useMemo(
() => mergeDeepRight(defaultRendererProps, props.renderersProps || {}),
Expand Down
4 changes: 2 additions & 2 deletions packages/render-html/src/context/SharedPropsProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { PropsWithChildren, useCallback, useMemo } from 'react';
import defaultListStyleSpecs from '../elements/defaultListStyleSpecs';
import selectSharedProps from '../helpers/selectSharedProps';
import { RenderHTMLSharedProps, TRendererBaseProps } from '../shared-types';
import { RenderHTMLSharedProps, RendererBaseProps } from '../shared-types';
import defaultSharedProps from './defaultSharedProps';

const SharedPropsContext = React.createContext<Required<RenderHTMLSharedProps>>(
Expand All @@ -23,7 +23,7 @@ export function useSharedProps() {
* @internal
*/
export function useDefaultContainerProps(): Pick<
TRendererBaseProps<any>,
RendererBaseProps<any>,
'viewProps' | 'textProps'
> {
const sharedProps = useSharedProps();
Expand Down
4 changes: 2 additions & 2 deletions packages/render-html/src/elements/AElement.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import React from 'react';
import { TBlock, TPhrasing, TText } from '@native-html/transient-render-engine';
import { DefaultTagRendererProps } from '../shared-types';
import { InternalRendererProps } from '../shared-types';

export default function AElement({
TDefaultRenderer,
...props
}: DefaultTagRendererProps<TBlock | TPhrasing | TText>) {
}: InternalRendererProps<TBlock | TPhrasing | TText>) {
return React.createElement(TDefaultRenderer, props);
}
4 changes: 2 additions & 2 deletions packages/render-html/src/elements/ListElement.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
} from '@jsamr/react-native-li';
import type {
DefaultSupportedListStyleType,
DefaultTagRendererProps,
InternalRendererProps,
ListElementConfig,
ListStyleSpec,
TChildProps,
Expand All @@ -20,7 +20,7 @@ import { DEFAULT_TEXT_COLOR } from '../constants';
import pick from 'ramda/src/pick';

export interface ListElementProps<T extends 'ol' | 'ul'>
extends DefaultTagRendererProps<TBlock>,
extends InternalRendererProps<TBlock>,
ListElementConfig {
listType: T;
listStyleSpecs: Record<string, ListStyleSpec>;
Expand Down
14 changes: 7 additions & 7 deletions packages/render-html/src/hooks/useAssembledCommonProps.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { TNode } from '@native-html/transient-render-engine';
import {
CustomTagRenderer,
CustomTagRendererProps,
CustomRenderer,
CustomRendererProps,
TDefaultRenderer,
TDefaultRendererProps,
TNodeSubRendererProps
TDefaultRendererProps
} from '../shared-types';
import { TNodeSubRendererProps } from '../internal-types';
import mergeCollapsedMargins from '../helpers/mergeCollapsedMargins';
import { useRendererConfig } from '../context/RenderRegistryProvider';
import { useDefaultContainerProps } from '../context/SharedPropsProvider';
Expand All @@ -17,12 +17,12 @@ export default function useAssembledCommonProps<T extends TNode>(
{ tnode, key, propsFromParent, sharedProps }: TNodeSubRendererProps<T>,
TDefault: TDefaultRenderer<T>
): {
assembledProps: CustomTagRendererProps<T> & TDefaultRendererProps<T>;
Renderer: CustomTagRenderer<T>;
assembledProps: CustomRendererProps<T> & TDefaultRendererProps<T>;
Renderer: CustomRenderer<T>;
} {
const { Default, Custom } = useRendererConfig(tnode);
const containerProps = useDefaultContainerProps();
const assembledProps: CustomTagRendererProps<T> & TDefaultRendererProps<T> = {
const assembledProps: CustomRendererProps<T> & TDefaultRendererProps<T> = {
key,
tnode,
propsFromParent,
Expand Down
7 changes: 2 additions & 5 deletions packages/render-html/src/hooks/useInternalRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@ import { useAElementProps } from '../renderers/ARenderer';
import { useIMGElementProps } from '../renderers/IMGRenderer';
import { useOLElementProps } from '../renderers/OLRenderer';
import { useULElementProps } from '../renderers/ULRenderer';
import {
DefaultTagRendererProps,
TDefaultRendererProps
} from '../shared-types';
import { InternalRendererProps, TDefaultRendererProps } from '../shared-types';

const specialRenderersConfig = {
img: {
Expand Down Expand Up @@ -60,7 +57,7 @@ export interface InternalRendererConfig<P> {
*/
export default function useInternalRenderer<T extends TagName>(
tagName: T,
props: DefaultTagRendererProps<any>
props: InternalRendererProps<any>
): T extends InternalSpecialRenderedTag
? InternalRendererConfig<ReturnType<typeof specialRenderersConfig[T]['hook']>>
: InternalRendererConfig<TDefaultRendererProps<any>> {
Expand Down
15 changes: 14 additions & 1 deletion packages/render-html/src/internal-types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { TNode } from '@native-html/transient-render-engine';
import { DOMDocument, DOMElement } from '@native-html/transient-render-engine';
import { RenderHTMLProps } from './shared-types';
import {
RenderHTMLProps,
TNodeRendererProps,
RenderHTMLSharedProps
} from './shared-types';

export type SourceLoaderProps = Pick<
RenderHTMLProps,
Expand All @@ -15,3 +20,11 @@ export type TTreeEvents = Pick<
RenderHTMLProps,
'onTTreeChange' | 'onDocumentMetadataLoaded'
>;

export interface TNodeSubRendererProps<T extends TNode>
extends TNodeRendererProps<T> {
/**
* Props shared across the whole render tree.
*/
sharedProps: Required<RenderHTMLSharedProps>;
}
8 changes: 4 additions & 4 deletions packages/render-html/src/render/RenderRegistry.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { TNode } from '@native-html/transient-render-engine';
import { ComponentType } from 'react';
import { CustomTagRendererProps } from '..';
import { CustomRendererProps } from '..';
import lookupRecord from '../helpers/lookupRecord';
import BRRenderer from '../renderers/BRRenderer';
import WBRRenderer from '../renderers/WBRRenderer';
import {
CustomTagRenderer,
CustomRenderer,
HTMLElementModelRecord,
InternalRenderer
} from '../shared-types';
Expand All @@ -22,7 +22,7 @@ const internalTextRenderers: Record<string, InternalTextContentRenderer> = {

export interface RendererConfig<T extends TNode> {
Default: InternalRenderer<T> | null;
Custom: CustomTagRenderer<T> | null;
Custom: CustomRenderer<T> | null;
}

export default class RenderRegistry {
Expand Down Expand Up @@ -63,7 +63,7 @@ export default class RenderRegistry {

private getCustomRendererForTNode<T extends TNode>(
tnode: T
): ComponentType<CustomTagRendererProps<T>> | null {
): ComponentType<CustomRendererProps<T>> | null {
if (tnode.tagName! in this.customRenderers) {
const renderer = this.customRenderers[tnode.tagName!];
if (__DEV__) {
Expand Down
22 changes: 5 additions & 17 deletions packages/render-html/src/render/render-types.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
import { TBlock, TPhrasing, TText } from '@native-html/transient-render-engine';
import { ComponentType } from 'react';
import {
CustomTagRenderer,
InternalRenderer,
PropsFromParent
} from '../shared-types';
import { CustomRenderer, InternalRenderer } from '../shared-types';

/**
* Special internal renderers for non-printable text (wbr, br).
Expand Down Expand Up @@ -35,30 +31,22 @@ export type InternalTextualRenderer = InternalRenderer<TPhrasing | TText>;
/**
* Block renderers can only render tnodes of type TBlock.
*/
export type CustomBlockRenderer<
P extends PropsFromParent = PropsFromParent
> = CustomTagRenderer<TBlock, P>;
export type CustomBlockRenderer = CustomRenderer<TBlock>;

/**
* Textual renderers can render tnodes of type TText or TPhrasing.
*/
export type CustomTextualRenderer<
P extends PropsFromParent = PropsFromParent
> = CustomTagRenderer<TText | TPhrasing, P>;
export type CustomTextualRenderer = CustomRenderer<TText | TPhrasing>;

/**
* Mixed renderers can can render tnodes of type TText, TPhrasing or TBlock.
*/
export type CustomMixedRenderer<
P extends PropsFromParent = PropsFromParent
> = CustomTagRenderer<TBlock | TPhrasing | TText, P>;
export type CustomMixedRenderer = CustomRenderer<TBlock | TPhrasing | TText>;

/**
* A record of custom renderers.
*/
export type CustomTagRendererRecord = Record<
string,
| CustomBlockRenderer<any>
| CustomTextualRenderer<any>
| CustomMixedRenderer<any>
CustomBlockRenderer | CustomTextualRenderer | CustomMixedRenderer
>;
6 changes: 3 additions & 3 deletions packages/render-html/src/renderers/ARenderer.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';
import { InternalMixedRenderer } from '../render/render-types';
import { TNode, DocumentContext } from '@native-html/transient-render-engine';
import { DefaultTagRendererProps, RenderersPropsBase } from '../shared-types';
import { InternalRendererProps, RenderersPropsBase } from '../shared-types';
import { AccessibilityProps, GestureResponderEvent } from 'react-native';
import AElement from '../elements/AElement';
import useNormalizedUrl from '../hooks/useNormalizedUrl';
Expand Down Expand Up @@ -32,8 +32,8 @@ function useAnchorOnLinkPress(
}

export function useAElementProps<T extends TNode>(
props: DefaultTagRendererProps<T>
): DefaultTagRendererProps<T> {
props: InternalRendererProps<T>
): InternalRendererProps<T> {
const { tnode } = props;
const { onPress } = useRendererProps('a');
const syntheticAnchorOnLinkPress = useAnchorOnLinkPress(tnode, onPress);
Expand Down
4 changes: 2 additions & 2 deletions packages/render-html/src/renderers/IMGRenderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ import IMGElement, { IMGElementProps } from '../elements/IMGElement';
import { InternalBlockRenderer } from '../render/render-types';
import { useComputeMaxWidthForTag } from '../context/SharedPropsProvider';
import { ImageStyle } from 'react-native';
import { DefaultTagRendererProps } from '../shared-types';
import { InternalRendererProps } from '../shared-types';
import useNormalizedUrl from '../hooks/useNormalizedUrl';
import { useRendererProps } from '../context/RenderersPropsProvider';
import useContentWidth from '../hooks/useContentWidth';

export function useIMGElementProps(
props: DefaultTagRendererProps<TBlock>
props: InternalRendererProps<TBlock>
): IMGElementProps & ClassAttributes<any> {
const { style, tnode, onPress, key } = props;
const contentWidth = useContentWidth();
Expand Down
4 changes: 2 additions & 2 deletions packages/render-html/src/renderers/OLRenderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React from 'react';
import { TBlock } from '@native-html/transient-render-engine';
import { InternalBlockRenderer } from '../render/render-types';
import {
DefaultTagRendererProps,
InternalRendererProps,
DefaultSupportedListStyleType
} from '../shared-types';
import OLElement, { OLElementProps } from '../elements/OLElement';
Expand All @@ -22,7 +22,7 @@ function getFallbackListStyleTypeFromNestLevel(
}

export function useOLElementProps(
props: DefaultTagRendererProps<TBlock>
props: InternalRendererProps<TBlock>
): OLElementProps {
const listStyleSpecs = props.sharedProps.customListStyleSpecs;
const config = useRendererProps('ol');
Expand Down
4 changes: 2 additions & 2 deletions packages/render-html/src/renderers/ULRenderer.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';
import { InternalBlockRenderer } from '../render/render-types';
import {
DefaultTagRendererProps,
InternalRendererProps,
DefaultSupportedListStyleType
} from '../shared-types';
import { TBlock } from '@native-html/transient-render-engine';
Expand All @@ -22,7 +22,7 @@ function getFallbackListStyleTypeFromNestLevel(
}

export function useULElementProps(
props: DefaultTagRendererProps<TBlock>
props: InternalRendererProps<TBlock>
): ULElementProps {
const listStyleSpecs = props.sharedProps.customListStyleSpecs;
const config = useRendererProps('ul');
Expand Down
Loading

0 comments on commit 02aa624

Please sign in to comment.