diff --git a/src/hookable.ts b/src/hookable.ts index a6f39f2b..ced0e6cc 100644 --- a/src/hookable.ts +++ b/src/hookable.ts @@ -305,6 +305,6 @@ export class HookableCore< if (!hooks || hooks.length === 0) { return; } - return callHooks(hooks, args, 0); + return callHooks(hooks.slice(), args, 0); } } diff --git a/test/bundle.test.ts b/test/bundle.test.ts index 59b89d53..2c92de51 100644 --- a/test/bundle.test.ts +++ b/test/bundle.test.ts @@ -26,8 +26,8 @@ describe("benchmark", () => { if (process.env.DEBUG) { console.log("new HookableCore():", { bytes, gzipSize }); } - expect(bytes).toBeLessThan(642); - expect(gzipSize).toBeLessThan(370); + expect(bytes).toBeLessThan(655); + expect(gzipSize).toBeLessThan(375); }); }); diff --git a/test/hookable.test.ts b/test/hookable.test.ts index 1830bb8a..eceb69d3 100644 --- a/test/hookable.test.ts +++ b/test/hookable.test.ts @@ -13,6 +13,19 @@ describe("HookableCore", () => { await hookable.callHook("test", obj); expect(obj.called).toBe(true); }); + + test("should run remaining hooks when a hook unregisters itself", async () => { + const hookable = new HookableCore(); + let calls = 0; + const unregister = hookable.hook("test", () => { + unregister(); + }); + hookable.hook("test", () => { + calls++; + }); + await hookable.callHook("test"); + expect(calls).toBe(1); + }); }); describe("hookable", () => {