From 50d36f268f25c0525c1e83b0302cae7290c3bc17 Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Sun, 15 Sep 2019 17:14:31 +0700 Subject: [PATCH] Fix linting errors in packages/jsonrpc --- .eslintrc.yaml | 4 ++ packages/jsonrpc/.eslintrc.yaml | 8 +++ packages/jsonrpc/src/bulk.test.ts | 18 +++---- packages/jsonrpc/src/bulk.ts | 5 +- packages/jsonrpc/src/createClientMock.test.ts | 4 +- packages/jsonrpc/src/createClientMock.ts | 6 +-- packages/jsonrpc/src/ensure.test.ts | 8 +-- packages/jsonrpc/src/ensure.ts | 10 ++-- packages/jsonrpc/src/error.ts | 28 +++++----- packages/jsonrpc/src/express.test.ts | 34 ++++++------ packages/jsonrpc/src/express.ts | 39 ++++++-------- packages/jsonrpc/src/jsonrpc.ts | 27 +++++----- packages/jsonrpc/src/local.test.ts | 18 +++---- packages/jsonrpc/src/local.ts | 6 +-- packages/jsonrpc/src/redux.test.ts | 52 +++++++++---------- packages/jsonrpc/src/redux.ts | 13 ++--- packages/jsonrpc/src/remote.test.ts | 21 ++++---- packages/jsonrpc/src/remote.ts | 2 +- packages/jsonrpc/src/test-utils.ts | 4 +- packages/jsonrpc/src/types.ts | 52 +++++++++---------- .../redux/src/actions/createPendingAction.ts | 2 +- 21 files changed, 184 insertions(+), 177 deletions(-) create mode 100644 packages/jsonrpc/.eslintrc.yaml diff --git a/.eslintrc.yaml b/.eslintrc.yaml index b23064f..daf1b7e 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -11,6 +11,10 @@ rules: - warn - code: 80 ignorePattern: '^import .* from ' + comma-dangle: + - warn + - always-multiline + # semi: # - warn # - never diff --git a/packages/jsonrpc/.eslintrc.yaml b/packages/jsonrpc/.eslintrc.yaml new file mode 100644 index 0000000..780a2b2 --- /dev/null +++ b/packages/jsonrpc/.eslintrc.yaml @@ -0,0 +1,8 @@ +extends: + - ../../.eslintrc.yaml +rules: + # due to the nature of this project, writing code becomes much easier + # when any can be used in some places + '@typescript-eslint/no-explicit-any': off + prefer-rest-params: off + prefer-spread: off diff --git a/packages/jsonrpc/src/bulk.test.ts b/packages/jsonrpc/src/bulk.test.ts index 81a8727..be8ff8a 100644 --- a/packages/jsonrpc/src/bulk.test.ts +++ b/packages/jsonrpc/src/bulk.test.ts @@ -8,30 +8,30 @@ import {json} from 'body-parser' describe('util', () => { - interface IS1 { + interface S1 { add(a: number, b: number): number } - interface IS2 { + interface S2 { mul(a: number, b: number): number concat(...str: string[]): string } - interface IContext { + interface Context { userId: number } - class Service1 implements WithContext { - add(cx: IContext, a: number, b: number) { + class Service1 implements WithContext { + add(cx: Context, a: number, b: number) { return a + b + cx.userId } } - class Service2 implements WithContext { - mul(cx: IContext, a: number, b: number) { + class Service2 implements WithContext { + mul(cx: Context, a: number, b: number) { return a * b + cx.userId } - concat(cx: IContext, ...str: string[]) { + concat(cx: Context, ...str: string[]) { return str.join('') + cx.userId } } @@ -98,7 +98,7 @@ describe('util', () => { services, ) const app = createApp(router) - const client = createClient(app, '/rpc/s1') + const client = createClient(app, '/rpc/s1') const result: number = await client.add(1, 3) expect(result).toBe(14) }) diff --git a/packages/jsonrpc/src/bulk.ts b/packages/jsonrpc/src/bulk.ts index 389794d..f097e1f 100644 --- a/packages/jsonrpc/src/bulk.ts +++ b/packages/jsonrpc/src/bulk.ts @@ -1,4 +1,5 @@ -import {IJSONRPCReturnType} from './express' +/* eslint @typescript-eslint/no-explicit-any: off */ +import {RPCReturnType} from './express' import {WithContext, RPCClient, RPCActions} from './types' import {createActions} from './redux' import {createLocalClient, LocalClient} from './local' @@ -39,7 +40,7 @@ export function bulkCreateActions>>( } export function bulkjsonrpc( - jsonrpc: IJSONRPCReturnType, + jsonrpc: RPCReturnType, services: T, ) { keys(services).forEach(key => { diff --git a/packages/jsonrpc/src/createClientMock.test.ts b/packages/jsonrpc/src/createClientMock.test.ts index cafdb1d..af5c4c4 100644 --- a/packages/jsonrpc/src/createClientMock.test.ts +++ b/packages/jsonrpc/src/createClientMock.test.ts @@ -2,13 +2,13 @@ import createClientMock from './createClientMock' describe('createClientMock', () => { - interface IService { + interface Service { add(a: number, b: number): number concat(a: string, b: string): string } it('creates a mock for all methods', async () => { - const [client, mock] = createClientMock(['add', 'concat']) + const [client, mock] = createClientMock(['add', 'concat']) mock.add.mockReturnValue(Promise.resolve(3)) mock.concat.mockImplementation((a, b) => Promise.resolve(a + b)) expect(await client.add(4, 5)).toBe(3) diff --git a/packages/jsonrpc/src/createClientMock.ts b/packages/jsonrpc/src/createClientMock.ts index 57d23a0..59dc094 100644 --- a/packages/jsonrpc/src/createClientMock.ts +++ b/packages/jsonrpc/src/createClientMock.ts @@ -1,6 +1,6 @@ import { FunctionPropertyNames, RPCClient } from './types' -export type TMocked = { +export type RPCClientMock = { [K in keyof T]: T[K] extends (...args: infer A) => infer R ? jest.Mock @@ -20,7 +20,7 @@ export type TMocked = { */ export default function createClientMock( methods: Array>, -): [RPCClient, TMocked>] { +): [RPCClient, RPCClientMock>] { const client = methods .reduce((obj, prop) => { obj[prop] = jest.fn() @@ -29,6 +29,6 @@ export default function createClientMock( return [ client as RPCClient, - client as TMocked>, + client as RPCClientMock>, ] } diff --git a/packages/jsonrpc/src/ensure.test.ts b/packages/jsonrpc/src/ensure.test.ts index 291da31..a3869df 100644 --- a/packages/jsonrpc/src/ensure.test.ts +++ b/packages/jsonrpc/src/ensure.test.ts @@ -7,15 +7,15 @@ import { describe('ensure', () => { - interface IContext { + interface Context { userId: number } - const validate: Validate = c => c.userId > 0 + const validate: Validate = c => c.userId > 0 it('decorates class methods', () => { class Service { - @ensure(validate) + @ensure(validate) fetchData() { return 1 } @@ -32,7 +32,7 @@ describe('ensure', () => { it('works with properties/instance method definitions', () => { class Service { - @ensure(validate) + @ensure(validate) fetchData = () => 1 } const s = new Service() diff --git a/packages/jsonrpc/src/ensure.ts b/packages/jsonrpc/src/ensure.ts index 1f6a4dc..da35798 100644 --- a/packages/jsonrpc/src/ensure.ts +++ b/packages/jsonrpc/src/ensure.ts @@ -1,3 +1,4 @@ +/* eslint @typescript-eslint/no-unused-vars: 0 */ import 'reflect-metadata' export const ensureKey = Symbol('ensure') @@ -7,10 +8,11 @@ export type Validate = (context: Context) => boolean | Promise export function ensure( validate: Validate, - message: string = 'Validation failed', + message = 'Validation failed', ) { return function ensureImpl( - target: any, key?: string, descriptor?: PropertyDescriptor) { + target: any, key?: string, descriptor?: PropertyDescriptor, + ) { switch (arguments.length) { case 1: return ensureClass(validate, message).apply(null, arguments as any) @@ -25,7 +27,7 @@ export function ensure( function ensureClass( validate: Validate, - message: string = 'Validation failed', + message = 'Validation failed', ) { // tslint:disable-next-line return (target: any) => { @@ -40,7 +42,7 @@ function ensureClass( function ensureMethod( validate: Validate, - message: string = 'Validation failed', + message = 'Validation failed', ) { return ( target: any, diff --git a/packages/jsonrpc/src/error.ts b/packages/jsonrpc/src/error.ts index 98812a6..0073056 100644 --- a/packages/jsonrpc/src/error.ts +++ b/packages/jsonrpc/src/error.ts @@ -1,44 +1,44 @@ -export interface IError { +export interface ErrorWithCode { code: number message: string } -export interface IErrorWithData extends IError { +export interface ErrorWithData extends ErrorWithCode { data: T } -export interface IErrorResponse { +export interface ErrorResponse { jsonrpc: '2.0' id: string | number | null result: null - error: IErrorWithData + error: ErrorWithData } -export interface IJSONRPCError extends Error { +export interface RPCError extends Error { code: number statusCode: number - response: IErrorResponse + response: ErrorResponse } -export function isJSONRPCError(err: any): err is IJSONRPCError { - return err.name === 'IJSONRPCError' && +export function isRPCError(err: any): err is RPCError { + return err.name === 'RPCError' && typeof err.message === 'string' && - err.hasOwnProperty('code') && - err.hasOwnProperty('response') + Object.prototype.hasOwnProperty.call(err, 'code') && + Object.prototype.hasOwnProperty.call(err, 'response') } export function createError( - error: IError, + error: ErrorWithCode, info: { id: number | string | null data: T statusCode: number }, -): IJSONRPCError { +): RPCError { - const err = new Error(error.message) as IJSONRPCError + const err = new Error(error.message) as RPCError - err.name = 'IJSONRPCError' + err.name = 'RPCError' err.code = error.code err.statusCode = info.statusCode err.response = { diff --git a/packages/jsonrpc/src/express.test.ts b/packages/jsonrpc/src/express.test.ts index 7495ec2..9fe2381 100644 --- a/packages/jsonrpc/src/express.test.ts +++ b/packages/jsonrpc/src/express.test.ts @@ -1,7 +1,7 @@ import bodyParser from 'body-parser' import express from 'express' import request from 'supertest' -import {IRequest} from './jsonrpc' +import {Request} from './jsonrpc' import {createClient} from './supertest' import {ensure} from './ensure' import {jsonrpc} from './express' @@ -10,11 +10,11 @@ import {WithContext} from './types' describe('jsonrpc', () => { - interface IContext { + interface Context { userId: number } - interface IService { + interface Service { add(a: number, b: number): number delay(): Promise syncError(message: string): void @@ -25,11 +25,11 @@ describe('jsonrpc', () => { addWithContext2(a: number, b: number): Promise } - const ensureLoggedIn = ensure(c => !!c.userId) + const ensureLoggedIn = ensure(c => !!c.userId) - class Service implements WithContext { + class MyService implements WithContext { constructor(readonly time: number) {} - add(context: IContext, a: number, b: number) { + add(context: Context, a: number, b: number) { return a + b } multiply(...numbers: number[]) { @@ -40,13 +40,13 @@ describe('jsonrpc', () => { setTimeout(resolve, this.time) }) } - syncError(context: IContext, message: string) { + syncError(context: Context, message: string) { throw new Error(message) } - async asyncError(context: IContext, message: string) { + async asyncError(context: Context, message: string) { throw new Error(message) } - async httpError(context: IContext, statusCode: number, message: string) { + async httpError(context: Context, statusCode: number, message: string) { const err: any = new Error(message) err.statusCode = statusCode err.errors = [{ @@ -54,14 +54,14 @@ describe('jsonrpc', () => { }] throw err } - addWithContext = (ctx: IContext, a: number, b: number) => { + addWithContext = (ctx: Context, a: number, b: number) => { return a + b + ctx.userId } _private = () => { return 1 } @ensureLoggedIn - addWithContext2(ctx: IContext, a: number, b: number) { + addWithContext2(ctx: Context, a: number, b: number) { return Promise.resolve(a + b + ctx!.userId) } } @@ -72,8 +72,8 @@ describe('jsonrpc', () => { const app = express() app.use(bodyParser.json()) app.use('/', - jsonrpc(req => ({userId}), noopLogger) - .addService('/myService', new Service(5), [ + jsonrpc(() => ({userId}), noopLogger) + .addService('/myService', new MyService(5), [ 'add', 'delay', 'syncError', @@ -87,7 +87,7 @@ describe('jsonrpc', () => { return app } - const client = createClient(createApp(), '/myService') + const client = createClient(createApp(), '/myService') async function getError(promise: Promise) { let error @@ -260,7 +260,7 @@ describe('jsonrpc', () => { describe('hook', () => { - let requests: IRequest[] = [] + let requests: Request[] = [] let results: any[] = [] function create() { requests = [] @@ -268,12 +268,12 @@ describe('jsonrpc', () => { userId = 1000 const app = express() - const myService = new Service(5) + const myService = new MyService(5) // console.log('service', myService, Object. app.use(bodyParser.json()) app.use('/', jsonrpc( - req => Promise.resolve({userId}), + () => Promise.resolve({userId}), noopLogger, async (details, makeRequest) => { requests.push(details.request) diff --git a/packages/jsonrpc/src/express.ts b/packages/jsonrpc/src/express.ts index 1bafcb8..7408ad4 100644 --- a/packages/jsonrpc/src/express.ts +++ b/packages/jsonrpc/src/express.ts @@ -1,35 +1,29 @@ -import express, {ErrorRequestHandler} from 'express' -import {FunctionPropertyNames} from './types' -import {IDEMPOTENT_METHOD_REGEX} from './idempotent' -import {IErrorResponse} from './error' -import {ILogger} from '@rondo.dev/logger' -import {ISuccessResponse} from './jsonrpc' -import {NextFunction, Request, Response, Router} from 'express' -import {createError, isJSONRPCError, IJSONRPCError, IError} from './error' -import { - createRpcService, ERROR_SERVER, ERROR_INVALID_PARAMS, ERROR_METHOD_NOT_FOUND, - IRequest, -} from './jsonrpc' +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 { FunctionPropertyNames } from './types' export type TGetContext = (req: Request) => Promise | Context -export interface IJSONRPCReturnType { +export interface RPCReturnType { addService>( path: string, service: T, methods?: F[], - ): IJSONRPCReturnType, + ): RPCReturnType router(): Router } -export interface IInvocationDetails { +export interface InvocationDetails { context: Context path: string request: A } async function defaultHook( - details: IInvocationDetails, + details: InvocationDetails, invoke: () => Promise, ): Promise { const result = await invoke() @@ -38,17 +32,18 @@ async function defaultHook( export function jsonrpc( getContext: TGetContext, - logger: ILogger, + logger: Logger, hook: ( - details: IInvocationDetails, + details: InvocationDetails, invoke: (request?: A) => Promise) => Promise = defaultHook, idempotentMethodRegex = IDEMPOTENT_METHOD_REGEX, -): IJSONRPCReturnType { +): RPCReturnType { + /* eslint @typescript-eslint/no-unused-vars: 0 */ const handleError: ErrorRequestHandler = (err, req, res, next) => { logger.error('JSON-RPC Error: %s', err.stack) - if (isJSONRPCError(err)) { + if (isRPCError(err)) { res.status(err.statusCode) res.json(err.response) return @@ -56,7 +51,7 @@ export function jsonrpc( const id = getRequestId(req) const statusCode: number = err.statusCode || 500 - const errorResponse: IErrorResponse = { + const errorResponse: ErrorResponse = { jsonrpc: '2.0', id, result: null, @@ -85,7 +80,7 @@ export function jsonrpc( const rpcService = createRpcService(service, methods) function handleResponse( - response: ISuccessResponse | null, + response: SuccessResponse | null, res: Response, ) { if (response === null) { diff --git a/packages/jsonrpc/src/jsonrpc.ts b/packages/jsonrpc/src/jsonrpc.ts index a685760..94e6f5a 100644 --- a/packages/jsonrpc/src/jsonrpc.ts +++ b/packages/jsonrpc/src/jsonrpc.ts @@ -1,7 +1,7 @@ export type TId = number | string import {ArgumentTypes, FunctionPropertyNames, RetType} from './types' import {isPromise} from './isPromise' -import {createError, IErrorResponse, IErrorWithData} from './error' +import {createError, ErrorResponse} from './error' import {getValidatorsForMethod, getValidatorsForInstance} from './ensure' import {Validate} from './ensure' @@ -35,8 +35,8 @@ export const ERROR_SERVER = { message: 'Server error', } -export function pick>(t: T, keys: K[]) - : Pick { +export function pick>( + t: T, keys: K[]): Pick { return keys.reduce((obj, key) => { // tslint:disable-next-line const fn = t[key] as unknown as Function @@ -48,8 +48,8 @@ export function pick>(t: T, keys: K[]) export function getAllMethods(obj: T): Array> { const props = new Set() do { - const l = Object.getOwnPropertyNames(obj) - .filter((p, i, arr) => { + Object.getOwnPropertyNames(obj) + .filter(p => { return typeof (obj as any)[p] === 'function' && p.startsWith('_') === false && p !== 'constructor' @@ -61,24 +61,25 @@ export function getAllMethods(obj: T): Array> { return Array.from(props) as unknown as Array> } -export interface IRequest { +export interface Request { jsonrpc: '2.0' id: TId | null method: M params: A } -export interface ISuccessResponse { +export interface SuccessResponse { jsonrpc: '2.0' id: TId result: T error: null } -export type IResponse = ISuccessResponse | IErrorResponse +export type Response = SuccessResponse | ErrorResponse -export function createSuccessResponse(id: number | string, result: T) - : ISuccessResponse { +export function createSuccessResponse( + id: number | string, result: T +): SuccessResponse { return { jsonrpc: '2.0', id, @@ -125,9 +126,9 @@ export const createRpcService = >( pick(service, getAllMethods(service)) return { async invoke( - req: IRequest>, + req: Request>, context: Context, - ): Promise> | null> { + ): Promise> | null> { const {id, method, params} = req if ( @@ -145,7 +146,7 @@ export const createRpcService = >( const isNotification = req.id === null || req.id === undefined if ( - !rpcService.hasOwnProperty(method) || + !Object.prototype.hasOwnProperty.call(rpcService, method) || typeof rpcService[method] !== 'function' ) { throw createError(ERROR_METHOD_NOT_FOUND, { diff --git a/packages/jsonrpc/src/local.test.ts b/packages/jsonrpc/src/local.test.ts index 1b3262f..b2abb0e 100644 --- a/packages/jsonrpc/src/local.test.ts +++ b/packages/jsonrpc/src/local.test.ts @@ -1,29 +1,27 @@ -import {createLocalClient} from './local' -import {keys} from 'ts-transformer-keys' -import {WithContext, WithoutContext, RPCClient} from './types' +import { createLocalClient } from './local' +import { WithContext } from './types' describe('local', () => { - interface IService { + interface Service { add(a: number, b: number): number addWithContext(a: number, b: number): number } - const IServiceKeys = keys() - interface IContext { + interface Context { userId: 1000 } - class Service implements WithContext { - add(cx: IContext, a: number, b: number) { + class MyService implements WithContext { + add(cx: Context, a: number, b: number) { return a + b } - addWithContext = (cx: IContext, a: number, b: number) => { + addWithContext = (cx: Context, a: number, b: number) => { return a + b + cx.userId } } - const service = new Service() + const service = new MyService() const proxy = createLocalClient(service, {userId: 1000}) diff --git a/packages/jsonrpc/src/local.ts b/packages/jsonrpc/src/local.ts index 4f2775a..d553b0d 100644 --- a/packages/jsonrpc/src/local.ts +++ b/packages/jsonrpc/src/local.ts @@ -1,7 +1,5 @@ -import {RPCClient, WithContext, WithoutContext} from './types' -import {Request} from 'express' -import {TGetContext} from './express' -import {getAllMethods} from './jsonrpc' +import { getAllMethods } from './jsonrpc' +import { RPCClient, WithoutContext } from './types' export type LocalClient = RPCClient> diff --git a/packages/jsonrpc/src/redux.test.ts b/packages/jsonrpc/src/redux.test.ts index 679bd2a..33d66bf 100644 --- a/packages/jsonrpc/src/redux.test.ts +++ b/packages/jsonrpc/src/redux.test.ts @@ -2,22 +2,22 @@ * @jest-environment node */ +import { createStore } from '@rondo.dev/redux' import bodyParser from 'body-parser' import express from 'express' -import {AddressInfo} from 'net' -import {Server} from 'http' -import {WithContext, TPendingActions, TAllActions} from './types' -import {combineReducers} from 'redux' -import {createActions, createReducer} from './redux' -import {createRemoteClient} from './remote' -import {createStore} from '@rondo.dev/redux' -import {jsonrpc} from './express' -import {keys} from 'ts-transformer-keys' -import {noopLogger} from './test-utils' +import { Server } from 'http' +import { AddressInfo } from 'net' +import { combineReducers } from 'redux' +import { keys } from 'ts-transformer-keys' +import { jsonrpc } from './express' +import { createActions, createReducer } from './redux' +import { createRemoteClient } from './remote' +import { noopLogger } from './test-utils' +import { WithContext } from './types' describe('createActions', () => { - interface IService { + interface Service { add(a: number, b: number): number addAsync(a: number, b: number): Promise addStringsAsync(a: string, b: string): Promise @@ -26,25 +26,25 @@ describe('createActions', () => { throwError(bool: boolean): boolean } - interface IContext { + interface Context { userId: number } - class Service implements WithContext { - add(cx: IContext, a: number, b: number) { + class MyService implements WithContext { + add(cx: Context, a: number, b: number) { return a + b } - addAsync(cx: IContext, a: number, b: number) { + addAsync(cx: Context, a: number, b: number) { return new Promise(resolve => resolve(a + b)) } - addStringsAsync(cx: IContext, a: string, b: string) { + addStringsAsync(cx: Context, a: string, b: string) { return new Promise(resolve => resolve(a + b)) } - addWithContext = (cx: IContext, a: number, b: number) => + addWithContext = (cx: Context, a: number, b: number) => a + b + cx.userId - addAsyncWithContext = (cx: IContext, a: number, b: number) => + addAsyncWithContext = (cx: Context, a: number, b: number) => new Promise(resolve => resolve(a + b + cx.userId)) - throwError(cx: IContext, bool: boolean) { + throwError(cx: Context, bool: boolean) { if (bool) { throw new Error('test') } @@ -57,7 +57,7 @@ describe('createActions', () => { app.use( '/', jsonrpc(() => ({userId: 1000}), noopLogger) - .addService('/service', new Service(), keys()) + .addService('/service', new MyService(), keys()) .router(), ) @@ -78,8 +78,8 @@ describe('createActions', () => { }) function getClient() { - const remoteClient = createRemoteClient( - baseUrl + '/service', keys()) + const remoteClient = createRemoteClient( + baseUrl + '/service', keys()) const client = createActions(remoteClient, 'myService') const defaultState = { @@ -96,16 +96,14 @@ describe('createActions', () => { case 'addAsync': case 'addWithContext': case 'addAsyncWithContext': - const r1: number = action.payload return { ...state, - add: r1, + add: action.payload, } case 'addStringsAsync': - const r2: string = action.payload return { ...state, - addStringsAsync: r2, + addStringsAsync: action.payload, } default: return state @@ -139,7 +137,7 @@ describe('createActions', () => { add: action.payload, } }, - throwError(state, action) { + throwError(state) { return state }, }) diff --git a/packages/jsonrpc/src/redux.ts b/packages/jsonrpc/src/redux.ts index 5a5a080..f8ac19e 100644 --- a/packages/jsonrpc/src/redux.ts +++ b/packages/jsonrpc/src/redux.ts @@ -1,10 +1,10 @@ import { - IRPCActions, - RPCClient, RPCActions, + RPCClient, TResolvedActions, TAllActions, RPCReduxHandlers, + RPCActionsRecord, } from './types' export function createActions( @@ -27,18 +27,19 @@ export function createActions( return service as RPCActions } -export interface IState { +export interface TestState { loading: number error: string } -export function createReducer( +export function createReducer< + ActionType extends string, State extends TestState>( actionType: ActionType, defaultState: State, ) { const self = { - withHandler>( + withHandler>( handleAction: (state: State, action: TResolvedActions) => State, ): (state: State | undefined, action: TAllActions) => State { return (state: State = defaultState, action: TAllActions): State => { @@ -66,7 +67,7 @@ export function createReducer( }, action) } }, - withMapping>( + withMapping>( handlers: RPCReduxHandlers, ) { return self.withHandler((state, action) => { diff --git a/packages/jsonrpc/src/remote.test.ts b/packages/jsonrpc/src/remote.test.ts index 5823c2c..58784bd 100644 --- a/packages/jsonrpc/src/remote.test.ts +++ b/packages/jsonrpc/src/remote.test.ts @@ -14,24 +14,25 @@ import {WithContext} from './types' describe('remote', () => { - interface IService { + interface Service { add(a: number, b: number): number - fetchItem(obj1: {a: number}, obj2: {b: number}) - : Promise<{a: number, b: number}> + fetchItem( + obj1: {a: number}, obj2: {b: number}): Promise<{a: number, b: number}> } - const IServiceKeys = keys() + const IServiceKeys = keys() - class Service implements WithContext { + class MyService implements WithContext { add(ctx: {}, a: number, b: number) { return a + b } - async fetchItem(ctx: {}, obj1: {a: number}, obj2: {b: number}) - : Promise<{a: number, b: number}> { + async fetchItem( + ctx: {}, obj1: {a: number}, obj2: {b: number} + ): Promise<{a: number, b: number}> { return Promise.resolve({...obj1, ...obj2}) } } - const service = new Service() + const service = new MyService() function createApp() { const a = express() @@ -65,7 +66,7 @@ describe('remote', () => { describe('idempotent method invocation (GET)', () => { it('creates a proxy for remote service', async () => { - const rpc = createRemoteClient( + const rpc = createRemoteClient( baseUrl + '/myService', IServiceKeys) const result = await rpc.fetchItem({a: 10}, {b: 20}) expect(result).toEqual({a: 10, b: 20}) @@ -74,7 +75,7 @@ describe('remote', () => { describe('method invocation (POST)', () => { it('creates a proxy for remote service', async () => { - const rpc = createRemoteClient( + const rpc = createRemoteClient( baseUrl + '/myService', IServiceKeys) const result = await rpc.add(3, 7) expect(result).toBe(3 + 7) diff --git a/packages/jsonrpc/src/remote.ts b/packages/jsonrpc/src/remote.ts index 9e4f119..72f0e8b 100644 --- a/packages/jsonrpc/src/remote.ts +++ b/packages/jsonrpc/src/remote.ts @@ -21,7 +21,7 @@ export function createRemoteClient( method: string, params: any[], ) { - const reqMethod = IDEMPOTENT_METHOD_REGEX.test(method) ? 'GET' : 'POST' + const reqMethod = idempotentMethodRegex.test(method) ? 'GET' : 'POST' const payloadKey = reqMethod === 'POST' ? 'data' : 'params' const response = await axios({ diff --git a/packages/jsonrpc/src/test-utils.ts b/packages/jsonrpc/src/test-utils.ts index 5235966..c3490db 100644 --- a/packages/jsonrpc/src/test-utils.ts +++ b/packages/jsonrpc/src/test-utils.ts @@ -1,8 +1,8 @@ -import {ILogger} from '@rondo.dev/logger' +import {Logger} from '@rondo.dev/logger' const noop = () => undefined -export const noopLogger: ILogger = { +export const noopLogger: Logger = { error: noop, warn: noop, info: noop, diff --git a/packages/jsonrpc/src/types.ts b/packages/jsonrpc/src/types.ts index 5313a22..2c47395 100644 --- a/packages/jsonrpc/src/types.ts +++ b/packages/jsonrpc/src/types.ts @@ -1,4 +1,4 @@ -import {IPendingAction, IResolvedAction, IRejectedAction} from '@rondo.dev/redux' +import {PendingAction, ResolvedAction, RejectedAction} from '@rondo.dev/redux' export type ArgumentTypes = T extends (...args: infer U) => infer R ? U : never @@ -38,64 +38,64 @@ export type RPCClient = { [K in keyof T]: PromisifyReturnType } -export interface IRPCActions { - [key: string]: (...a: any[]) => IRPCPendingAction +export interface RPCActionsRecord { + [key: string]: (...a: any[]) => RPCPendingAction } export type RPCActions = { [K in keyof T]: (...a: ArgumentTypes) => - IRPCPendingAction>, ActionType, K> + RPCPendingAction>, ActionType, K> } export type RPCReduxHandlers = { [K in keyof T]: ( state: State, - action: TResolved>>, + action: GetResolvedAction>>, ) => Partial } -export interface IRPCPendingAction< +export interface RPCPendingAction< T, ActionType extends string, Method extends string | number | symbol -> extends IPendingAction { +> extends PendingAction { method: Method } -export interface IRPCResolvedAction< +export interface RPCResolvedAction< T, ActionType extends string, Method extends string | symbol | number -> extends IResolvedAction { +> extends ResolvedAction { method: Method } -export interface IRPCRejectedAction< +export interface RPCRejectedAction< ActionType extends string, Method extends string | symbol | number -> extends IRejectedAction { +> extends RejectedAction { method: Method } export type TRPCAction< T, ActionType extends string, Method extends string | number | symbol > = - IRPCPendingAction - | IRPCResolvedAction - | IRPCRejectedAction + RPCPendingAction + | RPCResolvedAction + | RPCRejectedAction -export type TResolved = - A extends IRPCPendingAction - ? IRPCResolvedAction +export type GetResolvedAction = + A extends RPCPendingAction + ? RPCResolvedAction : never -export type TRejected = - A extends IRPCPendingAction - ? IRPCRejectedAction +export type GetRejectedAction = + A extends RPCPendingAction + ? RPCRejectedAction : never -export type TPending = - A extends IRPCPendingAction - ? IRPCPendingAction +export type GetPendingAction = + A extends RPCPendingAction + ? RPCPendingAction : never type Values = T[keyof T] -export type TPendingActions = TPending>> -export type TResolvedActions = TResolved> +export type TPendingActions = GetPendingAction>> +export type TResolvedActions = GetResolvedAction> export type TAllActions = TPendingActions - | TResolvedActions | TRejected> + | TResolvedActions | GetRejectedAction> diff --git a/packages/redux/src/actions/createPendingAction.ts b/packages/redux/src/actions/createPendingAction.ts index 534a229..4df7540 100644 --- a/packages/redux/src/actions/createPendingAction.ts +++ b/packages/redux/src/actions/createPendingAction.ts @@ -1,4 +1,4 @@ -import {PendingAction} from './IPendingAction' +import {PendingAction} from './PendingAction' export function createPendingAction( payload: Promise,