From 30d1f1fcd4be64a492c38e585cd5e045c02e539f Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Sun, 15 Sep 2019 18:29:55 +0700 Subject: [PATCH] Partiall upgrade packages/client --- .eslintrc.yaml | 5 ++ .../client/src/crumbs/CrumbsConnector.tsx | 18 ------ ...ctor.test.tsx => configureCrumbs.test.tsx} | 4 +- .../client/src/crumbs/configureCrumbs.tsx | 14 +++++ packages/client/src/crumbs/index.ts | 2 +- .../src/login/configureRegister.test.tsx | 12 ++-- packages/client/src/login/withForm.tsx | 22 +++---- packages/client/src/redux/Connector.ts | 58 ------------------- packages/client/src/redux/index.ts | 1 - .../{IClientConfig.ts => ClientConfig.ts} | 2 +- .../client/src/renderer/ClientRenderer.tsx | 23 ++++---- packages/client/src/renderer/IRenderer.ts | 12 ---- packages/client/src/renderer/Renderer.ts | 11 ++++ .../client/src/renderer/ServerRenderer.tsx | 8 ++- packages/client/src/renderer/index.ts | 4 +- packages/client/src/renderer/isClientSide.ts | 6 +- packages/client/src/team/TeamEditor.tsx | 14 +++-- packages/client/src/team/TeamList.tsx | 12 ++-- packages/client/src/team/TeamManager.tsx | 14 ++--- packages/client/src/team/TeamReducer.ts | 14 ++--- packages/client/src/team/TeamUserList.tsx | 28 ++++----- .../client/src/team/configureTeam.test.tsx | 11 ++-- packages/client/src/test-utils/TestUtils.tsx | 37 ++++++------ packages/client/types/react-ssr-prepass.d.ts | 2 +- packages/http-client/src/index.ts | 4 +- packages/jsonrpc/src/express.ts | 8 +-- 26 files changed, 147 insertions(+), 199 deletions(-) delete mode 100644 packages/client/src/crumbs/CrumbsConnector.tsx rename packages/client/src/crumbs/{CrumbsConnector.test.tsx => configureCrumbs.test.tsx} (91%) create mode 100644 packages/client/src/crumbs/configureCrumbs.tsx delete mode 100644 packages/client/src/redux/Connector.ts delete mode 100644 packages/client/src/redux/index.ts rename packages/client/src/renderer/{IClientConfig.ts => ClientConfig.ts} (72%) delete mode 100644 packages/client/src/renderer/IRenderer.ts create mode 100644 packages/client/src/renderer/Renderer.ts diff --git a/.eslintrc.yaml b/.eslintrc.yaml index b1b1bee..f8233be 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -29,6 +29,11 @@ rules: delimiter: none singleline: delimiter: comma + '@typescript-eslint/no-unused-vars': + - warn + - vars: all + args: none + ignoreRestSiblings: true '@typescript-eslint/explicit-function-return-type': off '@typescript-eslint/no-non-null-assertion': off '@typescript-eslint/no-use-before-define': off diff --git a/packages/client/src/crumbs/CrumbsConnector.tsx b/packages/client/src/crumbs/CrumbsConnector.tsx deleted file mode 100644 index 81d0521..0000000 --- a/packages/client/src/crumbs/CrumbsConnector.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { TStateSelector } from '@rondo.dev/redux' -import { Connector } from '../redux' -import { Crumb } from './Crumb' -import { CrumbsActions } from './CrumbsActions' -import { ICrumbsState } from './CrumbsReducer' - -export class CrumbsConnector extends Connector { - protected readonly breadcrumbsActions = new CrumbsActions() - - connect(getLocalState: TStateSelector) { - return this.wrap( - getLocalState, - state => state, - dispatch => ({}), - Crumb, - ) - } -} diff --git a/packages/client/src/crumbs/CrumbsConnector.test.tsx b/packages/client/src/crumbs/configureCrumbs.test.tsx similarity index 91% rename from packages/client/src/crumbs/CrumbsConnector.test.tsx rename to packages/client/src/crumbs/configureCrumbs.test.tsx index 130a12a..5e28c13 100644 --- a/packages/client/src/crumbs/CrumbsConnector.test.tsx +++ b/packages/client/src/crumbs/configureCrumbs.test.tsx @@ -5,7 +5,7 @@ import {TestUtils} from '../test-utils' const t = new TestUtils() -describe('CrumbsConnector', () => { +describe('configrueCrumbs', () => { const createTestCase = () => t.withProvider({ reducers: {Crumbs: Feature.Crumbs}, @@ -23,7 +23,7 @@ describe('CrumbsConnector', () => { current: 'Three', }, }) - .withComponent(select => new Feature.CrumbsConnector().connect(select)) + .withComponent(select => Feature.configureCrumbs(select)) .withJSX(Component => ) describe('render', () => { diff --git a/packages/client/src/crumbs/configureCrumbs.tsx b/packages/client/src/crumbs/configureCrumbs.tsx new file mode 100644 index 0000000..f004f38 --- /dev/null +++ b/packages/client/src/crumbs/configureCrumbs.tsx @@ -0,0 +1,14 @@ +import { pack, TStateSelector } from '@rondo.dev/redux' +import { Crumb } from './Crumb' +import { ICrumbsState } from './CrumbsReducer' + +export function configureCrumbs( + getLocalState: TStateSelector, +) { + return pack( + getLocalState, + state => state, + dispatch => ({}), + Crumb, + ) +} diff --git a/packages/client/src/crumbs/index.ts b/packages/client/src/crumbs/index.ts index 9fd8a9b..9060196 100644 --- a/packages/client/src/crumbs/index.ts +++ b/packages/client/src/crumbs/index.ts @@ -1,6 +1,6 @@ +export * from './configureCrumbs' export * from './Crumb' export * from './CrumbsActions' -export * from './CrumbsConnector' export * from './CrumbsReducer' export * from './HistoryCrumbs' export * from './ICrumbLink' diff --git a/packages/client/src/login/configureRegister.test.tsx b/packages/client/src/login/configureRegister.test.tsx index d925bc3..9bdac59 100644 --- a/packages/client/src/login/configureRegister.test.tsx +++ b/packages/client/src/login/configureRegister.test.tsx @@ -1,11 +1,10 @@ -import { IAPIDef } from '@rondo.dev/common' +import { APIDef } from '@rondo.dev/common' import { HTTPClientMock } from '@rondo.dev/http-client' import { getError } from '@rondo.dev/test-utils' import React from 'react' -import ReactDOM from 'react-dom' import T from 'react-dom/test-utils' import { MemoryRouter } from 'react-router-dom' -import { TestUtils } from '../test-utils' +import { TestUtils, TestContainer } from '../test-utils' import * as Feature from './' import { configureRegister } from './configureRegister' @@ -13,7 +12,7 @@ const test = new TestUtils() describe('configureRegister', () => { - const http = new HTTPClientMock() + const http = new HTTPClientMock() const loginActions = new Feature.LoginActions(http) const createTestProvider = () => test.withProvider({ @@ -45,7 +44,7 @@ describe('configureRegister', () => { } const onSuccess = jest.fn() let node: Element - let component: React.Component + let component: TestContainer beforeEach(() => { http.mockAdd({ method: 'post', @@ -85,8 +84,7 @@ describe('configureRegister', () => { .value, ) .toEqual('') - node = ReactDOM.findDOMNode(component) as Element - expect(node.innerHTML).toMatch(//) + expect(component.ref.current!.innerHTML).toMatch(//) }) it('sets the error message on failure', async () => { diff --git a/packages/client/src/login/withForm.tsx b/packages/client/src/login/withForm.tsx index 6d459ae..5213a3a 100644 --- a/packages/client/src/login/withForm.tsx +++ b/packages/client/src/login/withForm.tsx @@ -1,7 +1,7 @@ import React from 'react' -import {IPendingAction} from '@rondo.dev/redux' +import {PendingAction} from '@rondo.dev/redux' -export interface IComponentProps { +export interface ComponentProps { onSubmit: () => void onChange: (name: string, value: string) => void // TODO clear data on successful submission. This is important to prevent @@ -9,29 +9,29 @@ export interface IComponentProps { data: Data } -export interface IFormHOCProps { - onSubmit: (props: Data) => IPendingAction +export interface FormHOCProps { + onSubmit: (props: Data) => PendingAction // TODO figure out what would happen if the underlying child component // would have the same required property as the HOC, like onSuccess? onSuccess?: () => void clearOnSuccess?: boolean } -export interface IFormHOCState { +export interface FormHOCState { error: string data: Data } -export function withForm>( +export function withForm>( Component: React.ComponentType, initialState: Data, ) { type OtherProps = Pick>> - type T = IFormHOCProps & OtherProps + Exclude>> + type T = FormHOCProps & OtherProps - return class FormHOC extends React.PureComponent> { + return class FormHOC extends React.PureComponent> { constructor(props: T) { super(props) this.state = { @@ -78,7 +78,9 @@ export function withForm>( // https://github.com/Microsoft/TypeScript/issues/28938 return ( { - - /** - * Connects a component using redux. The `selectState` method is used to - * select a subset of state to map to the component. - * - * It returns a component with `any` props. Ideally this could be changed to - * required props. - * - * https://stackoverflow.com/questions/54277411 - */ - abstract connect( - selectState: TStateSelector, - ): ComponentType - - protected wrap< - State, - Props, - StateProps extends Partial, - DispatchProps extends Partial, - >( - getLocalState: TStateSelector, - mapStateToProps: (state: LocalState) => StateProps, - mapDispatchToProps: (dispatch: Dispatch) => DispatchProps, - Component: React.ComponentType, - ): ComponentType< - Omit - > { - - return connect( - (state: State) => { - const l = getLocalState(state) - return mapStateToProps(l) - }, - mapDispatchToProps, - )(Component as any) as any - } -} diff --git a/packages/client/src/redux/index.ts b/packages/client/src/redux/index.ts deleted file mode 100644 index 0da848f..0000000 --- a/packages/client/src/redux/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './Connector' diff --git a/packages/client/src/renderer/IClientConfig.ts b/packages/client/src/renderer/ClientConfig.ts similarity index 72% rename from packages/client/src/renderer/IClientConfig.ts rename to packages/client/src/renderer/ClientConfig.ts index 716a83a..ae990c0 100644 --- a/packages/client/src/renderer/IClientConfig.ts +++ b/packages/client/src/renderer/ClientConfig.ts @@ -1,4 +1,4 @@ -export interface IClientConfig { +export interface ClientConfig { readonly appName: string readonly baseUrl: string readonly csrfToken: string diff --git a/packages/client/src/renderer/ClientRenderer.tsx b/packages/client/src/renderer/ClientRenderer.tsx index b294642..6c563f6 100644 --- a/packages/client/src/renderer/ClientRenderer.tsx +++ b/packages/client/src/renderer/ClientRenderer.tsx @@ -1,30 +1,27 @@ +import { createBrowserHistory } from 'history' import React from 'react' import ReactDOM from 'react-dom' -import {Action} from 'redux' -import {IAPIDef} from '@rondo.dev/common' -import {IClientConfig} from './IClientConfig' -import {IHTTPClient, HTTPClient} from '@rondo.dev/http-client' -import {IRenderer} from './IRenderer' -import {Provider} from 'react-redux' -import {Router} from 'react-router-dom' -import {Store} from 'redux' -import {createBrowserHistory} from 'history' +import { Provider } from 'react-redux' +import { Router } from 'react-router-dom' +import { Store } from 'redux' +import { ClientConfig } from './ClientConfig' +import { Renderer } from './Renderer' -export interface IClientRendererParams { +export interface ClientRendererParams { readonly RootComponent: React.ComponentType readonly target?: HTMLElement readonly hydrate: boolean // TODO make this better } export class ClientRenderer - implements IRenderer { - constructor(readonly params: IClientRendererParams) {} + implements Renderer { + constructor(readonly params: ClientRendererParams) {} render( url: string, store: Store, props: Props, - config: IClientConfig, + config: ClientConfig, ) { const { RootComponent, diff --git a/packages/client/src/renderer/IRenderer.ts b/packages/client/src/renderer/IRenderer.ts deleted file mode 100644 index 8afe80d..0000000 --- a/packages/client/src/renderer/IRenderer.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {IAPIDef} from '@rondo.dev/common' -import {IClientConfig} from './IClientConfig' -import {Store} from 'redux' - -export interface IRenderer { - render( - url: string, - store: Store, - props: Props, - config: IClientConfig, - ): any -} diff --git a/packages/client/src/renderer/Renderer.ts b/packages/client/src/renderer/Renderer.ts new file mode 100644 index 0000000..43e2953 --- /dev/null +++ b/packages/client/src/renderer/Renderer.ts @@ -0,0 +1,11 @@ +import { Store } from 'redux' +import { ClientConfig } from './ClientConfig' + +export interface Renderer { + render( + url: string, + store: Store, + props: Props, + config: ClientConfig, + ): unknown +} diff --git a/packages/client/src/renderer/ServerRenderer.tsx b/packages/client/src/renderer/ServerRenderer.tsx index 20054f6..db8d203 100644 --- a/packages/client/src/renderer/ServerRenderer.tsx +++ b/packages/client/src/renderer/ServerRenderer.tsx @@ -8,6 +8,10 @@ import { Store } from 'redux' import { IClientConfig } from './IClientConfig' import { IRenderer } from './IRenderer' +interface ComponentWithFetchData { + fetchData(): Promise +} + export class ServerRenderer implements IRenderer { constructor( readonly RootComponent: React.ComponentType, @@ -17,7 +21,7 @@ export class ServerRenderer implements IRenderer { store: Store, props: Props, config: IClientConfig, - host: string = '', + host = '', headers: Record = {}, ) { const {RootComponent} = this @@ -39,7 +43,7 @@ export class ServerRenderer implements IRenderer { await ssrPrepass(element, async (el, component) => { if (component && 'fetchData' in component) { - await (component as any).fetchData() + await (component as ComponentWithFetchData).fetchData() } }) const stream = renderToNodeStream(element) diff --git a/packages/client/src/renderer/index.ts b/packages/client/src/renderer/index.ts index 51f9bc3..dbd21ac 100644 --- a/packages/client/src/renderer/index.ts +++ b/packages/client/src/renderer/index.ts @@ -1,4 +1,4 @@ export * from './ClientRenderer' -export * from './IClientConfig' -export * from './IRenderer' +export * from './ClientConfig' +export * from './Renderer' export * from './isClientSide' diff --git a/packages/client/src/renderer/isClientSide.ts b/packages/client/src/renderer/isClientSide.ts index ad83dcb..1aab2a8 100644 --- a/packages/client/src/renderer/isClientSide.ts +++ b/packages/client/src/renderer/isClientSide.ts @@ -1,6 +1,10 @@ +interface MockServerSide { + __MOCK_SERVER_SIDE__?: boolean +} + export function isClientSide() { return typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement === 'function' && - typeof (window as any).__MOCK_SERVER_SIDE__ === 'undefined' + typeof (window as MockServerSide).__MOCK_SERVER_SIDE__ === 'undefined' } diff --git a/packages/client/src/team/TeamEditor.tsx b/packages/client/src/team/TeamEditor.tsx index 12ae009..e6b0af1 100644 --- a/packages/client/src/team/TeamEditor.tsx +++ b/packages/client/src/team/TeamEditor.tsx @@ -3,23 +3,27 @@ import React from 'react' import { FaCheck, FaEdit, FaPlusSquare } from 'react-icons/fa' import { TeamActions, Team } from '@rondo.dev/common' -export type TTeamEditorProps = { +interface AddTeamProps { type: 'add' onAddTeam: TeamActions['create'] -} | { +} + +interface UpdateTeamProps { type: 'update' onUpdateTeam: TeamActions['update'] team: Team } -export interface ITeamEditorState { +export type TTeamEditorProps = AddTeamProps | UpdateTeamProps + +export interface TeamEditorState { // TODO use redux state for errors! error: string name: string } export class TeamEditor -extends React.PureComponent { +extends React.PureComponent { constructor(props: TTeamEditorProps) { super(props) this.state = { @@ -33,7 +37,7 @@ extends React.PureComponent { componentWillReceiveProps(nextProps: TTeamEditorProps) { if (nextProps.type === 'update') { const {team} = nextProps - if (team !== (this.props as any).team) { + if (team !== (this.props as UpdateTeamProps).team) { this.setState({ name: this.getName(team), }) diff --git a/packages/client/src/team/TeamList.tsx b/packages/client/src/team/TeamList.tsx index ff5576c..818673b 100644 --- a/packages/client/src/team/TeamList.tsx +++ b/packages/client/src/team/TeamList.tsx @@ -1,24 +1,24 @@ -import { TReadonlyRecord, Team, TeamActions } from '@rondo.dev/common' +import { ReadonlyRecord, Team, TeamActions } from '@rondo.dev/common' import { Button, Panel, PanelBlock, PanelHeading } from 'bloomer' import React from 'react' import { FaEdit, FaPlus, FaTimes } from 'react-icons/fa' import { Link } from 'react-router-dom' -export interface ITeamListProps { +export interface TeamListProps { ListButtons?: React.ComponentType<{team: Team}> - teamsById: TReadonlyRecord + teamsById: ReadonlyRecord teamIds: ReadonlyArray onAddTeam: TeamActions['create'] onRemoveTeam: TeamActions['remove'] } -export interface ITeamProps { +export interface TeamProps { ListButtons?: React.ComponentType<{team: Team}> team: Team onRemoveTeam: TeamActions['remove'] } -export class TeamRow extends React.PureComponent { +export class TeamRow extends React.PureComponent { handleRemove = async () => { const {onRemoveTeam, team: {id}} = this.props await onRemoveTeam({id}).payload @@ -53,7 +53,7 @@ export class TeamRow extends React.PureComponent { } } -export class TeamList extends React.PureComponent { +export class TeamList extends React.PureComponent { render() { const {teamIds, teamsById} = this.props diff --git a/packages/client/src/team/TeamManager.tsx b/packages/client/src/team/TeamManager.tsx index 19146e7..9d7440c 100644 --- a/packages/client/src/team/TeamManager.tsx +++ b/packages/client/src/team/TeamManager.tsx @@ -1,4 +1,4 @@ -import { IUserInTeam, TReadonlyRecord, TeamActions, UserActions, Team } from '@rondo.dev/common' +import { UserInTeam, ReadonlyRecord, TeamActions, UserActions, Team } from '@rondo.dev/common' import { Panel, PanelBlock, PanelHeading } from 'bloomer' import { History, Location } from 'history' import React from 'react' @@ -8,24 +8,24 @@ import { TeamEditor } from './TeamEditor' import { TeamList } from './TeamList' import { TeamUserList } from './TeamUserList' -export interface ITeamManagerProps { +export interface TeamManagerProps { history: History location: Location - match: Match + match: Match // eslint-disable-line ListButtons?: React.ComponentType<{team: Team}> teamActions: TeamActions findUserByEmail: UserActions['findUserByEmail'] - teamsById: TReadonlyRecord + teamsById: ReadonlyRecord teamIds: ReadonlyArray - userKeysByTeamId: TReadonlyRecord> - usersByKey: TReadonlyRecord + userKeysByTeamId: ReadonlyRecord> + usersByKey: ReadonlyRecord } -export class TeamManager extends React.PureComponent { +export class TeamManager extends React.PureComponent { async componentDidMount() { await this.props.teamActions.find() } diff --git a/packages/client/src/team/TeamReducer.ts b/packages/client/src/team/TeamReducer.ts index ffc5373..20c1ce6 100644 --- a/packages/client/src/team/TeamReducer.ts +++ b/packages/client/src/team/TeamReducer.ts @@ -1,18 +1,18 @@ -import { indexBy, Team as _Team, IUserInTeam, TReadonlyRecord, without, TeamActions } from '@rondo.dev/common' +import { indexBy, Team as _Team, UserInTeam, ReadonlyRecord, without, TeamActions } from '@rondo.dev/common' import { createReducer } from '@rondo.dev/jsonrpc' -export interface ITeamState { +export interface TeamState { readonly loading: number readonly error: string readonly teamIds: ReadonlyArray - readonly teamsById: TReadonlyRecord + readonly teamsById: ReadonlyRecord - readonly userKeysByTeamId: TReadonlyRecord> - readonly usersByKey: TReadonlyRecord + readonly userKeysByTeamId: ReadonlyRecord> + readonly usersByKey: ReadonlyRecord } -const defaultState: ITeamState = { +const defaultState: TeamState = { loading: 0, error: '', @@ -104,7 +104,7 @@ export const Team = createReducer('teamService', defaultState) .reduce((obj, userInTeam) => { obj[getUserKey(userInTeam)] = userInTeam return obj - }, {} as Record) + }, {} as Record) return { userKeysByTeamId: { diff --git a/packages/client/src/team/TeamUserList.tsx b/packages/client/src/team/TeamUserList.tsx index 467259f..0849c79 100644 --- a/packages/client/src/team/TeamUserList.tsx +++ b/packages/client/src/team/TeamUserList.tsx @@ -1,11 +1,11 @@ -import { IUser, IUserInTeam, TReadonlyRecord, TeamActions, UserActions, Team } from '@rondo.dev/common' +import { User, UserInTeam, ReadonlyRecord, TeamActions, UserActions, Team } from '@rondo.dev/common' import { Button, Control, Heading, Help, Input, Panel, PanelBlock, PanelHeading } from 'bloomer' import React from 'react' import { FaCheck, FaTimes, FaUser } from 'react-icons/fa' const EMPTY_ARRAY: ReadonlyArray = [] -export interface ITeamUsersProps { +export interface TeamUsersProps { // fetchMyTeams: () => void, fetchUsersInTeam: TeamActions['findUsers'] findUserByEmail: UserActions['findUserByEmail'] @@ -14,29 +14,29 @@ export interface ITeamUsersProps { onRemoveUser: TeamActions['removeUser'] team: Team - userKeysByTeamId: TReadonlyRecord> - usersByKey: TReadonlyRecord + userKeysByTeamId: ReadonlyRecord> + usersByKey: ReadonlyRecord } -export interface ITeamUserProps { +export interface TeamUserProps { onRemoveUser: ( params: {userId: number, teamId: number, roleId: number}) => void - user: IUserInTeam + user: UserInTeam } -export interface IAddUserProps { +export interface AddUserProps { onAddUser: TeamActions['addUser'] onSearchUser: UserActions['findUserByEmail'] teamId: number } -export interface IAddUserState { +export interface AddUserState { error: string email: string - user?: IUser + user?: User } -export class TeamUser extends React.PureComponent { +export class TeamUser extends React.PureComponent { handleRemoveUser = async () => { const {onRemoveUser, user} = this.props await onRemoveUser({...user, roleId: 1}) @@ -65,8 +65,8 @@ export class TeamUser extends React.PureComponent { } } -export class AddUser extends React.PureComponent { - constructor(props: IAddUserProps) { +export class AddUser extends React.PureComponent { + constructor(props: AddUserProps) { super(props) this.state = { error: '', @@ -131,10 +131,10 @@ export class AddUser extends React.PureComponent { } } -export class TeamUserList extends React.PureComponent { +export class TeamUserList extends React.PureComponent { async componentDidMount() { await this.fetchUsersInTeam(this.props.team.id) - } async componentWillReceiveProps(nextProps: ITeamUsersProps) { + } async componentWillReceiveProps(nextProps: TeamUsersProps) { const {team} = nextProps if (team.id !== this.props.team.id) { this.fetchUsersInTeam(team.id) diff --git a/packages/client/src/team/configureTeam.test.tsx b/packages/client/src/team/configureTeam.test.tsx index 0826358..4c53475 100644 --- a/packages/client/src/team/configureTeam.test.tsx +++ b/packages/client/src/team/configureTeam.test.tsx @@ -1,4 +1,4 @@ -import { ITeamService, ITeamUsers, IUserService, Team, TeamActions, TeamServiceMethods, UserActions, UserServiceMethods } from '@rondo.dev/common' +import { TeamService, TeamUsers, UserService, Team, TeamActions, TeamServiceMethods, UserActions, UserServiceMethods } from '@rondo.dev/common' import { createActions } from '@rondo.dev/jsonrpc' import createClientMock from '@rondo.dev/jsonrpc/lib/createClientMock' import { getError } from '@rondo.dev/test-utils' @@ -17,9 +17,9 @@ describe('TeamConnector', () => { } const [teamClient, teamClientMock] = - createClientMock(TeamServiceMethods) - const [userClient, userClientMock] = - createClientMock(UserServiceMethods) + createClientMock(TeamServiceMethods) + const [userClient] = + createClientMock(UserServiceMethods) let teamActions!: TeamActions let userActions!: UserActions beforeEach(() => { @@ -57,7 +57,7 @@ describe('TeamConnector', () => { userTeams: [], }] - const users: ITeamUsers = { + const users: TeamUsers = { teamId: 123, usersInTeam: [{ teamId: 123, @@ -111,7 +111,6 @@ describe('TeamConnector', () => { }) it('displays an error', async () => { - const error = {error: 'An error'} teamClientMock.create.mockRejectedValue(new Error('Test Error')) const {render} = createTestProvider() const {node, waitForActions} = render({ diff --git a/packages/client/src/test-utils/TestUtils.tsx b/packages/client/src/test-utils/TestUtils.tsx index 85b9151..26b9b50 100644 --- a/packages/client/src/test-utils/TestUtils.tsx +++ b/packages/client/src/test-utils/TestUtils.tsx @@ -1,6 +1,6 @@ +/* eslint @typescript-eslint/no-explicit-any: 0 */ import React from 'react' import ReactDOM from 'react-dom' -import T from 'react-dom/test-utils' import {createStore, TStateSelector, WaitMiddleware} from '@rondo.dev/redux' import {Provider} from 'react-redux' import { @@ -10,20 +10,18 @@ import { Reducer, ReducersMapObject, combineReducers, - Store as ReduxStore, - Unsubscribe, } from 'redux' -import { format } from 'util' -interface IRenderParams { +interface RenderParams { reducers: ReducersMapObject select: TStateSelector - // getComponent: ( - // select: TStateSelector) => React.ComponentType, - // customJSX?: ( - // Component: React.ComponentType, - // props: Props, - // ) => JSX.Element +} + +export class TestContainer extends React.Component<{}> { + ref = React.createRef() + render() { + return
{this.props.children}
+ } } export class TestUtils { @@ -34,9 +32,10 @@ export class TestUtils { render(jsx: JSX.Element) { const $div = document.createElement('div') + ReactDOM.render({jsx}, $div) const component = ReactDOM.render( -
{jsx}
, $div) as unknown as React.Component - const node = (ReactDOM.findDOMNode(component) as Element).children[0] +
{jsx}
, $div) as unknown as TestContainer + const node = component.ref.current! return { component, node, @@ -55,7 +54,7 @@ export class TestUtils { * method to render the connected component with a `Provider`. */ withProvider = AnyAction>( - params: IRenderParams, + params: RenderParams, ) { const {reducers, select} = params @@ -102,7 +101,7 @@ export class TestUtils { return { ...result, async waitForActions(timeout = 2000) { - await waitMiddleware.waitForRecorded(recorder) + await waitMiddleware.waitForRecorded(recorder, timeout) }, } } @@ -112,7 +111,7 @@ export class TestUtils { return self } - const self: ISelf< + const self: Self< Props, typeof store, typeof Component, CreateJSX > = { render, @@ -128,14 +127,14 @@ export class TestUtils { } } -interface ISelf { +interface Self { render: (props: Props) => { - component: React.Component + component: TestContainer node: Element waitForActions(timeout?: number): Promise } store: Store Component: Component withJSX: (localCreateJSX: CreateJSX) - => ISelf + => Self } diff --git a/packages/client/types/react-ssr-prepass.d.ts b/packages/client/types/react-ssr-prepass.d.ts index a171530..3cc8600 100644 --- a/packages/client/types/react-ssr-prepass.d.ts +++ b/packages/client/types/react-ssr-prepass.d.ts @@ -4,7 +4,7 @@ declare module 'react-ssr-prepass' { export type Visitor = ( element: ReactElement, instance?: Component, - ) => void | Promise + ) => void | Promise function ssrPrepass(node: ReactElement, visitor?: Visitor): Promise diff --git a/packages/http-client/src/index.ts b/packages/http-client/src/index.ts index 507dcc8..53b9684 100644 --- a/packages/http-client/src/index.ts +++ b/packages/http-client/src/index.ts @@ -1,10 +1,10 @@ -export * from './HTTPClient' -export * from './HTTPClientMock' export * from './Headers' export * from './HTTPClient' +export * from './HTTPClientMock' export * from './Request' export * from './RequestParams' export * from './RequestQuery' export * from './Response' +export * from './SimpleHTTPClient' export * from './TypedRequestParams' export * from './URLFormatter' diff --git a/packages/jsonrpc/src/express.ts b/packages/jsonrpc/src/express.ts index 7408ad4..3231e31 100644 --- a/packages/jsonrpc/src/express.ts +++ b/packages/jsonrpc/src/express.ts @@ -2,7 +2,7 @@ import { Logger } from '@rondo.dev/logger' import express, { ErrorRequestHandler, Request, Response, Router } from 'express' import { createError, ErrorResponse, isRPCError } from './error' import { IDEMPOTENT_METHOD_REGEX } from './idempotent' -import { createRpcService, ERROR_METHOD_NOT_FOUND, ERROR_SERVER, IRequest, SuccessResponse } from './jsonrpc' +import { createRpcService, ERROR_METHOD_NOT_FOUND, ERROR_SERVER, Request as RPCRequest, SuccessResponse } from './jsonrpc' import { FunctionPropertyNames } from './types' export type TGetContext = (req: Request) => Promise | Context @@ -16,13 +16,13 @@ export interface RPCReturnType { router(): Router } -export interface InvocationDetails
{ +export interface InvocationDetails { context: Context path: string request: A } -async function defaultHook( +async function defaultHook( details: InvocationDetails, invoke: () => Promise, ): Promise { @@ -33,7 +33,7 @@ async function defaultHook( export function jsonrpc( getContext: TGetContext, logger: Logger, - hook: ( + hook: ( details: InvocationDetails, invoke: (request?: A) => Promise) => Promise = defaultHook, idempotentMethodRegex = IDEMPOTENT_METHOD_REGEX,