Skip to content

Commit

Permalink
add rome linting tools #10
Browse files Browse the repository at this point in the history
  • Loading branch information
ukorvl committed Aug 8, 2023
1 parent 0f9f669 commit 1c90860
Show file tree
Hide file tree
Showing 17 changed files with 402 additions and 3,075 deletions.
5 changes: 1 addition & 4 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ on:

jobs:
build:
runs-on: [ubuntu-latest]
runs-on: ubuntu-latest
name: Build
steps:
- name: Checkout
Expand All @@ -31,9 +31,6 @@ jobs:
- name: Lint
run: npm run lint

- name: Lint:editorconfig
run: npm run lint:editorconfig

- name: Test
run: npm run test

Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
jobs:
ensure_version_changed:
name: Ensure that version was changed
runs-on: [ubuntu-latest]
runs-on: ubuntu-latest
outputs:
version: ${{ steps.check_version.outputs.version }}
steps:
Expand Down Expand Up @@ -40,7 +40,7 @@ jobs:
should_pack: true

publish:
runs-on: [ubuntu-latest]
runs-on: ubuntu-latest
needs: [build, ensure_version_changed]
if: ${{ needs.ensure_version_changed.outputs.version }}
name: Publish to npm
Expand All @@ -56,7 +56,7 @@ jobs:
npm publish --access public ukorvl-react-on-screen-${{ needs.ensure_version_changed.outputs.version }}.tgz
tag:
runs-on: [ubuntu-latest]
runs-on: ubuntu-latest
needs: [build, ensure_version_changed, publish, release]
if: ${{ needs.ensure_version_changed.outputs.version }}
name: Tag
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ npm-debug.log*

# editors
.idea
.vscode
.vscode/*
!.vscode/settings.json

# storybook
storybook-static
Empty file modified .husky/pre-commit
100644 → 100755
Empty file.
1 change: 0 additions & 1 deletion .prettierignore

This file was deleted.

4 changes: 4 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"editor.defaultFormatter": "rome.rome",
"editor.formatOnSave": true
}
17 changes: 4 additions & 13 deletions lib/OnScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,11 @@ import { UseOnScreenParameters, useOnScreen } from './useOnScreen';
/**
* OnScreen component own props.
*/
type OnScreenOwnProps<
T extends HTMLElement,
AS extends ElementType = ElementType,
> = {
type OnScreenOwnProps<T extends HTMLElement, AS extends ElementType = ElementType> = {
/**
* Render function.
*/
children: (
props: { ref: RefObject<T> } & ReturnType<typeof useOnScreen>,
) => ReactElement;
children: (props: { ref: RefObject<T> } & ReturnType<typeof useOnScreen>) => ReactElement;
/**
* Element to render.
*/
Expand All @@ -34,8 +29,7 @@ type OnScreenOwnProps<
export type OnScreenProps<
T extends HTMLElement,
AS extends ElementType = ElementType,
> = OnScreenOwnProps<T, AS> &
Omit<ComponentProps<AS>, keyof OnScreenOwnProps<T, AS>>;
> = OnScreenOwnProps<T, AS> & Omit<ComponentProps<AS>, keyof OnScreenOwnProps<T, AS>>;

/**
* Wrapper component to detect react element visibility.
Expand All @@ -52,10 +46,7 @@ export type OnScreenProps<
* @param {OnScreenProps} onScreenComponentProps Props.
* @returns Children elements with on-screen wrapper.
*/
export const OnScreen = <
T extends HTMLElement,
AS extends ElementType = ElementType,
>({
export const OnScreen = <T extends HTMLElement, AS extends ElementType = ElementType>({
children,
margin,
threshold,
Expand Down
12 changes: 3 additions & 9 deletions lib/__tests__/OnScreen.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,10 @@ import {
createRenderTest,
} from './testUtils';

const renderComponent: ComponentRenderer = settings => (
const renderComponent: ComponentRenderer = (settings) => (
<OnScreen<HTMLDivElement> {...settings}>
{({ ref, isOnScreen }) => (
<div
ref={ref}
data-testid={`target${isOnScreen ? '-isOnScreen' : ''}`}
/>
<div ref={ref} data-testid={`target${isOnScreen ? '-isOnScreen' : ''}`} />
)}
</OnScreen>
);
Expand All @@ -23,8 +20,5 @@ describe('OnScreen', () => {

it('isOnScreen value changes', createIsOnScreenValueTest(renderComponent));

it(
'Once prop is working as expected',
createOnceParameterTest(renderComponent),
);
it('Once prop is working as expected', createOnceParameterTest(renderComponent));
});
48 changes: 21 additions & 27 deletions lib/__tests__/testUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@ import { UseOnScreenParameters } from '../useOnScreen';
/**
* Renders component.
*/
export type ComponentRenderer = (
settings?: Pick<UseOnScreenParameters, 'once'>,
) => ReactElement;
export type ComponentRenderer = (settings?: Pick<UseOnScreenParameters, 'once'>) => ReactElement;

const targetTestId = 'target';
const targetIsOnScreenTestId = 'target-isOnScreen';
Expand All @@ -32,40 +30,36 @@ export const createRenderTest = (renderComponent: ComponentRenderer) => () => {
* @param renderComponent Renders component.
* @returns Test function.
*/
export const createIsOnScreenValueTest =
(renderComponent: ComponentRenderer) => () => {
const { getByTestId, queryByTestId } = render(renderComponent());
export const createIsOnScreenValueTest = (renderComponent: ComponentRenderer) => () => {
const { getByTestId, queryByTestId } = render(renderComponent());

expect(getByTestId(targetTestId)).toBeInTheDocument();
expect(queryByTestId(targetIsOnScreenTestId)).toBeNull();
expect(getByTestId(targetTestId)).toBeInTheDocument();
expect(queryByTestId(targetIsOnScreenTestId)).toBeNull();

act(() => {
io.enterNode(getByTestId(targetTestId));
});
act(() => {
io.enterNode(getByTestId(targetTestId));
});

expect(queryByTestId(targetIsOnScreenTestId)).toBeInTheDocument();
};
expect(queryByTestId(targetIsOnScreenTestId)).toBeInTheDocument();
};

/**
* Creates test to ensure once parameter is working.
* @param renderComponent Renders component.
* @returns Test function.
*/
export const createOnceParameterTest =
(renderComponent: ComponentRenderer) => () => {
const { queryByTestId, getByTestId } = render(
renderComponent({ once: true }),
);
export const createOnceParameterTest = (renderComponent: ComponentRenderer) => () => {
const { queryByTestId, getByTestId } = render(renderComponent({ once: true }));

act(() => {
io.enterNode(getByTestId(targetTestId));
});
act(() => {
io.enterNode(getByTestId(targetTestId));
});

expect(queryByTestId(targetIsOnScreenTestId)).toBeInTheDocument();
expect(queryByTestId(targetIsOnScreenTestId)).toBeInTheDocument();

act(() => {
io.leaveNode(getByTestId(targetIsOnScreenTestId));
});
act(() => {
io.leaveNode(getByTestId(targetIsOnScreenTestId));
});

expect(getByTestId(targetIsOnScreenTestId)).toBeInTheDocument();
};
expect(getByTestId(targetIsOnScreenTestId)).toBeInTheDocument();
};
16 changes: 3 additions & 13 deletions lib/__tests__/useOnScreen.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,15 @@ const ComponentTemplate = (props: Pick<UseOnScreenParameters, 'once'>) => {
const ref = useRef(null);
const { isOnScreen } = useOnScreen({ ref, ...props });

return (
<div
ref={ref}
data-testid={`target${isOnScreen ? '-isOnScreen' : ''}`}
/>
);
return <div ref={ref} data-testid={`target${isOnScreen ? '-isOnScreen' : ''}`} />;
};

const renderComponent: ComponentRenderer = settings => (
<ComponentTemplate {...settings} />
);
const renderComponent: ComponentRenderer = (settings) => <ComponentTemplate {...settings} />;

describe('useOnScreen', () => {
it('useOnScreen component renders', createRenderTest(renderComponent));

it('isOnScreen value changes', createIsOnScreenValueTest(renderComponent));

it(
'Once prop is working as expected',
createOnceParameterTest(renderComponent),
);
it('Once prop is working as expected', createOnceParameterTest(renderComponent));
});
23 changes: 7 additions & 16 deletions lib/__tests__/withOnScreen.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,13 @@ import {
createRenderTest,
} from './testUtils';

const ComponentTemplate = forwardRef<
HTMLDivElement,
ReturnType<typeof useOnScreen>
>(function ComponentTemplate({ isOnScreen }, ref) {
return (
<div
ref={ref}
data-testid={`target${isOnScreen ? '-isOnScreen' : ''}`}
/>
);
});
const ComponentTemplate = forwardRef<HTMLDivElement, ReturnType<typeof useOnScreen>>(
function ComponentTemplate({ isOnScreen }, ref) {
return <div ref={ref} data-testid={`target${isOnScreen ? '-isOnScreen' : ''}`} />;
},
);

const renderComponent: ComponentRenderer = settings => {
const renderComponent: ComponentRenderer = (settings) => {
const WithOnScreen = withOnScreen(ComponentTemplate, settings);
return <WithOnScreen />;
};
Expand All @@ -30,8 +24,5 @@ describe('withOnScreen', () => {

it('isOnScreen value changes', createIsOnScreenValueTest(renderComponent));

it(
'Once prop is working as expected',
createOnceParameterTest(renderComponent),
);
it('Once prop is working as expected', createOnceParameterTest(renderComponent));
});
4 changes: 2 additions & 2 deletions lib/internal/assignRefs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import { MutableRefObject, Ref } from 'react';
* @param refs Refs to assign.
* @returns Assigned ref.
*/
export const assignRefs = <T extends unknown>(...refs: Ref<T | null>[]) => {
export const assignRefs = <T>(...refs: Ref<T | null>[]) => {
return (node: T | null) => {
refs.forEach(r => {
refs.forEach((r) => {
if (typeof r === 'function') {
r(node);
} else if (r) {
Expand Down
19 changes: 5 additions & 14 deletions lib/withOnScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import { assignRefs } from './internal';
/**
* WithOnScreen wrapped component with injected props.
*/
export type WithOnScreenWrappedComponent<
Props extends Record<string, unknown>,
> = ComponentType<Props & ReturnType<typeof useOnScreen>>;
export type WithOnScreenWrappedComponent<Props extends Record<string, unknown>,> = ComponentType<
Props & ReturnType<typeof useOnScreen>
>;

/**
* High order component that takes a component and injects onScreen props into it.
Expand All @@ -28,24 +28,15 @@ export type WithOnScreenWrappedComponent<
* @param settings Wrapper settings.
* @returns Wrapped component with onScreen props.
*/
export const withOnScreen = <
P extends Record<string, unknown>,
T extends HTMLElement,
>(
export const withOnScreen = <P extends Record<string, unknown>, T extends HTMLElement>(
WrappedComponent: WithOnScreenWrappedComponent<P>,
settings?: Omit<UseOnScreenParameters<T>, 'ref'>,
) => {
const WithOnScreen = (props: P, forwardedRef: ForwardedRef<T>) => {
const ref = useRef<T>(null);
const useOnScreenData = useOnScreen({ ref, ...settings });

return (
<WrappedComponent
ref={assignRefs(ref, forwardedRef)}
{...useOnScreenData}
{...props}
/>
);
return <WrappedComponent ref={assignRefs(ref, forwardedRef)} {...useOnScreenData} {...props} />;
};

hoistNonReactStatics(WithOnScreen, WrappedComponent);
Expand Down
Loading

0 comments on commit 1c90860

Please sign in to comment.