diff --git a/package.json b/package.json index 8c193e7..61fdd79 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "**/*.test.js", "**/__tests__/**", "**/node_modules/**", + "src/vendor.d.ts", "example", "dist", "coverage" @@ -43,14 +44,20 @@ "all": true }, "devDependencies": { - "@types/chai": "^4.0.4", + "@types/async": "^2.0.45", + "@types/body-parser": "^1.16.8", + "@types/chai": "^4.0.6", + "@types/connect-timeout": "0.0.33", + "@types/deepmerge": "^1.3.2", "@types/express": "^4.0.37", "@types/http-status": "^0.2.30", "@types/mocha": "^2.2.43", "@types/node": "^8.0.47", + "@types/protobufjs": "^5.0.31", "@types/reflect-metadata": "0.0.5", "@types/sinon": "^2.3.5", "@types/sinon-chai": "^2.7.29", + "@types/uuid": "^3.4.3", "chai": "^4.1.2", "coveralls": "^2.13.3", "mocha": "^3.5.3", @@ -66,7 +73,7 @@ "typescript": "^2.5.3" }, "dependencies": { - "@types/deepmerge": "^1.3.2", + "@types/minimist": "^1.2.0", "async": "^2.5.0", "body-parser": "^1.18.2", "connect-timeout": "^1.9.0", diff --git a/src/config.ts b/src/config.ts index 7a41635..4ac4207 100644 --- a/src/config.ts +++ b/src/config.ts @@ -99,7 +99,7 @@ export class Config { for (let i = 0, len = this.knownOptions.length; i < len; i++) { const option = this.knownOptions[i]; - this[option.dest] = option.value; + (this)[option.dest] = option.value; // Check for commandline arguments if (option.args) { @@ -109,20 +109,20 @@ export class Config { const value = args[option.args[j]]; if (value) { argValue = value; - this[option.dest] = value; + (this)[option.dest] = value; break; } } if (argValue) { - this[option.dest] = argValue; + (this)[option.dest] = argValue; break; } } // Check for environment variables if (option.env && process.env[option.env]) { - this[option.dest] = process.env[option.env]; + (this)[option.dest] = process.env[option.env]; } }; } diff --git a/src/grpc-server.ts b/src/grpc-server.ts index b946707..bc3863a 100644 --- a/src/grpc-server.ts +++ b/src/grpc-server.ts @@ -55,7 +55,7 @@ interface GrpcImplementation { @injectable() export class GrpcServer { - private server; + private server: any; private services: GrpcImplementation = {}; private proto: PackagedProtobufDefinition | ProtobufDefinition; private health = new BehaviorSubject(false); @@ -66,7 +66,7 @@ export class GrpcServer { private logger: Logger, private healthManager: HealthManager ) { - healthManager.registerCheck('GRPC server', this.health); + this.healthManager.registerCheck('GRPC server', this.health); this.proto = grpc.load(this.protoConfig.path); } @@ -111,9 +111,9 @@ export class GrpcServer { this.server = new grpc.Server(); this.server.addService(this.service, this.services); - this.server.bind(`0.0.0.0:${this.config['grpcPort']}`, grpc.ServerCredentials.createInsecure()); + this.server.bind(`0.0.0.0:${(this.config)['grpcPort']}`, grpc.ServerCredentials.createInsecure()); this.server.start(); - this.logger.info(`Grpc server started listening on: ${this.config['grpcPort']}`); + this.logger.info(`Grpc server started listening on: ${(this.config)['grpcPort']}`); // Notify the server is healhty this.health.next(true); diff --git a/src/health.ts b/src/health.ts index 6e9116b..bba96c5 100644 --- a/src/health.ts +++ b/src/health.ts @@ -2,7 +2,7 @@ import { injectable } from 'inversify'; import { Logger } from './logger'; import 'rxjs/add/operator/distinctUntilChanged'; import 'rxjs/add/operator/skip'; -import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { BehaviorSubject } from 'rxjs'; interface HealthChecks { @@ -13,11 +13,10 @@ interface HealthChecks { export class HealthManager { private checks: HealthChecks = {}; private _health = false; - private _previousHealth = false; - constructor(private logger: Logger) {} + constructor(private logger: Logger) { } - public registerCheck(name: string, check) { + public registerCheck(name: string, check: BehaviorSubject) { if (this.checks[name]) { throw new Error(`Health check with name: ${name} already exists`); } @@ -32,13 +31,13 @@ export class HealthManager { check .skip(1) .distinctUntilChanged() - .subscribe((status) => { - if (status === false) { - this.logger.warn(`Health check: ${name} became unhealthy`); - this.healthy = false; - } else { + .subscribe((status: boolean) => { + if (status === true) { this.logger.info(`Health check: ${name} became healthy`); this.determineHealth(); + } else { + this.logger.warn(`Health check: ${name} became unhealthy`); + this.healthy = false; } }); } @@ -64,7 +63,7 @@ export class HealthManager { } public getReport() { - const report = {}; + const report: any = {}; for (const check in this.checks) { if (this.checks.hasOwnProperty(check)) { @@ -80,11 +79,11 @@ export class HealthManager { const keys = Object.keys(this.checks); for (let i = 0, len = keys.length; i < len; i++) { - const checkStatus = this.checks[keys[i]].getValue(); - if (checkStatus === false) { - status = false; - break; - } + const checkStatus = this.checks[keys[i]].getValue(); + if (checkStatus === false) { + status = false; + break; + } } this.healthy = status; diff --git a/src/http-server.ts b/src/http-server.ts index 189bdef..9097a3a 100644 --- a/src/http-server.ts +++ b/src/http-server.ts @@ -1,5 +1,6 @@ import { injectable, inject } from 'inversify'; -import { Request, Response, NextFunction } from 'express'; + +import { Request, Response, NextFunction, Express } from 'express'; import * as bodyParser from 'body-parser'; import * as httpStatus from 'http-status'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; @@ -30,13 +31,18 @@ export interface HttpService { export class HttpServer { public health = new BehaviorSubject(false); protected registeredUrls: RegisteredServices = {}; - protected server; - - constructor( @inject('express') private express, private config: Config, private logger: Logger, healthManager: HealthManager) { + protected server: Express; + + constructor( + @inject('express') private express: () => Express | Object, + private config: Config, + private logger: Logger, + healthManager: HealthManager + ) { healthManager.registerCheck('HTTP server', this.health); // Setup express and a json body parser - this.server = express(); + this.server = (this.express()); this.server.use(bodyParser.json({ type: (request) => { let contentType = ''; @@ -54,7 +60,7 @@ export class HttpServer { })); // Register health check endpoint - const healthUrl = this.normalizeURL(this.config['healthCheckURL'] || '/check'); + const healthUrl = this.normalizeURL((this.config)['healthCheckURL'] || '/check'); this.server.get(healthUrl, (_: Request, response: Response) => { const report = healthManager.getReport(); @@ -81,7 +87,7 @@ export class HttpServer { this.logger.info(`Registering HTTP handler: ${service.method || method} ${url}`); this.registeredUrls[url] = service.method; - this.server[method](url, (request: Request, response: Response) => { + (this.server as any)[method](url, (request: Request, response: Response) => { this.handleRequest(service, request, response); }); } @@ -89,8 +95,8 @@ export class HttpServer { // Starts the http server public start() { // Set a 30 seconds request timeout - const connectTimeout: number = this.config['connectTimeout'] || 30000; - this.server.use(timeout(connectTimeout)); + const connectTimeout: number = (this.config)['connectTimeout'] || 30000; + this.server.use(timeout(`${connectTimeout}ms`)); // 404 middleware this.server.use((request: Request, response: Response, _: NextFunction) => { @@ -102,7 +108,7 @@ export class HttpServer { }); // Error middleware - this.server.use((error, request: Request, response: Response, _: NextFunction) => { + this.server.use((error: any, request: Request, response: Response, _: NextFunction) => { this.logger.error(`Express error middleware error for ${request.url}`, error); console.error(error); @@ -111,8 +117,8 @@ export class HttpServer { }); }); - this.server.listen(this.config['httpPort'], () => { - this.logger.info(`Http server starting listening on: ${this.config['httpPort']}`); + this.server.listen((this.config)['httpPort'], () => { + this.logger.info(`Http server starting listening on: ${(this.config)['httpPort']} `); this.health.next(true); }); } @@ -126,7 +132,7 @@ export class HttpServer { if (!service.unauthenticated && !context.token) { - this.logger.audit(`Unauthenticated request on: ${service.url}`); + this.logger.audit(`Unauthenticated request on: ${service.url} `); response.status(httpStatus.FORBIDDEN).send('Unauthenticated'); return; } @@ -149,7 +155,7 @@ export class HttpServer { response.status(status).send(content); const duration = new Date().getTime() - startTime.getTime(); - this.logger.info(`Http request '${request.url}' ended: ${status}, duration: ${duration}ms`, { context }); + this.logger.info(`Http request '${request.url}' ended: ${status}, duration: ${duration} ms`, { context }); }) .catch((error: ServiceResponse = {}) => { this.logger.error(error.content); @@ -160,7 +166,7 @@ export class HttpServer { response.status(status).send(content); const duration = new Date().getTime() - startTime.getTime(); - this.logger.info(`Http request '${request.url}' ended: ${status}, duration: ${duration}ms`, { context }); + this.logger.info(`Http request '${request.url}' ended: ${status}, duration: ${duration} ms`, { context }); }); } @@ -171,8 +177,8 @@ export class HttpServer { } // Check for root in config and prepend to the url - if (this.config['httpRoot']) { - let httpRoot = this.config['httpRoot']; + if ((this.config)['httpRoot']) { + let httpRoot = (this.config)['httpRoot']; // Should start with an slash if (httpRoot.charAt(0) !== '/') { @@ -243,10 +249,14 @@ export class HttpServer { user = request.headers['remoteuser'].toString(); } + // if (token === undefined || user === undefined) { + // throw new Error('Could not create context, lacking token or user'); + // } + return { - token, - requestId, - user + token: token, + requestId: requestId, + user: user } } } diff --git a/src/logger/logger.ts b/src/logger/logger.ts index c6f2358..173d12b 100644 --- a/src/logger/logger.ts +++ b/src/logger/logger.ts @@ -23,7 +23,7 @@ export interface LogRecord { message: string; time: Date; formatArgs: Array, - extra: Object; + extra: any; } export type LogProcessor = (message: LogRecord) => LogRecord; @@ -61,7 +61,7 @@ export class Logger { private handlers: Array = []; constructor(private config: Config) { - switch (config['logLevel'] || LogLevel.DEBUG) { + switch ((this.config)['logLevel'] || LogLevel.DEBUG) { case 'debug': this.logLevel = LogLevel.DEBUG; break; case 'info': this.logLevel = LogLevel.INFO; break; case 'warn': this.logLevel = LogLevel.WARN; break; @@ -69,11 +69,11 @@ export class Logger { case 'fatal': this.logLevel = LogLevel.FATAL; break; } - if (config['debug'] === true || config['debug'] === 'true') { + if ((config)['debug'] === true || (config)['debug'] === 'true') { this._debug = true; } - const loggerOptions: LoggerOptions = this.config['loggerOptions'] + const loggerOptions: LoggerOptions = (this.config)['loggerOptions'] const processors = loggerOptions && loggerOptions.processors ? loggerOptions.processors : this.defaultProcessors; const handlers = loggerOptions && loggerOptions.handlers ? loggerOptions.handlers : this.defaultHandlers; diff --git a/src/logger/processors/assign-instance.ts b/src/logger/processors/assign-instance.ts index 5ff0f24..426b8b4 100644 --- a/src/logger/processors/assign-instance.ts +++ b/src/logger/processors/assign-instance.ts @@ -5,8 +5,8 @@ import { LogRecord } from './../logger'; let instanceId = uuid(); const func = function(config: Config) { - if (config['instanceId']) { - instanceId = config['instanceId']; + if ((config)['instanceId']) { + instanceId = (config)['instanceId']; } return (record: LogRecord): LogRecord => { diff --git a/src/logger/processors/assign-session-hash.ts b/src/logger/processors/assign-session-hash.ts index fcc08a0..582ccb7 100644 --- a/src/logger/processors/assign-session-hash.ts +++ b/src/logger/processors/assign-session-hash.ts @@ -3,7 +3,7 @@ import { Config } from './../../config'; import { LogRecord } from './../logger'; export function assignSessionHash(config: Config) { - const secret = config['sessionHashKey']; + const secret = (config)['sessionHashKey']; return (record: LogRecord): LogRecord => { if (secret && record.extra['context'] !== undefined) { diff --git a/src/logger/processors/assign-version.ts b/src/logger/processors/assign-version.ts index 5d53fe2..f000545 100644 --- a/src/logger/processors/assign-version.ts +++ b/src/logger/processors/assign-version.ts @@ -2,7 +2,7 @@ import { Config } from './../../config'; import { LogRecord } from './../logger'; export function assignVersion(config: Config) { - const version = config['applicationVersion']; + const version = (config)['applicationVersion']; return (record: LogRecord): LogRecord => { if (version !== undefined) { diff --git a/src/logger/processors/remove-sensitive-info.ts b/src/logger/processors/remove-sensitive-info.ts index 0d2372d..c829d72 100644 --- a/src/logger/processors/remove-sensitive-info.ts +++ b/src/logger/processors/remove-sensitive-info.ts @@ -4,8 +4,8 @@ import { LogRecord } from './../logger'; export function removeSensitiveInfo(config: Config) { let sensitiveKeys = ['token', 'user', 'password', 'context']; - if (config['sensitiveKeys']) { - sensitiveKeys = sensitiveKeys.concat(config['sensitiveKeys']); + if ((config)['sensitiveKeys']) { + sensitiveKeys = sensitiveKeys.concat((config)['sensitiveKeys']); } return (record: LogRecord): LogRecord => { @@ -17,4 +17,3 @@ export function removeSensitiveInfo(config: Config) { return record; } } - diff --git a/src/providers/db/mariadbProvider.ts b/src/providers/db/mariadbProvider.ts index 17527c0..b8867ce 100644 --- a/src/providers/db/mariadbProvider.ts +++ b/src/providers/db/mariadbProvider.ts @@ -26,11 +26,11 @@ export class MariadbProvider extends DbProvider implements EntityProvider { super(); const providedOptions: Partial = { - username: this.config['dbUser'], - password: this.config['dbPassword'] || '', - database: this.config['dbName'], - host: this.config['dbHost'], - port: this.config['dbPort'], + username: (this.config as any)['dbUser'], + password: (this.config as any)['dbPassword'] || '', + database: (this.config as any)['dbName'], + host: (this.config as any)['dbHost'], + port: (this.config as any)['dbPort'], entities: this.entities }; const options: ConnectionOptions = deepmerge(this.connectionOptions, providedOptions); diff --git a/src/providers/simple-grpc-client.ts b/src/providers/simple-grpc-client.ts index 03a957d..9e3a658 100644 --- a/src/providers/simple-grpc-client.ts +++ b/src/providers/simple-grpc-client.ts @@ -1,6 +1,6 @@ import { injectable } from 'inversify'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; -import { Config } from './../config'; +import { Config } from '../config'; import * as grpcExt from 'grpc/src/node/src/grpc_extension'; import * as async from 'async'; import * as grpc from 'grpc'; @@ -13,15 +13,15 @@ export class SimpleGrpcClient { public health = new BehaviorSubject(false); public protoConfig: ProtoConfig; public serviceAddress: string; - public client; + public client: any; public healthManager: HealthManager; public logger: Logger; public callTimeout = 5; // timeout/deadline for grpc calls in seconds private channelState = new BehaviorSubject(-1); constructor(config: Config) { - if (config['grpcClientTimeout']) { - this.callTimeout = config['grpcClientTimeout']; + if ((config)['grpcClientTimeout']) { + this.callTimeout = (config)['grpcClientTimeout']; } } @@ -45,7 +45,7 @@ export class SimpleGrpcClient { this.client = new ServiceClass(this.serviceAddress, grpc.credentials.createInsecure()); // Wiat for client to be ready and start health monitoring - this.client.waitForReady(Infinity, (error) => { + this.client.waitForReady(Infinity, (error: Error | undefined) => { if (!error) { this.health.next(true); this.monitorGRPCHealth(connectivityState.READY); @@ -74,9 +74,9 @@ export class SimpleGrpcClient { throw Error(errorMessage); } - const meta = context ? this.transformContext(context) : grpc.Metadata(); + const meta = context ? this.transformContext(context) : new grpc.Metadata(); return new Promise((resolve, reject) => { - const methodCallback = (error, response) => { + const methodCallback = (error: Error, response: any) => { if (error) { this.logger.error(`Call ${methodName} on ${this.protoConfig.service} failed with error: `, error); console.error(error); @@ -86,17 +86,17 @@ export class SimpleGrpcClient { resolve(response); } }; - const wrappedCall = (callback) => { + const wrappedCall = (callback: any) => { const now = new Date(); const deadline = now.setSeconds(now.getSeconds() + this.callTimeout); return this.client[methodName](message, meta, { deadline: deadline }, callback); }; - async.retry(3, wrappedCall, methodCallback); + async.retry(3, wrappedCall, methodCallback); }); } // Recursive function that emits the channelState - private monitorGRPCHealth(currentState) { + private monitorGRPCHealth(currentState: any) { this.client.getChannel().watchConnectivityState(currentState, Infinity, () => { const newState = this.client.getChannel().getConnectivityState(true); this.channelState.next(newState); diff --git a/src/rservice.ts b/src/rservice.ts index d6017c4..d5bd60f 100644 --- a/src/rservice.ts +++ b/src/rservice.ts @@ -11,13 +11,13 @@ import { ProtoConfig } from './proto-config'; import { EventEmitter, Subscriber } from './events'; export interface ServiceOptions { - managers?: Array<{ new(...any): any }>; - services: Array<{ new(...any): Service }>; - providers?: Array<{ new(...any): any }>; + managers?: Array<{ new(...args: any[]): any }>; + services: Array<{ new(...args: any[]): Service }>; + providers?: Array<{ new(...args: any[]): any }>; proto: ProtoConfig; config?: Array; events?: { - subscribers?: Array<{ new(...any): Subscriber }>; + subscribers?: Array<{ new(...args: any[]): Subscriber }>; } } @@ -84,7 +84,7 @@ export class RService { return subscribers; } - private registerSingletons(items?: Array<{ new(...any): any }>) { + private registerSingletons(items?: Array<{ new(...args: any[]): any }>) { if (items) { for (const itemClass of items) { this.container.bind(itemClass).toSelf().inSingletonScope(); diff --git a/src/utils.ts b/src/utils.ts index c355493..75de30f 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,21 +1,21 @@ -function parse (path) { +function parse(path: string) { if (typeof path !== 'string') { path = ''; } const tokens = path.split('.'); for (let i = 0, len = tokens.length; i < len; i++) { if (tokens[i] === '') { - return [ ]; + return []; } } return tokens; } -export function deepSet(obj, path, value) { +export function deepSet(obj: any, path: string, value: any) { const tokens = parse(path); for (let i = 0, len = tokens.length; i < len; i++) { - if (! obj || ! obj.hasOwnProperty(tokens[i])) { - obj[tokens[i]] = { }; + if (!obj || !obj.hasOwnProperty(tokens[i])) { + obj[tokens[i]] = {}; } if (i === (len - 1)) { obj[tokens[i]] = value; diff --git a/src/vendor.d.ts b/src/vendor.d.ts new file mode 100644 index 0000000..757055a --- /dev/null +++ b/src/vendor.d.ts @@ -0,0 +1,35 @@ +// Partial implementation taken from +// https://raw.githubusercontent.com/grpc/grpc-node/master/packages/grpc-native-core/index.d.ts +// Further implementations should upgrade to latest gRPC version. + +declare module 'grpc' { + export function load(filename: string): any; + export class Metadata { + add(key: string, value: string): void; + } + export class Server { } + export class ServerCredentials { + static createInsecure(): ServerCredentials; + } + export const credentials: { + createInsecure(): any; + }; +} + +declare module 'grpc/src/node/src/grpc_extension' { + export enum connectivityState { + CONNECTING, + READY, + TRANSIENT_FAILURE, + IDLE, + SHUTDOWN + } +} + +declare module 'mock-express-request' { + class C { + constructor(...args: any[]); + } + namespace C { } + export = C; +} diff --git a/test/config.spec.ts b/test/config.spec.ts index 7052b61..21b3d5a 100644 --- a/test/config.spec.ts +++ b/test/config.spec.ts @@ -1,6 +1,7 @@ import 'reflect-metadata'; import { expect } from 'chai'; +import 'mocha'; import { Config } from './../src/config'; @@ -12,11 +13,11 @@ describe('Config', () => { }); it('It should have default ports for http and grpc', () => { - expect(config['httpPort']).to.equal(8000); - expect(config['grpcPort']).to.equal(9000); + expect((config)['httpPort']).to.equal(8000); + expect((config)['grpcPort']).to.equal(9000); }); it('Default log level should be info', () => { - expect(config['logLevel']).to.equal('info'); + expect((config)['logLevel']).to.equal('info'); }); }); diff --git a/test/grpc-server.spec.ts b/test/grpc-server.spec.ts deleted file mode 100644 index af3a1ce..0000000 --- a/test/grpc-server.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { GrpcServer } from './../src/grpc-server'; -import { HealthManager } from './../src/health'; -import { Logger } from './../src/logger'; -import { Config } from './../src/config'; - -const protoConfig = { - path: '', - service: '' -}; - -const config = new Config(); - -const mockLogger = { - info: (message: string) => { }, - audit: (message: string) => { }, - warn(message: string) { }, - error(message: string) { }, - debug(message: string) { } -}; - -// describe('Grpc server', () => { -// const server = new GrpcServer(protoConfig, config, mockLogger, new HealthManager(mockLogger)); -// }); diff --git a/test/health.spec.ts b/test/health.spec.ts index 9d856aa..d090730 100644 --- a/test/health.spec.ts +++ b/test/health.spec.ts @@ -1,4 +1,5 @@ import 'reflect-metadata'; +import 'mocha'; import { expect } from 'chai'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; @@ -6,11 +7,11 @@ import { Logger } from './../src/logger'; import { HealthManager } from './../src/health'; const mockLogger = { - info: (message: string) => {}, - audit: (message: string) => {}, - warn(message: string) {}, - error(message: string) {}, - debug(message: string) {} + info: (_: string) => { }, + audit: (_: string) => { }, + warn(_: string) { }, + error(_: string) { }, + debug(_: string) { } } describe('HealthManager', () => { diff --git a/test/http-server.spec.ts b/test/http-server.spec.ts index 73befd3..cb932b9 100644 --- a/test/http-server.spec.ts +++ b/test/http-server.spec.ts @@ -1,4 +1,5 @@ import 'reflect-metadata'; +import 'mocha' import * as sinonChai from 'sinon-chai'; import * as sinon from 'sinon'; @@ -8,35 +9,34 @@ chai.use(sinonChai); import { SinonSpy } from 'sinon'; import { expect } from 'chai'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; -import { Request } from 'express'; import * as MockRequest from 'mock-express-request'; import * as httpStatus from 'http-status'; -import { Service, HTTP_METHOD } from './../src/service'; -import { Config } from './../src/config'; -import { Logger } from './../src/logger'; -import { HealthManager } from './../src/health'; -import { Context } from './../src/context'; -import { HttpServer } from './../src/http-server'; +import { HTTP_METHOD } from '../src/service'; +import { Config } from '../src/config'; +import { Logger } from '../src/logger'; +import { HealthManager } from '../src/health'; +import { Context } from '../src/context'; +import { HttpServer } from '../src/http-server'; const config = new Config(); const mockLogger = { - info: (message: string) => { }, - audit: (message: string) => { }, - warn(message: string) { }, - error(message: string) { }, - debug(message: string) { } + info: (_: string) => { }, + audit: (_: string) => { }, + warn(_: string) { }, + error(_: string) { }, + debug(_: string) { } } describe('Http server', () => { let httpServer: HttpServer; let healthManager: HealthManager; let healthSpy: SinonSpy; - let mockExpress; + let mockExpress: () => Object; // Express mock spies - let expressInstantiated; + let expressInstantiated: boolean; let getSpy: SinonSpy; let postSpy: SinonSpy; let deleteSpy: SinonSpy; @@ -91,15 +91,15 @@ describe('Http server', () => { expect(url).to.equal('/check'); - let responseCode; - let responseText; + let responseCode: number = -1; + let responseText: string = ''; const response = { - status: (statusCode) => { + status: (statusCode: number) => { responseCode = statusCode; return { - send: (sendResponse) => { + send: (sendResponse: string) => { responseText = sendResponse; } } @@ -123,7 +123,7 @@ describe('Http server', () => { url: '/foobar', method: HTTP_METHOD.GET, handler: () => { - return new Promise((resolve, reject) => { }); + return new Promise(() => { }); } }; @@ -138,7 +138,7 @@ describe('Http server', () => { url: 'foobar', method: HTTP_METHOD.GET, handler: () => { - return new Promise((resolve, reject) => { }); + return new Promise(() => { }); } }; @@ -155,7 +155,7 @@ describe('Http server', () => { url: '/v1/bar/foo/bar', method: HTTP_METHOD.GET, handler: () => { - return new Promise((resolve, reject) => { }); + return new Promise(() => { }); } }; @@ -168,13 +168,13 @@ describe('Http server', () => { }); it('Should prefix the url with the http root if one is given', () => { - config['httpRoot'] = 'testing'; + (config)['httpRoot'] = 'testing'; const service = { url: 'foobar', method: HTTP_METHOD.GET, handler: () => { - return new Promise((resolve, reject) => { }); + return new Promise(() => { }); } }; @@ -187,13 +187,13 @@ describe('Http server', () => { }); it('Should normalize the httpRoot properly', () => { - config['httpRoot'] = 'testing/'; + (config)['httpRoot'] = 'testing/'; const service = { url: 'foobar', method: HTTP_METHOD.GET, handler: () => { - return new Promise((resolve, reject) => { }); + return new Promise(() => { }); } }; @@ -207,13 +207,13 @@ describe('Http server', () => { const serviceOne = { method: HTTP_METHOD.GET, url: 'foobar', - handler: () => { return new Promise((resolve, reject) => { }) } + handler: () => { return new Promise(() => { }) } }; const serviceTwo = { method: HTTP_METHOD.POST, url: 'foobar', - handler: () => { return new Promise((resolve, reject) => { }) } + handler: () => { return new Promise(() => { }) } }; function register() { @@ -229,13 +229,13 @@ describe('Http server', () => { const serviceOne = { method: HTTP_METHOD.POST, url: 'foobar', - handler: () => { return new Promise((resolve, reject) => { }) } + handler: () => { return new Promise(() => { }) } }; const serviceTwo = { method: HTTP_METHOD.POST, url: 'foobar', - handler: () => { return new Promise((resolve, reject) => { }) } + handler: () => { return new Promise(() => { }) } }; function register() { @@ -251,7 +251,7 @@ describe('Http server', () => { it('It should call listen on express when starting server with the correct port', () => { httpServer.start(); expect(listenSpy).to.have.been.calledOnce; - expect(listenSpy.getCall(0).args[0]).to.equal(config['httpPort']); + expect(listenSpy.getCall(0).args[0]).to.equal((config)['httpPort']); }); it('It should send out an health update when the server is started', () => { @@ -314,8 +314,8 @@ describe('Http server', () => { headers: {} }); - let responseText; - let statusCode; + let responseText: string = ''; + let statusCode: number = -1; const response = { status: (status: number) => { @@ -401,7 +401,7 @@ describe('Http server', () => { }); it('It should return 500 internal server when handler promise is rejected without status code or content', (done) => { - const handlerSpy = sinon.stub().returns(new Promise((resolve, reject) => { + const handlerSpy = sinon.stub().returns(new Promise((_, reject) => { reject(); })); @@ -437,7 +437,7 @@ describe('Http server', () => { }); it('It should return the status code and content passed when handler promise is rejected', (done) => { - const handlerSpy = sinon.stub().returns(new Promise((resolve, reject) => { + const handlerSpy = sinon.stub().returns(new Promise((_, reject) => { reject({ status: httpStatus.BAD_REQUEST, content: 'Foo is not correct' @@ -454,7 +454,7 @@ describe('Http server', () => { httpServer.registerService(service); const handler = getSpy.getCall(1).args[1]; - const request = new (MockRequest as any)({ + const request = new MockRequest({ method: HTTP_METHOD.GET, url: '/foobar' }); @@ -477,7 +477,7 @@ describe('Http server', () => { it('Default response status code for success should be 200', (done) => { const responseBody = { foo: 'bar' }; - const handlerSpy = sinon.stub().returns(new Promise((resolve, reject) => { + const handlerSpy = sinon.stub().returns(new Promise((resolve, _) => { resolve({ content: responseBody }); @@ -514,9 +514,9 @@ describe('Http server', () => { handler(request, response); }); - it('It should return success and content is callback called without error', (done) => { + it('It should return success and content is callback called without error', (done: any) => { const responseBody = { foo: 'bar' }; - const handlerSpy = sinon.stub().returns(new Promise((resolve, reject) => { + const handlerSpy = sinon.stub().returns(new Promise((resolve, _) => { resolve({ status: httpStatus.CREATED, content: responseBody diff --git a/test/logger/handlers/console.spec.ts b/test/logger/handlers/console.spec.ts index d80f633..a05d191 100644 --- a/test/logger/handlers/console.spec.ts +++ b/test/logger/handlers/console.spec.ts @@ -1,7 +1,5 @@ -import * as chai from 'chai'; import { expect } from 'chai'; -import { spy } from 'sinon'; - +import 'mocha'; import { Config } from './../../../src/config'; import { consoleHandler, LogLevel, LogRecord } from './../../../src/logger'; diff --git a/test/logger/logger.spec.ts b/test/logger/logger.spec.ts index fb3603d..648e9a5 100644 --- a/test/logger/logger.spec.ts +++ b/test/logger/logger.spec.ts @@ -1,7 +1,8 @@ import 'reflect-metadata'; +import 'mocha'; import { expect } from 'chai'; -import { sandbox, SinonSandbox, SinonSpy, SinonStub, spy, stub } from 'sinon'; +import { SinonSpy, spy } from 'sinon'; import * as chai from 'chai'; import * as sinonChai from 'sinon-chai'; diff --git a/test/logger/processors/assign-instance-id.spec.ts b/test/logger/processors/assign-instance-id.spec.ts index 560ba09..5d6fb00 100644 --- a/test/logger/processors/assign-instance-id.spec.ts +++ b/test/logger/processors/assign-instance-id.spec.ts @@ -1,4 +1,4 @@ -import * as chai from 'chai'; +import 'mocha'; import { expect } from 'chai'; import { Config } from './../../../src'; @@ -41,5 +41,3 @@ describe('Log processor - assign instance id', () => { expect(assignedRecordThree.extra['instance-id']).to.equal('foobar'); }); }); - - diff --git a/test/logger/processors/assign-request-id.spec.ts b/test/logger/processors/assign-request-id.spec.ts index 315da58..e9956c6 100644 --- a/test/logger/processors/assign-request-id.spec.ts +++ b/test/logger/processors/assign-request-id.spec.ts @@ -1,4 +1,4 @@ -import * as chai from 'chai'; +import 'mocha'; import { expect } from 'chai'; import { Config } from './../../../src/config'; diff --git a/test/logger/processors/assign-session-hash.spec.ts b/test/logger/processors/assign-session-hash.spec.ts index 7e0ed4a..b7d59e0 100644 --- a/test/logger/processors/assign-session-hash.spec.ts +++ b/test/logger/processors/assign-session-hash.spec.ts @@ -1,4 +1,4 @@ -import * as chai from 'chai'; +import 'mocha'; import { expect } from 'chai'; import { Config } from './../../../src/config'; @@ -24,10 +24,8 @@ describe('Log processor - assign session hash', () => { } }; - const version = 'v1'; const assignedRecord = assignSessionHash(config)(record); - expect(assignedRecord.extra['session-hash']).to.exist; expect(assignedRecord.extra['session-hash']).to.not.equal(record.extra['context']['token']); expect(assignedRecord.extra['session-hash'].length).to.equal(10); }); diff --git a/test/logger/processors/assign-version.spec.ts b/test/logger/processors/assign-version.spec.ts index 01f2f13..19f7387 100644 --- a/test/logger/processors/assign-version.spec.ts +++ b/test/logger/processors/assign-version.spec.ts @@ -1,4 +1,4 @@ -import * as chai from 'chai'; +import 'mocha'; import { expect } from 'chai'; import { Config } from './../../../src/config'; diff --git a/test/logger/processors/remove-sensitive-info.spec.ts b/test/logger/processors/remove-sensitive-info.spec.ts index ac90c7a..6a3e5b8 100644 --- a/test/logger/processors/remove-sensitive-info.spec.ts +++ b/test/logger/processors/remove-sensitive-info.spec.ts @@ -1,4 +1,4 @@ -import * as chai from 'chai'; +import 'mocha'; import { expect } from 'chai'; import { Config } from './../../../src/config'; diff --git a/tsconfig.json b/tsconfig.json index cea432c..a23eeb8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,25 @@ { "compilerOptions": { - "strict": true, - "outDir": "dist", - "module": "commonjs", - "moduleResolution": "node", "target": "es2017", + "module": "commonjs", "lib": ["es2017", "dom"], - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "noImplicitAny": false, + "allowJs": false, "declaration": true, - "sourceMap": true, - "baseUrl": "src" + "outDir": "./dist", + "removeComments": false, + "importHelpers": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "baseUrl": "./src", + "types": ["node", "reflect-metadata"], + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true }, "exclude": [ "node_modules",