Skip to content

Commit

Permalink
feat(types): implement strict types
Browse files Browse the repository at this point in the history
  • Loading branch information
pooya parsa committed Apr 17, 2020
1 parent 7fd52df commit 823cdca
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 24 deletions.
29 changes: 15 additions & 14 deletions src/hookable.ts
@@ -1,12 +1,12 @@
import { serial, flatHooks } from './utils'
import { Logger } from './types'
import { LoggerT, hookFnT, configHooksT, deprecatedHookT, deprecatedHooksT } from './types'

export default class Hookable {
private _hooks: object
private _deprecatedHooks: object
private _logger: Logger | false
private _hooks: { [name: string]: hookFnT[] }
private _deprecatedHooks: deprecatedHooksT
private _logger: LoggerT | false

constructor (logger: Logger | false = console) {
constructor (logger: LoggerT | false = console) {
this._logger = logger
this._hooks = {}
this._deprecatedHooks = {}
Expand All @@ -16,9 +16,9 @@ export default class Hookable {
this.callHook = this.callHook.bind(this)
}

hook (name, fn) {
hook (name: string, fn: hookFnT): hookFnT {
if (!name || typeof fn !== 'function') {
return
return () => { }
}

const originalName = name
Expand Down Expand Up @@ -47,12 +47,13 @@ export default class Hookable {
return () => {
if (fn) {
this.removeHook(name, fn)
// @ts-ignore
fn = null // Free memory
}
}
}

removeHook (name, fn) {
removeHook (name: string, fn: hookFnT) {
if (this._hooks[name]) {
const idx = this._hooks[name].indexOf(fn)

Expand All @@ -66,15 +67,15 @@ export default class Hookable {
}
}

deprecateHook (old, name) {
this._deprecatedHooks[old] = name
deprecateHook (name: string, deprecated: deprecatedHookT) {
this._deprecatedHooks[name] = deprecated
}

deprecateHooks (deprecatedHooks) {
deprecateHooks (deprecatedHooks: deprecatedHooksT) {
Object.assign(this._deprecatedHooks, deprecatedHooks)
}

addHooks (configHooks) {
addHooks (configHooks: configHooksT) {
const hooks = flatHooks(configHooks)
const removeFns = Object.keys(hooks).map(key => this.hook(key, hooks[key]))

Expand All @@ -85,14 +86,14 @@ export default class Hookable {
}
}

removeHooks (configHooks) {
removeHooks (configHooks: configHooksT) {
const hooks = flatHooks(configHooks)
for (const key in hooks) {
this.removeHook(key, hooks[key])
}
}

async callHook (name, ...args) {
async callHook (name: string, ...args: any) {
if (!this._hooks[name]) {
return
}
Expand Down
16 changes: 10 additions & 6 deletions src/types.ts
@@ -1,8 +1,12 @@
export type unregHook = () => {}
export type hookFn = (...args: any) => Promise<void> | void
export type unregHookT = () => void
export type hookFnT = (...args: any) => Promise<void> | void
export type configHooksT = { [name: string]: configHooksT | hookFnT }
export type deprecatedHookT = string | { message: string, to: string }
export type deprecatedHooksT = { [name: string]: deprecatedHookT}
export type flatHooksT = { [name: string]: hookFnT }

export interface Logger {
error(...args: any),
fatal?(...args: any),
warn?(...args: any)
export interface LoggerT {
error(...args: any): void,
fatal?(...args: any): void,
warn(...args: any): void
}
8 changes: 5 additions & 3 deletions src/utils.ts
@@ -1,4 +1,6 @@
export function flatHooks (configHooks, hooks = {}, parentName?) {
import { configHooksT, flatHooksT } from './types'

export function flatHooks (configHooks: configHooksT, hooks: flatHooksT = {}, parentName?: string): flatHooksT {
for (const key in configHooks) {
const subHook = configHooks[key]
const name = parentName ? `${parentName}:${key}` : key
Expand All @@ -11,6 +13,6 @@ export function flatHooks (configHooks, hooks = {}, parentName?) {
return hooks
}

export function serial (tasks, fn) {
return tasks.reduce((promise, task) => promise.then(previous => fn(task, previous)), Promise.resolve(null))
export function serial<T> (tasks: T[], fn: (task: T) => Promise<any> | any) {
return tasks.reduce((promise, task) => promise.then(() => fn(task)), Promise.resolve(null))
}
2 changes: 1 addition & 1 deletion tsconfig.json
Expand Up @@ -4,7 +4,7 @@
"module": "ESNext",
"importHelpers": false,
"noEmitHelpers": true,
"strict": false,
"strict": true,
"esModuleInterop": true,
"outDir": "dist",
"declaration": true,
Expand Down

0 comments on commit 823cdca

Please sign in to comment.