From 0e7f182353cc090768e44cfe8e5ac1483d2183fb Mon Sep 17 00:00:00 2001
From: shlroland <shlroland1995@gmail.com>
Date: Tue, 17 Dec 2024 20:53:13 +0800
Subject: [PATCH] add esm exports

---
 package.json                          | 15 +++++++++++++--
 test/bit-set-test.js                  |  2 +-
 test/bloom-filter-test.js             |  2 +-
 test/bucket-test.js                   |  2 +-
 test/compatibility-test.js            |  2 +-
 test/count-min-sketch-test.js         |  2 +-
 test/counting-bloom-filter-test.js    |  2 +-
 test/cuckoo-filter-test.js            |  2 +-
 test/hyperloglog-test.js              |  2 +-
 test/iblt-test.js                     |  2 +-
 test/min-hash-test.js                 |  2 +-
 test/partitioned-bloom-filter-test.js |  2 +-
 test/scalable-bloom-filter-test.js    |  2 +-
 test/topk-test.js                     |  2 +-
 test/utils-test.js                    |  6 +++---
 test/xor-filter-test.js               |  2 +-
 tsconfig.esm.json                     | 12 ++++++++++++
 tsconfig.json                         | 10 ++++++----
 18 files changed, 48 insertions(+), 23 deletions(-)
 create mode 100644 tsconfig.esm.json

diff --git a/package.json b/package.json
index 70be52bb..7709f71a 100644
--- a/package.json
+++ b/package.json
@@ -2,10 +2,21 @@
   "name": "bloom-filters",
   "version": "3.0.4",
   "description": "JS implementation of probabilistic data structures: Bloom Filter (and its derived), HyperLogLog, Count-Min Sketch, Top-K and MinHash",
-  "main": "dist/api.js",
+  "main": "dist/cjs/api.js",
+  "module": "dist/esm/api.js",
+  "types": "dist/esm/api.d.ts",
+  "exports": {
+    ".": {
+      "require": "./dist/cjs/api.js",
+      "import": "./dist/esm/api.js",
+      "types": "./dist/esm/api.d.ts"
+    }
+  },
   "type": "commonjs",
   "scripts": {
-    "build": "tsc",
+    "build": "yarn build:cjs && yarn build:esm",
+    "build:cjs": "tsc -p tsconfig.json",
+    "build:esm": "tsc -p tsconfig.esm.json",
     "pretest": "yarn lint && yarn build",
     "test": "mocha test/**/*-test.js --trace-deprecation --timeout=60000",
     "doc": "typedoc --sort alphabetical --out docs/ --emit both --includeVersion src/api.ts",
diff --git a/test/bit-set-test.js b/test/bit-set-test.js
index 959dff32..d7cef112 100644
--- a/test/bit-set-test.js
+++ b/test/bit-set-test.js
@@ -23,7 +23,7 @@ SOFTWARE.
 */
 
 require('chai').should()
-const {BitSet} = require('../dist/api')
+const {BitSet} = require('../dist/cjs/api.js')
 
 describe('BitSet', () => {
   it('is initially clear', () => {
diff --git a/test/bloom-filter-test.js b/test/bloom-filter-test.js
index b7c77b6f..458e960f 100644
--- a/test/bloom-filter-test.js
+++ b/test/bloom-filter-test.js
@@ -23,7 +23,7 @@ SOFTWARE.
 */
 
 require('chai').should()
-const {BloomFilter} = require('../dist/api.js')
+const {BloomFilter} = require('../dist/cjs/api.js')
 
 describe('BloomFilter', () => {
   const targetRate = 0.1
diff --git a/test/bucket-test.js b/test/bucket-test.js
index 8e53cd5e..ca595d82 100644
--- a/test/bucket-test.js
+++ b/test/bucket-test.js
@@ -23,7 +23,7 @@ SOFTWARE.
 */
 
 require('chai').should()
-const Bucket = require('../dist/cuckoo/bucket.js').default
+const Bucket = require('../dist/cjs/cuckoo/bucket.js').default
 
 describe('Bucket', () => {
   describe('#isFree', () => {
diff --git a/test/compatibility-test.js b/test/compatibility-test.js
index 661b356c..0cb0d4ca 100644
--- a/test/compatibility-test.js
+++ b/test/compatibility-test.js
@@ -24,7 +24,7 @@ SOFTWARE.
 
 require('chai').should()
 const {expect} = require('chai')
-const {BloomFilter, DeprecatedHashing} = require('../dist/api.js')
+const {BloomFilter, DeprecatedHashing} = require('../dist/cjs/api.js')
 
 describe('BloomFilter Compatibility (only) between versions', () => {
   it('1.3.4 compatibility (issue #49)', () => {
diff --git a/test/count-min-sketch-test.js b/test/count-min-sketch-test.js
index f9e4b63e..630b5ee0 100644
--- a/test/count-min-sketch-test.js
+++ b/test/count-min-sketch-test.js
@@ -23,7 +23,7 @@ SOFTWARE.
 */
 
 require('chai').should()
-const {CountMinSketch} = require('../dist/api.js')
+const {CountMinSketch} = require('../dist/cjs/api.js')
 
 describe('CountMinSketch', () => {
   const delta = 0.999
diff --git a/test/counting-bloom-filter-test.js b/test/counting-bloom-filter-test.js
index 262de9cd..2ba7c9d8 100644
--- a/test/counting-bloom-filter-test.js
+++ b/test/counting-bloom-filter-test.js
@@ -23,7 +23,7 @@ SOFTWARE.
 */
 
 require('chai').should()
-const {CountingBloomFilter} = require('../dist/api.js')
+const {CountingBloomFilter} = require('../dist/cjs/api.js')
 
 describe('CountingBloomFilter', () => {
   const targetRate = 0.1
diff --git a/test/cuckoo-filter-test.js b/test/cuckoo-filter-test.js
index 908868f9..60e26b4d 100644
--- a/test/cuckoo-filter-test.js
+++ b/test/cuckoo-filter-test.js
@@ -25,7 +25,7 @@ SOFTWARE.
 const chai = require('chai')
 chai.should()
 chai.expect()
-const {CuckooFilter} = require('../dist/api.js')
+const {CuckooFilter} = require('../dist/cjs/api.js')
 
 describe('CuckooFilter', () => {
   describe('#_locations', () => {
diff --git a/test/hyperloglog-test.js b/test/hyperloglog-test.js
index fbeedfa0..077bf238 100644
--- a/test/hyperloglog-test.js
+++ b/test/hyperloglog-test.js
@@ -23,7 +23,7 @@ SOFTWARE.
 */
 
 require('chai').should()
-const {HyperLogLog} = require('../dist/api.js')
+const {HyperLogLog} = require('../dist/cjs/api.js')
 
 describe('HyperLogLog', () => {
   describe('#update', () => {
diff --git a/test/iblt-test.js b/test/iblt-test.js
index b91925aa..0210865a 100644
--- a/test/iblt-test.js
+++ b/test/iblt-test.js
@@ -24,7 +24,7 @@ SOFTWARE.
 
 require('chai').should()
 require('chai').expect()
-const {InvertibleBloomFilter} = require('../dist/api.js')
+const {InvertibleBloomFilter} = require('../dist/cjs/api.js')
 const random = require('random')
 const seedrandom = require('seedrandom')
 
diff --git a/test/min-hash-test.js b/test/min-hash-test.js
index 4bc9802c..1a633ef8 100644
--- a/test/min-hash-test.js
+++ b/test/min-hash-test.js
@@ -23,7 +23,7 @@ SOFTWARE.
 */
 
 require('chai').should()
-const {MinHashFactory, MinHash} = require('../dist/api.js')
+const {MinHashFactory, MinHash} = require('../dist/cjs/api.js')
 const range = require('lodash/range')
 const intersection = require('lodash/intersection')
 const union = require('lodash/union')
diff --git a/test/partitioned-bloom-filter-test.js b/test/partitioned-bloom-filter-test.js
index d5f4173f..6c4a3273 100644
--- a/test/partitioned-bloom-filter-test.js
+++ b/test/partitioned-bloom-filter-test.js
@@ -23,7 +23,7 @@ SOFTWARE.
 */
 
 require('chai').should()
-const {PartitionedBloomFilter} = require('../dist/api.js')
+const {PartitionedBloomFilter} = require('../dist/cjs/api.js')
 
 describe('PartitionedBloomFilter', () => {
   const targetRate = 0.001
diff --git a/test/scalable-bloom-filter-test.js b/test/scalable-bloom-filter-test.js
index 53d96cb7..956df7b9 100644
--- a/test/scalable-bloom-filter-test.js
+++ b/test/scalable-bloom-filter-test.js
@@ -24,7 +24,7 @@ SOFTWARE.
 
 require('chai').should()
 const {expect} = require('chai')
-const {ScalableBloomFilter} = require('../dist/api.js')
+const {ScalableBloomFilter} = require('../dist/cjs/api.js')
 
 describe('ScalableBloomFilter', () => {
   const targetRate = 0.1
diff --git a/test/topk-test.js b/test/topk-test.js
index 2aaa8e03..e64d0dff 100644
--- a/test/topk-test.js
+++ b/test/topk-test.js
@@ -23,7 +23,7 @@ SOFTWARE.
 */
 
 require('chai').should()
-const {TopK} = require('../dist/api.js')
+const {TopK} = require('../dist/cjs/api.js')
 
 describe('TopK', () => {
   const lessThanOrEqualTestCaseItems = [
diff --git a/test/utils-test.js b/test/utils-test.js
index ce0c1b66..c04d05b5 100644
--- a/test/utils-test.js
+++ b/test/utils-test.js
@@ -29,12 +29,12 @@ const {
   xorBuffer,
   getDefaultSeed,
   isEmptyBuffer,
-} = require('../dist/utils')
-const {BloomFilter, BaseFilter} = require('../dist/api.js')
+} = require('../dist/cjs/utils.js')
+const {BloomFilter, BaseFilter} = require('../dist/cjs/api.js')
 const XXH = require('xxhashjs')
 const range = require('lodash/range')
 const seed = getDefaultSeed()
-const {Hashing} = require('../dist/api')
+const {Hashing} = require('../dist/cjs/api.js')
 
 describe('Utils', () => {
   describe('#allocateArray', () => {
diff --git a/test/xor-filter-test.js b/test/xor-filter-test.js
index 42989153..3bbb8c38 100644
--- a/test/xor-filter-test.js
+++ b/test/xor-filter-test.js
@@ -23,7 +23,7 @@ SOFTWARE.
 */
 
 require('chai').should()
-const {XorFilter} = require('../dist/api.js')
+const {XorFilter} = require('../dist/cjs/api.js')
 
 describe('XorFilter', () => {
   const elements = ['1']
diff --git a/tsconfig.esm.json b/tsconfig.esm.json
new file mode 100644
index 00000000..4eabd2df
--- /dev/null
+++ b/tsconfig.esm.json
@@ -0,0 +1,12 @@
+{
+  "extends": "./tsconfig.json",
+  "compilerOptions": {
+    "module": "esnext",
+    "moduleResolution": "node",
+    "outDir": "./dist/esm",
+    "target": "es2015",
+    "experimentalDecorators": true,
+    "emitDecoratorMetadata": true,
+    "declaration": true
+  }
+}
diff --git a/tsconfig.json b/tsconfig.json
index 647abdad..acf0a246 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,10 +2,12 @@
   "compilerOptions": {
     "rootDir": "./src",
     "target": "es5",
-    "outDir": "./dist",
+    "outDir": "./dist/cjs",
     "module": "commonjs",
-    "lib": [ "ES2015" ],
-    "declaration": true,
+    "lib": [
+      "ES2015"
+    ],
+    "declaration": false,
     "strict": true,
     "allowJs": true,
     "esModuleInterop": true,
@@ -14,7 +16,7 @@
     "downlevelIteration": true
   },
   "include": [
-      "./src/**/*"
+    "./src/**/*"
   ],
   "exclude": [
     "node_modules/",