From 7e7554c0ae018e94178ec2be63c2f27939619dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20Conradi=20=C3=98sthus?= Date: Tue, 23 Mar 2021 08:46:01 +0100 Subject: [PATCH] fix: convert event-store to typescript (#768) --- ...vent-store.test.js => event-store.test.ts} | 17 +++++-- src/lib/db/{event-store.js => event-store.ts} | 48 ++++++++++++++----- src/lib/{logger.js => logger.ts} | 43 +++++++++-------- .../fixtures/{no-logger.js => no-logger.ts} | 6 ++- 4 files changed, 78 insertions(+), 36 deletions(-) rename src/lib/db/{event-store.test.js => event-store.test.ts} (51%) rename src/lib/db/{event-store.js => event-store.ts} (72%) rename src/lib/{logger.js => logger.ts} (56%) rename src/test/fixtures/{no-logger.js => no-logger.ts} (70%) diff --git a/src/lib/db/event-store.test.js b/src/lib/db/event-store.test.ts similarity index 51% rename from src/lib/db/event-store.test.js rename to src/lib/db/event-store.test.ts index 0bfe99b574..ae906608a2 100644 --- a/src/lib/db/event-store.test.js +++ b/src/lib/db/event-store.test.ts @@ -1,15 +1,22 @@ -const test = require('ava'); -const EventStore = require('./event-store'); -const getLogger = require('../../test/fixtures/no-logger'); +import test from 'ava'; +import knex from 'knex'; +import EventStore from './event-store'; +import getLogger from '../../test/fixtures/no-logger'; test('Trying to get events if db fails should yield empty list', async t => { - const store = new EventStore({}, getLogger); + const db = knex({ + client: 'pg', + }); + const store = new EventStore(db, getLogger); const events = await store.getEvents(); t.is(events.length, 0); }); test('Trying to get events by name if db fails should yield empty list', async t => { - const store = new EventStore({}, getLogger); + const db = knex({ + client: 'pg', + }); + const store = new EventStore(db, getLogger); const events = await store.getEventsFilterByName('application-created'); t.truthy(events); t.is(events.length, 0); diff --git a/src/lib/db/event-store.js b/src/lib/db/event-store.ts similarity index 72% rename from src/lib/db/event-store.js rename to src/lib/db/event-store.ts index b378b37605..cd3e857072 100644 --- a/src/lib/db/event-store.js +++ b/src/lib/db/event-store.ts @@ -1,7 +1,7 @@ -'use strict'; - -const { EventEmitter } = require('events'); -const { DROP_FEATURES } = require('../event-type'); +import { EventEmitter } from 'events'; +import Knex from 'knex'; +import { DROP_FEATURES } from '../event-type'; +import { LogProvider, Logger } from '../logger'; const EVENT_COLUMNS = [ 'id', @@ -12,16 +12,41 @@ const EVENT_COLUMNS = [ 'tags', ]; +interface IEventTable { + id: number; + type: string; + created_by: string; + created_at: Date; + data: any; + tags: []; +} + +interface ICreateEvent { + type: string; + createdBy: string; + data?: any; + tags?: Array; +} + +interface IEvent extends ICreateEvent { + id: number; + createdAt: Date; +} + const TABLE = 'events'; class EventStore extends EventEmitter { - constructor(db, getLogger) { + private db: Knex; + + private logger: Logger; + + constructor(db: Knex, getLogger: LogProvider) { super(); this.db = db; this.logger = getLogger('lib/db/event-store.js'); } - async store(event) { + async store(event: ICreateEvent): Promise { try { const rows = await this.db(TABLE) .insert(this.eventToDbRow(event)) @@ -33,7 +58,7 @@ class EventStore extends EventEmitter { } } - async batchStore(events) { + async batchStore(events: ICreateEvent[]): Promise { try { const savedRows = await this.db(TABLE) .insert(events.map(this.eventToDbRow)) @@ -47,7 +72,7 @@ class EventStore extends EventEmitter { } } - async getEvents() { + async getEvents(): Promise { try { const rows = await this.db .select(EVENT_COLUMNS) @@ -61,7 +86,7 @@ class EventStore extends EventEmitter { } } - async getEventsFilterByName(name) { + async getEventsFilterByName(name: string): Promise { try { const rows = await this.db .select(EVENT_COLUMNS) @@ -83,7 +108,7 @@ class EventStore extends EventEmitter { } } - rowToEvent(row) { + rowToEvent(row: IEventTable): IEvent { return { id: row.id, type: row.type, @@ -94,7 +119,7 @@ class EventStore extends EventEmitter { }; } - eventToDbRow(e) { + eventToDbRow(e: ICreateEvent): any { return { type: e.type, created_by: e.createdBy, @@ -105,3 +130,4 @@ class EventStore extends EventEmitter { } module.exports = EventStore; +export default EventStore; diff --git a/src/lib/logger.js b/src/lib/logger.ts similarity index 56% rename from src/lib/logger.js rename to src/lib/logger.ts index f01d7cfd5a..a31f65bbdb 100644 --- a/src/lib/logger.js +++ b/src/lib/logger.ts @@ -1,18 +1,26 @@ -'use strict'; +import { configure, getLogger, levels } from 'log4js'; -const log4js = require('log4js'); +export type LogProvider = (category?: string) => Logger; -function getDefaultLogProvider() { - let level; +export interface Logger { + debug(message: any, ...args: any[]): void; + info(message: any, ...args: any[]): void; + warn(message: any, ...args: any[]): void; + error(message: any, ...args: any[]): void; + fatal(message: any, ...args: any[]): void; +} + +function getDefaultLogProvider(): LogProvider { + let level: string; if (process.env.NODE_ENV === 'production') { - level = log4js.levels.ERROR.levelStr; + level = levels.ERROR.levelStr; } else if (process.env.NODE_ENV === 'test') { - level = log4js.levels.FATAL.levelStr; + level = levels.FATAL.levelStr; } else { - level = log4js.levels.DEBUG.levelStr; + level = levels.DEBUG.levelStr; } - log4js.configure({ + configure({ appenders: { console: { type: 'console' }, }, @@ -21,20 +29,16 @@ function getDefaultLogProvider() { }, }); - return log4js.getLogger; + return getLogger; } -let loggerProvider = getDefaultLogProvider(); - -function validate(isValid, msg) { +function validate(isValid: boolean, msg: string) { if (!isValid) { throw new TypeError(msg); } } -module.exports.defaultLogProvider = loggerProvider; - -function validateLogProvider(provider) { +export function validateLogProvider(provider: LogProvider): void { validate(typeof provider === 'function', 'Provider needs to be a function'); const logger = provider('unleash:logger'); @@ -44,14 +48,15 @@ function validateLogProvider(provider) { validate(typeof logger.error === 'function', 'Logger must implement error'); } -exports.validateLogProvider = validateLogProvider; +// Deprecated (TODO: remove this in v4) +let loggerProvider = getDefaultLogProvider(); +export const defaultLogProvider = loggerProvider; -// Deprecated -exports.setLoggerProvider = function setLoggerProvider(provider) { +export function setLoggerProvider(provider: LogProvider): void { validateLogProvider(provider); loggerProvider = provider; const logger = provider('unleash:logger'); logger.info(`Your way of configuring a logProvider is deprecated. See https://docs.getunleash.io/docs/deploy/configuring_unleash for details`); -}; +} diff --git a/src/test/fixtures/no-logger.js b/src/test/fixtures/no-logger.ts similarity index 70% rename from src/test/fixtures/no-logger.js rename to src/test/fixtures/no-logger.ts index 7ab506d77f..9192933c36 100644 --- a/src/test/fixtures/no-logger.js +++ b/src/test/fixtures/no-logger.ts @@ -1,14 +1,17 @@ /* eslint-disable no-console */ +import { Logger } from '../../lib/logger'; + let muteError = false; -function noLoggerProvider() { +function noLoggerProvider(): Logger { // do something with the name return { debug: () => {}, info: () => {}, warn: () => {}, error: muteError ? () => {} : console.error, + fatal: console.error, }; } @@ -17,3 +20,4 @@ noLoggerProvider.setMuteError = mute => { }; module.exports = noLoggerProvider; +export default noLoggerProvider;