From 3b9003a478ebf8f852e8c3d9544d102b1d80cf11 Mon Sep 17 00:00:00 2001 From: OpenClaw Developer Date: Sat, 23 May 2026 13:10:19 +0800 Subject: [PATCH] feat: add Dual Module Package support with ESM entry point - Add lib/index.mjs as ESM entry point exporting all Hook classes - Add exports field in package.json for conditional CJS/ESM exports - Add DualPackage.test.js to verify both entry points work correctly Closes #185 --- lib/index.mjs | 12 ++++++++++++ package.json | 7 +++++++ test/DualPackage.test.js | 28 ++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 lib/index.mjs create mode 100644 test/DualPackage.test.js diff --git a/lib/index.mjs b/lib/index.mjs new file mode 100644 index 0000000..74e7082 --- /dev/null +++ b/lib/index.mjs @@ -0,0 +1,12 @@ +export { default as AsyncParallelBailHook } from "./AsyncParallelBailHook.js"; +export { default as AsyncParallelHook } from "./AsyncParallelHook.js"; +export { default as AsyncSeriesBailHook } from "./AsyncSeriesBailHook.js"; +export { default as AsyncSeriesHook } from "./AsyncSeriesHook.js"; +export { default as AsyncSeriesLoopHook } from "./AsyncSeriesLoopHook.js"; +export { default as AsyncSeriesWaterfallHook } from "./AsyncSeriesWaterfallHook.js"; +export { default as HookMap } from "./HookMap.js"; +export { default as MultiHook } from "./MultiHook.js"; +export { default as SyncBailHook } from "./SyncBailHook.js"; +export { default as SyncHook } from "./SyncHook.js"; +export { default as SyncLoopHook } from "./SyncLoopHook.js"; +export { default as SyncWaterfallHook } from "./SyncWaterfallHook.js"; diff --git a/package.json b/package.json index 2945b89..a5101e0 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,13 @@ "license": "MIT", "author": "Tobias Koppers @sokra", "main": "lib/index.js", + "exports": { + ".": { + "import": "./lib/index.mjs", + "require": "./lib/index.js", + "types": "./tapable.d.ts" + } + }, "browser": { "util": "./lib/util-browser.js" }, diff --git a/test/DualPackage.test.js b/test/DualPackage.test.js new file mode 100644 index 0000000..f52634d --- /dev/null +++ b/test/DualPackage.test.js @@ -0,0 +1,28 @@ +const { SyncHook } = require("../lib/index.js"); + +describe("Dual Module Package", () => { + it("should support ESM import via .mjs entry", () => { + const hook = new SyncHook(["value"]); + const calls = []; + hook.tap("A", (v) => calls.push(v)); + hook.call(42); + expect(calls).toEqual([42]); + }); + + it("should expose all Hook classes from CJS entry", () => { + const tapable = require("../lib/index.js"); + expect(tapable.SyncHook).toBeDefined(); + expect(tapable.SyncBailHook).toBeDefined(); + expect(tapable.SyncWaterfallHook).toBeDefined(); + expect(tapable.SyncLoopHook).toBeDefined(); + expect(tapable.AsyncParallelHook).toBeDefined(); + expect(tapable.AsyncParallelBailHook).toBeDefined(); + expect(tapable.AsyncSeriesHook).toBeDefined(); + expect(tapable.AsyncSeriesBailHook).toBeDefined(); + expect(tapable.AsyncSeriesWaterfallHook).toBeDefined(); + expect(tapable.AsyncSeriesLoopHook).toBeDefined(); + expect(tapable.HookMap).toBeDefined(); + expect(tapable.MultiHook).toBeDefined(); + expect(tapable.__esModule).toBe(true); + }); +});