From 16ec0f0f6414687a53e9f05d4621b88162a9f1d7 Mon Sep 17 00:00:00 2001 From: Patrick Remy Date: Thu, 9 Apr 2020 11:52:24 +0200 Subject: [PATCH] grpc-js: allow any for linting globally The any type is purposely used. All functions validate their input at runtime. --- packages/grpc-js/.eslintrc | 7 +++++++ packages/grpc-js/src/call-stream.ts | 3 --- packages/grpc-js/src/channel-credentials.ts | 1 - packages/grpc-js/src/client-interceptors.ts | 17 ----------------- packages/grpc-js/src/client.ts | 3 --- packages/grpc-js/src/index.ts | 10 +++------- packages/grpc-js/src/load-balancing-config.ts | 4 ---- packages/grpc-js/src/logging.ts | 2 -- packages/grpc-js/src/make-client.ts | 2 -- packages/grpc-js/src/object-stream.ts | 2 -- packages/grpc-js/src/server-call.ts | 3 --- packages/grpc-js/src/server.ts | 6 ++---- packages/grpc-js/src/service-config.ts | 4 ---- packages/grpc-js/src/subchannel-pool.ts | 1 - packages/grpc-js/test/common.ts | 1 - .../grpc-js/test/test-channel-credentials.ts | 1 - packages/grpc-js/test/test-resolver.ts | 2 -- .../grpc-js/test/test-server-credentials.ts | 1 - packages/grpc-js/test/test-server-deadlines.ts | 1 - packages/grpc-js/test/test-server-errors.ts | 1 - packages/grpc-js/test/test-server.ts | 5 ++--- 21 files changed, 14 insertions(+), 63 deletions(-) create mode 100644 packages/grpc-js/.eslintrc diff --git a/packages/grpc-js/.eslintrc b/packages/grpc-js/.eslintrc new file mode 100644 index 00000000..46b51a24 --- /dev/null +++ b/packages/grpc-js/.eslintrc @@ -0,0 +1,7 @@ +{ + "root": true, + "extends": "./node_modules/gts", + "rules": { + "@typescript-eslint/no-explicit-any": "off" + } +} diff --git a/packages/grpc-js/src/call-stream.ts b/packages/grpc-js/src/call-stream.ts index 443d5ebf..ee7024c2 100644 --- a/packages/grpc-js/src/call-stream.ts +++ b/packages/grpc-js/src/call-stream.ts @@ -69,7 +69,6 @@ export interface MetadataListener { } export interface MessageListener { - // tslint:disable-next-line no-any (message: any, next: (message: any) => void): void; } @@ -90,7 +89,6 @@ export type Listener = Partial; */ export interface InterceptingListener { onReceiveMetadata(metadata: Metadata): void; - // tslint:disable-next-line no-any onReceiveMessage(message: any): void; onReceiveStatus(status: StatusObject): void; } @@ -117,7 +115,6 @@ export class InterceptingListenerImpl implements InterceptingListener { this.nextListener.onReceiveMetadata(metadata); }); } - // tslint:disable-next-line no-any onReceiveMessage(message: any): void { /* If this listener processes messages asynchronously, the last message may * be reordered with respect to the status */ diff --git a/packages/grpc-js/src/channel-credentials.ts b/packages/grpc-js/src/channel-credentials.ts index 5d5b87d5..7eb76a38 100644 --- a/packages/grpc-js/src/channel-credentials.ts +++ b/packages/grpc-js/src/channel-credentials.ts @@ -20,7 +20,6 @@ import { ConnectionOptions, createSecureContext, PeerCertificate } from 'tls'; import { CallCredentials } from './call-credentials'; import { CIPHER_SUITES, getDefaultRootsData } from './tls-helpers'; -// tslint:disable-next-line:no-any function verifyIsBufferOrNull(obj: any, friendlyName: string): void { if (obj && !(obj instanceof Buffer)) { throw new TypeError(`${friendlyName}, if provided, must be a Buffer.`); diff --git a/packages/grpc-js/src/client-interceptors.ts b/packages/grpc-js/src/client-interceptors.ts index 9892959e..c20db534 100644 --- a/packages/grpc-js/src/client-interceptors.ts +++ b/packages/grpc-js/src/client-interceptors.ts @@ -64,7 +64,6 @@ export interface MetadataRequester { } export interface MessageRequester { - // tslint:disable-next-line no-any (message: any, next: (message: any) => void): void; } @@ -189,7 +188,6 @@ const defaultRequester: FullRequester = { }; export interface InterceptorOptions extends CallOptions { - // tslint:disable-next-line no-any method_definition: ClientMethodDefinition; } @@ -197,9 +195,7 @@ export interface InterceptingCallInterface { cancelWithStatus(status: Status, details: string): void; getPeer(): string; start(metadata: Metadata, listener?: Partial): void; - // tslint:disable-next-line no-any sendMessageWithContext(context: MessageContext, message: any): void; - // tslint:disable-next-line no-any sendMessage(message: any): void; startRead(): void; halfClose(): void; @@ -283,7 +279,6 @@ export class InterceptingCall implements InterceptingCallInterface { this.nextCall.start(md, finalInterceptingListener); }); } - // tslint:disable-next-line no-any sendMessageWithContext(context: MessageContext, message: any): void { this.processingMessage = true; this.requester.sendMessage(message, finalMessage => { @@ -294,7 +289,6 @@ export class InterceptingCall implements InterceptingCallInterface { } }); } - // tslint:disable-next-line no-any sendMessage(message: any): void { this.sendMessageWithContext({}, message); } @@ -343,7 +337,6 @@ function getCall(channel: Channel, path: string, options: CallOptions): Call { * object and handles serialization and deseraizliation. */ class BaseInterceptingCall implements InterceptingCallInterface { - // tslint:disable-next-line no-any constructor( protected call: Call, protected methodDefinition: ClientMethodDefinition @@ -357,7 +350,6 @@ class BaseInterceptingCall implements InterceptingCallInterface { setCredentials(credentials: CallCredentials): void { this.call.setCredentials(credentials); } - // tslint:disable-next-line no-any sendMessageWithContext(context: MessageContext, message: any): void { let serialized: Buffer; try { @@ -367,7 +359,6 @@ class BaseInterceptingCall implements InterceptingCallInterface { this.call.cancelWithStatus(Status.INTERNAL, 'Serialization failure'); } } - // tslint:disable-next-line no-any sendMessage(message: any) { this.sendMessageWithContext({}, message); } @@ -381,7 +372,6 @@ class BaseInterceptingCall implements InterceptingCallInterface { interceptingListener?.onReceiveMetadata?.(metadata); }, onReceiveMessage: message => { - // tslint:disable-next-line no-any let deserialized: any; try { deserialized = this.methodDefinition.responseDeserialize(message); @@ -418,7 +408,6 @@ class BaseInterceptingCall implements InterceptingCallInterface { */ class BaseUnaryInterceptingCall extends BaseInterceptingCall implements InterceptingCallInterface { - // tslint:disable-next-line no-any constructor(call: Call, methodDefinition: ClientMethodDefinition) { super(call, methodDefinition); } @@ -427,7 +416,6 @@ class BaseUnaryInterceptingCall extends BaseInterceptingCall const wrapperListener: InterceptingListener = { onReceiveMetadata: listener?.onReceiveMetadata?.bind(listener) ?? (metadata => {}), - // tslint:disable-next-line no-any onReceiveMessage: (message: any) => { receivedMessage = true; listener?.onReceiveMessage?.(message); @@ -450,8 +438,6 @@ class BaseUnaryInterceptingCall extends BaseInterceptingCall */ class BaseStreamingInterceptingCall extends BaseInterceptingCall implements InterceptingCallInterface {} - -// tslint:disable-next-line no-any function getBottomInterceptingCall( channel: Channel, options: InterceptorOptions, @@ -474,7 +460,6 @@ export interface Interceptor { } export interface InterceptorProvider { - // tslint:disable-next-line no-any (methodDefinition: ClientMethodDefinition): Interceptor; } @@ -484,8 +469,6 @@ export interface InterceptorArguments { callInterceptors: Interceptor[]; callInterceptorProviders: InterceptorProvider[]; } - -// tslint:disable-next-line no-any export function getInterceptingCall( interceptorArgs: InterceptorArguments, methodDefinition: ClientMethodDefinition, diff --git a/packages/grpc-js/src/client.ts b/packages/grpc-js/src/client.ts index 8b4b7eea..118375b2 100644 --- a/packages/grpc-js/src/client.ts +++ b/packages/grpc-js/src/client.ts @@ -306,7 +306,6 @@ export class Client { onReceiveMetadata: metadata => { emitter.emit('metadata', metadata); }, - // tslint:disable-next-line no-any onReceiveMessage(message: any) { if (responseMessage != null) { call.cancelWithStatus(Status.INTERNAL, 'Too many responses received'); @@ -418,7 +417,6 @@ export class Client { onReceiveMetadata: metadata => { emitter.emit('metadata', metadata); }, - // tslint:disable-next-line no-any onReceiveMessage(message: any) { if (responseMessage != null) { call.cancelWithStatus(Status.INTERNAL, 'Too many responses received'); @@ -536,7 +534,6 @@ export class Client { onReceiveMetadata(metadata: Metadata) { stream.emit('metadata', metadata); }, - // tslint:disable-next-line no-any onReceiveMessage(message: any) { if (stream.push(message)) { call.startRead(); diff --git a/packages/grpc-js/src/index.ts b/packages/grpc-js/src/index.ts index 941174c0..5c77a3ff 100644 --- a/packages/grpc-js/src/index.ts +++ b/packages/grpc-js/src/index.ts @@ -62,15 +62,15 @@ if (!semver.satisfies(process.version, supportedNodeVersions)) { } interface IndexedObject { - [key: string]: any; // tslint:disable-line no-any - [key: number]: any; // tslint:disable-line no-any + [key: string]: any; + [key: number]: any; } function mixin(...sources: IndexedObject[]) { const result: { [key: string]: Function } = {}; for (const source of sources) { for (const propName of Object.getOwnPropertyNames(source)) { - const property: any = source[propName]; // tslint:disable-line no-any + const property: any = source[propName]; if (typeof property === 'function') { result[propName] = property; } @@ -245,18 +245,14 @@ export { export { handleBidiStreamingCall, handleServerStreamingCall, handleUnaryCall }; -/* tslint:disable:no-any */ export type Call = | ClientUnaryCall | ClientReadableStream | ClientWritableStream | ClientDuplexStream; -/* tslint:enable:no-any */ /**** Unimplemented function stubs ****/ -/* tslint:disable:no-any variable-name */ - export const loadObject = (value: any, options: any) => { throw new Error( 'Not available in this library. Use @grpc/proto-loader and loadPackageDefinition instead' diff --git a/packages/grpc-js/src/load-balancing-config.ts b/packages/grpc-js/src/load-balancing-config.ts index 8607f1fc..4a895903 100644 --- a/packages/grpc-js/src/load-balancing-config.ts +++ b/packages/grpc-js/src/load-balancing-config.ts @@ -21,10 +21,6 @@ * specific object type if the input has the right structure, and throws an * error otherwise. */ -/* The any type is purposely used here. All functions validate their input at - * runtime */ -/* tslint:disable:no-any */ - export interface RoundRobinConfig {} export interface XdsConfig { diff --git a/packages/grpc-js/src/logging.ts b/packages/grpc-js/src/logging.ts index 13ed2b7e..c7a63a47 100644 --- a/packages/grpc-js/src/logging.ts +++ b/packages/grpc-js/src/logging.ts @@ -47,8 +47,6 @@ export const setLogger = (logger: Partial): void => { export const setLoggerVerbosity = (verbosity: LogVerbosity): void => { _logVerbosity = verbosity; }; - -// tslint:disable-next-line no-any export const log = (severity: LogVerbosity, ...args: any[]): void => { if (severity >= _logVerbosity && typeof _logger.error === 'function') { _logger.error(...args); diff --git a/packages/grpc-js/src/make-client.ts b/packages/grpc-js/src/make-client.ts index 99d40a64..f55f4917 100644 --- a/packages/grpc-js/src/make-client.ts +++ b/packages/grpc-js/src/make-client.ts @@ -50,7 +50,6 @@ export interface MethodDefinition ServerMethodDefinition {} export interface ServiceDefinition { - // tslint:disable-next-line no-any [index: string]: MethodDefinition; } @@ -165,7 +164,6 @@ function partial( serialize: Function, deserialize: Function ): Function { - // tslint:disable-next-line:no-any return function(this: any, ...args: any[]) { return fn.call(this, path, serialize, deserialize, ...args); }; diff --git a/packages/grpc-js/src/object-stream.ts b/packages/grpc-js/src/object-stream.ts index 624e547c..8d29b786 100644 --- a/packages/grpc-js/src/object-stream.ts +++ b/packages/grpc-js/src/object-stream.ts @@ -18,8 +18,6 @@ import { Duplex, Readable, Writable } from 'stream'; import { EmitterAugmentation1 } from './events'; -// tslint:disable:no-any - export type WriteCallback = (error: Error | null | undefined) => void; export interface IntermediateObjectReadable extends Readable { diff --git a/packages/grpc-js/src/server-call.ts b/packages/grpc-js/src/server-call.ts index efdf1bcc..d6b55ae8 100644 --- a/packages/grpc-js/src/server-call.ts +++ b/packages/grpc-js/src/server-call.ts @@ -174,7 +174,6 @@ export class ServerWritableStreamImpl async _write( chunk: ResponseType, encoding: string, - // tslint:disable-next-line:no-any callback: (...args: any[]) => void ) { try { @@ -201,7 +200,6 @@ export class ServerWritableStreamImpl callback(null); } - // tslint:disable-next-line:no-any end(metadata?: any) { if (metadata) { this.trailingMetadata = metadata; @@ -671,7 +669,6 @@ export class Http2ServerCallStream< } } -// tslint:disable:no-any type UntypedServerCall = Http2ServerCallStream; function handleExpiredDeadline(call: UntypedServerCall) { diff --git a/packages/grpc-js/src/server.ts b/packages/grpc-js/src/server.ts index fc48f3cf..c37f69f7 100644 --- a/packages/grpc-js/src/server.ts +++ b/packages/grpc-js/src/server.ts @@ -67,7 +67,6 @@ function getUnimplementedStatusResponse( }; } -// tslint:disable:no-any type UntypedUnaryHandler = UnaryHandler; type UntypedClientStreamingHandler = ClientStreamingHandler; type UntypedServerStreamingHandler = ServerStreamingHandler; @@ -113,7 +112,7 @@ function getDefaultHandler(handlerType: HandlerType, methodName: string) { export class Server { private http2ServerList: (http2.Http2Server | http2.Http2SecureServer)[] = []; - + private handlers: Map = new Map< string, UntypedHandler @@ -261,7 +260,7 @@ export class Server { } else { addr = address } - + const http2Server = setupServer(); return new Promise((resolve, reject) => { function onError(err: Error): void { @@ -380,7 +379,6 @@ export class Server { this.sessions.forEach(session => { // Cast NGHTTP2_CANCEL to any because TypeScript doesn't seem to // recognize destroy(code) as a valid signature. - // tslint:disable-next-line:no-any session.destroy(http2.constants.NGHTTP2_CANCEL as any); }); this.sessions.clear(); diff --git a/packages/grpc-js/src/service-config.ts b/packages/grpc-js/src/service-config.ts index e4631507..b1b0fdd4 100644 --- a/packages/grpc-js/src/service-config.ts +++ b/packages/grpc-js/src/service-config.ts @@ -22,10 +22,6 @@ * specific object type if the input has the right structure, and throws an * error otherwise. */ -/* The any type is purposely used here. All functions validate their input at - * runtime */ -/* tslint:disable:no-any */ - import * as lbconfig from './load-balancing-config'; import * as os from 'os'; diff --git a/packages/grpc-js/src/subchannel-pool.ts b/packages/grpc-js/src/subchannel-pool.ts index 0f198afe..634d2575 100644 --- a/packages/grpc-js/src/subchannel-pool.ts +++ b/packages/grpc-js/src/subchannel-pool.ts @@ -63,7 +63,6 @@ export class SubchannelPool { /* These objects are created with Object.create(null), so they do not * have a prototype, which means that for (... in ...) loops over them * do not need to be filtered */ - // tslint:disable-next-line:forin for (const channelTarget in this.pool) { const subchannelObjArray = this.pool[channelTarget]; diff --git a/packages/grpc-js/test/common.ts b/packages/grpc-js/test/common.ts index 19d8d275..4f8c5ff8 100644 --- a/packages/grpc-js/test/common.ts +++ b/packages/grpc-js/test/common.ts @@ -73,7 +73,6 @@ export namespace assert2 { * Wraps a function to keep track of whether it was called or not. * @param fn The function to wrap. */ - // tslint:disable:no-any export function mustCall( fn: (...args: any[]) => T ): (...args: any[]) => T { diff --git a/packages/grpc-js/test/test-channel-credentials.ts b/packages/grpc-js/test/test-channel-credentials.ts index d6028f46..99966941 100644 --- a/packages/grpc-js/test/test-channel-credentials.ts +++ b/packages/grpc-js/test/test-channel-credentials.ts @@ -49,7 +49,6 @@ class CallCredentialsMock implements CallCredentials { } } -// tslint:disable-next-line:no-any const readFile: (...args: any[]) => Promise = promisify(fs.readFile); // A promise which resolves to loaded files in the form { ca, key, cert } const pFixtures = Promise.all( diff --git a/packages/grpc-js/test/test-resolver.ts b/packages/grpc-js/test/test-resolver.ts index 7f4900aa..57997c17 100644 --- a/packages/grpc-js/test/test-resolver.ts +++ b/packages/grpc-js/test/test-resolver.ts @@ -15,8 +15,6 @@ * */ -// Allow `any` data type for testing runtime type checking. -// tslint:disable no-any import * as assert from 'assert'; import * as resolverManager from '../src/resolver'; import { ServiceConfig } from '../src/service-config'; diff --git a/packages/grpc-js/test/test-server-credentials.ts b/packages/grpc-js/test/test-server-credentials.ts index ec1740f7..9cc08b10 100644 --- a/packages/grpc-js/test/test-server-credentials.ts +++ b/packages/grpc-js/test/test-server-credentials.ts @@ -16,7 +16,6 @@ */ // Allow `any` data type for testing runtime type checking. -// tslint:disable no-any import * as assert from 'assert'; import { readFileSync } from 'fs'; import { join } from 'path'; diff --git a/packages/grpc-js/test/test-server-deadlines.ts b/packages/grpc-js/test/test-server-deadlines.ts index c1152309..107994ba 100644 --- a/packages/grpc-js/test/test-server-deadlines.ts +++ b/packages/grpc-js/test/test-server-deadlines.ts @@ -16,7 +16,6 @@ */ // Allow `any` data type for testing runtime type checking. -// tslint:disable no-any import * as assert from 'assert'; import * as path from 'path'; diff --git a/packages/grpc-js/test/test-server-errors.ts b/packages/grpc-js/test/test-server-errors.ts index 7c611b9b..8e9f4520 100644 --- a/packages/grpc-js/test/test-server-errors.ts +++ b/packages/grpc-js/test/test-server-errors.ts @@ -16,7 +16,6 @@ */ // Allow `any` data type for testing runtime type checking. -// tslint:disable no-any import * as assert from 'assert'; import { join } from 'path'; diff --git a/packages/grpc-js/test/test-server.ts b/packages/grpc-js/test/test-server.ts index 434efbbc..c8d2e64a 100644 --- a/packages/grpc-js/test/test-server.ts +++ b/packages/grpc-js/test/test-server.ts @@ -16,7 +16,6 @@ */ // Allow `any` data type for testing runtime type checking. -// tslint:disable no-any import * as assert from 'assert'; import * as fs from 'fs'; import * as http2 from 'http2'; @@ -39,13 +38,13 @@ describe('Server', () => { describe('constructor', () => { it('should work with no arguments', () => { assert.doesNotThrow(() => { - new Server(); // tslint:disable-line:no-unused-expression + new Server(); }); }); it('should work with an empty object argument', () => { assert.doesNotThrow(() => { - new Server({}); // tslint:disable-line:no-unused-expression + new Server({}); }); });