From 5b88628381f0d95afb80f756404200074dc3606a Mon Sep 17 00:00:00 2001 From: pooya parsa Date: Tue, 25 Feb 2020 14:46:16 +0100 Subject: [PATCH] feat: advanced deprecation --- src/hable.js | 21 +++++++++++++++++---- test/hookable.test.js | 24 ++++++++++++++++-------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/hable.js b/src/hable.js index 17b0037..efa807d 100644 --- a/src/hable.js +++ b/src/hable.js @@ -16,11 +16,24 @@ export default class Hookable { return } - if (this._deprecatedHooks[name]) { - if (process.env.NODE_ENV !== 'production') { - this._logger.warn(`${name} hook has been deprecated, please use ${this._deprecatedHooks[name]}`) + const originalName = name + let deprecatedHook + while (this._deprecatedHooks[name]) { + deprecatedHook = this._deprecatedHooks[name] + if (typeof deprecatedHook === 'string') { + deprecatedHook = { to: deprecatedHook } + } + name = deprecatedHook.newName + } + if (deprecatedHook) { + if (!deprecatedHook.message) { + this._logger.warn( + `${originalName} hook has been deprecated` + + (deprecatedHook.to ? `, please use ${deprecatedHook.to}` : '') + ) + } else { + this._logger.warn(deprecatedHook.message) } - name = this._deprecatedHooks[name] } this._hooks[name] = this._hooks[name] || [] diff --git a/test/hookable.test.js b/test/hookable.test.js index 0416bd3..314dd48 100644 --- a/test/hookable.test.js +++ b/test/hookable.test.js @@ -46,15 +46,23 @@ describe('core: hookable', () => { expect(hook._hooks['test:hook']).toBeUndefined() }) - test('should convert and display deprecated hook', () => { + test('should convert and display deprecated hooks', () => { const hook = new Hookable() - hook.deprecateHook('test:hook', 'test:before') - - hook.hook('test:hook', () => { }) - - expect(console.warn).toBeCalledWith('test:hook hook has been deprecated, please use test:before') - expect(hook._hooks['test:hook']).toBeUndefined() - expect(hook._hooks['test:before']).toEqual([expect.any(Function)]) + hook.deprecateHook('a', 'b') + hook.deprecateHook('b', { to: 'c' }) + hook.deprecateHook('x', { to: 'y', message: 'Custom' }) + + hook.hook('a', () => { }) + hook.hook('b', () => { }) + hook.hook('c', () => { }) + hook.hook('x', () => { }) + + expect(console.warn).toBeCalledWith('a hook has been deprecated, please use c') + expect(console.warn).toBeCalledWith('b hook has been deprecated, please use c') + expect(console.warn).toBeCalledWith('Custom') + expect(hook._hooks.a).toBeUndefined() + expect(hook._hooks.b).toBeUndefined() + expect(hook._hooks.c).toEqual([expect.any(Function), expect.any(Function), expect.any(Function)]) }) test('deprecateHooks', () => {