Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add rome linting tools #11

Merged
merged 5 commits into from
Aug 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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