From 59df93a6a3202c7f9e9cdbfd4547c66017e35e93 Mon Sep 17 00:00:00 2001 From: Kevin Deng Date: Sun, 30 Nov 2025 07:16:01 +0800 Subject: [PATCH] fix: prevent register twice --- src/index.ts | 10 +++++++++- tests/index.test.js | 16 ++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 80b9aa9..7f568e6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,11 +11,15 @@ declare global { } } +let deregister: (() => void) | undefined + export function init(): () => void { if (!module.registerHooks) { throw new Error('import-without-cache requires Node.js v20.19.0 or higher.') } + if (deregister) return deregister + const hooks = module.registerHooks({ resolve(specifier, context, nextResolve) { const fromNoCache = @@ -49,7 +53,11 @@ export function init(): () => void { return nextLoad(url, context) }, }) - return hooks.deregister.bind(hooks) + + return (deregister = () => { + hooks.deregister() + deregister = undefined + }) } function cleanupImportAttributes(context: LoadHookContext): void { diff --git a/tests/index.test.js b/tests/index.test.js index 4c96d6b..26d3f85 100644 --- a/tests/index.test.js +++ b/tests/index.test.js @@ -46,10 +46,7 @@ test('import attributes', async () => { deregister() await assert.rejects( - () => - import('./fixtures/mod.js', { - with: { cache: 'no' }, - }), + () => import('./fixtures/mod.js', { with: { cache: 'no' } }), ) }) @@ -66,3 +63,14 @@ test('no-cache protocol', async () => { // @ts-expect-error await assert.rejects(() => import('no-cache://./fixtures/mod.js')) }) + +test('register twice', () => { + const deregister1 = init() + const deregister2 = init() + assert.equal(deregister1, deregister2) + deregister1() + + const deregister3 = init() + assert.notEqual(deregister1, deregister3) + deregister3() +}) -- 2.51.2