瀏覽代碼

Test: drop `bun:test`, replace w/ mocha and chai

SukkaW 1 年之前
父節點
當前提交
a7a05e9901
共有 7 個文件被更改,包括 509 次插入141 次删除
  1. 1 1
      .node-version
  2. 8 13
      Build/lib/aho-corasick.test.ts
  3. 1 2
      Build/lib/get-phishing-domains.test.ts
  4. 11 12
      Build/lib/stable-sort-domain.test.ts
  5. 104 102
      Build/lib/trie.test.ts
  6. 6 1
      package.json
  7. 378 10
      pnpm-lock.yaml

+ 1 - 1
.node-version

@@ -1 +1 @@
-20
+22

+ 8 - 13
Build/lib/aho-corasick.test.ts

@@ -1,22 +1,17 @@
-// eslint-disable-next-line import-x/no-unresolved -- bun
-import { describe, expect, it } from 'bun:test';
+import { describe, it } from 'mocha';
+import { expect } from 'chai';
 import createKeywordFilter from './aho-corasick';
 
 describe('AhoCorasick', () => {
   it('basic', () => {
     let kwfilter = createKeywordFilter(['ap', 'an']);
-    expect(kwfilter('bananan')).toBeTrue();
-    expect(kwfilter('apple')).toBeTrue();
-    expect(kwfilter('melon')).toBeFalse();
-
-    console.log(kwfilter);
+    expect(kwfilter('bananan')).to.equal(true);
+    expect(kwfilter('apple')).to.equal(true);
+    expect(kwfilter('melon')).to.equal(false);
 
     kwfilter = createKeywordFilter(['cdn', 'sukka']);
-    expect(kwfilter('bananan')).toBeFalse();
-    expect(kwfilter('apple')).toBeFalse();
-    expect(kwfilter('melon')).toBeFalse();
-
-    console.log(kwfilter);
-    console.log(createKeywordFilter(['skk.moe', 'anotherskk', 'skk.com']));
+    expect(kwfilter('bananan')).to.equal(false);
+    expect(kwfilter('apple')).to.equal(false);
+    expect(kwfilter('melon')).to.equal(false);
   });
 });

+ 1 - 2
Build/lib/get-phishing-domains.test.ts

@@ -1,5 +1,4 @@
-// eslint-disable-next-line import-x/no-unresolved -- bun
-import { describe, it } from 'bun:test';
+import { describe, it } from 'mocha';
 
 import { calcDomainAbuseScore } from './get-phishing-domains';
 

+ 11 - 12
Build/lib/stable-sort-domain.test.ts

@@ -1,6 +1,5 @@
-// eslint-disable-next-line import-x/no-unresolved -- bun
-import { describe, expect, it } from 'bun:test';
-
+import { describe, it } from 'mocha';
+import { expect } from 'chai';
 import { sortDomains } from './stable-sort-domain';
 
 describe('sortDomains', () => {
@@ -9,7 +8,7 @@ describe('sortDomains', () => {
       '.s3-website.ap-northeast-3.amazonaws.com',
       '.s3.dualstack.ap-south-1.amazonaws.com',
       '.s3-website.af-south-1.amazonaws.com'
-    ])).toStrictEqual([
+    ])).to.deep.equal([
       '.s3-website.af-south-1.amazonaws.com',
       '.s3.dualstack.ap-south-1.amazonaws.com',
       '.s3-website.ap-northeast-3.amazonaws.com'
@@ -19,7 +18,7 @@ describe('sortDomains', () => {
       '.s3.dualstack.ap-south-1.amazonaws.com',
       '.s3-website.ap-northeast-3.amazonaws.com',
       '.s3-website.af-south-1.amazonaws.com'
-    ])).toStrictEqual([
+    ])).to.deep.equal([
       '.s3-website.af-south-1.amazonaws.com',
       '.s3.dualstack.ap-south-1.amazonaws.com',
       '.s3-website.ap-northeast-3.amazonaws.com'
@@ -28,7 +27,7 @@ describe('sortDomains', () => {
     expect(sortDomains([
       '.s3-website-us-west-2.amazonaws.com',
       '.s3-1.amazonaws.com'
-    ])).toStrictEqual([
+    ])).to.deep.equal([
       '.s3-1.amazonaws.com',
       '.s3-website-us-west-2.amazonaws.com'
     ]);
@@ -36,7 +35,7 @@ describe('sortDomains', () => {
     expect(sortDomains([
       '.s3-1.amazonaws.com',
       '.s3-website-us-west-2.amazonaws.com'
-    ])).toStrictEqual([
+    ])).to.deep.equal([
       '.s3-1.amazonaws.com',
       '.s3-website-us-west-2.amazonaws.com'
     ]);
@@ -47,7 +46,7 @@ describe('sortDomains', () => {
         '.s3-accesspoint.dualstack.us-west-2.amazonaws.com',
         '.s3.dualstack.us-west-2.amazonaws.com'
       ])
-    ).toStrictEqual([
+    ).to.deep.equal([
       '.s3.dualstack.us-west-2.amazonaws.com',
       '.s3-deprecated.us-west-2.amazonaws.com',
       '.s3-accesspoint.dualstack.us-west-2.amazonaws.com'
@@ -59,7 +58,7 @@ describe('sortDomains', () => {
         '.s3-accesspoint.dualstack.us-west-2.amazonaws.com',
         '.s3.dualstack.us-west-2.amazonaws.com'
       ])
-    ).toStrictEqual([
+    ).to.deep.equal([
       '.s3.dualstack.us-west-2.amazonaws.com',
       '.s3-deprecated.us-west-2.amazonaws.com',
       '.s3-accesspoint.dualstack.us-west-2.amazonaws.com'
@@ -70,7 +69,7 @@ describe('sortDomains', () => {
         '.ec2-25-58-215-234.us-east-2.compute.amazonaws.com',
         '.ec2-13-58-215-234.us-east-2.compute.amazonaws.com'
       ])
-    ).toStrictEqual([
+    ).to.deep.equal([
       '.ec2-13-58-215-234.us-east-2.compute.amazonaws.com',
       '.ec2-25-58-215-234.us-east-2.compute.amazonaws.com'
     ]);
@@ -81,7 +80,7 @@ describe('sortDomains', () => {
       '.notice.samsungcloudsolution.com',
       'samsungqbe.com',
       'samsungcloudsolution.com'
-    ])).toStrictEqual([
+    ])).to.deep.equal([
       'samsungqbe.com',
       'samsungcloudsolution.com',
       '.notice.samsungcloudsolution.com'
@@ -118,7 +117,7 @@ describe('sortDomains', () => {
         '.rwww.samsungotn.net',
         '.samsungpoland.com.pl'
       ])
-    ).toStrictEqual([
+    ).to.deep.equal([
       '.gld.samsungosp.com',
       '.rwww.samsungotn.net',
       'samsungqbe.com',

+ 104 - 102
Build/lib/trie.test.ts

@@ -1,6 +1,6 @@
 import { createTrie } from './trie';
-// eslint-disable-next-line import-x/no-unresolved -- fuck eslint-import
-import { describe, expect, it } from 'bun:test';
+import { describe, it } from 'mocha';
+import { expect } from 'chai';
 
 describe('Trie', () => {
   it('should be possible to add items to a Trie.', () => {
@@ -10,14 +10,14 @@ describe('Trie', () => {
     trie.add('ukka');
     trie.add('akku');
 
-    expect(trie.size).toBe(3);
+    expect(trie.size).to.equal(3);
 
-    expect(trie.has('sukka')).toBeTrue();
-    expect(trie.has('ukka')).toBeTrue();
-    expect(trie.has('akku')).toBeTrue();
-    expect(trie.has('noc')).toBeFalse();
-    expect(trie.has('suk')).toBeFalse();
-    expect(trie.has('sukkaw')).toBeFalse();
+    expect(trie.has('sukka')).to.equal(true);
+    expect(trie.has('ukka')).to.equal(true);
+    expect(trie.has('akku')).to.equal(true);
+    expect(trie.has('noc')).to.equal(false);
+    expect(trie.has('suk')).to.equal(false);
+    expect(trie.has('sukkaw')).to.equal(false);
   });
 
   it('should be possible to add domains to a Trie (hostname).', () => {
@@ -27,14 +27,14 @@ describe('Trie', () => {
     trie.add('skk.moe');
     trie.add('anotherskk.moe');
 
-    expect(trie.size).toBe(3);
+    expect(trie.size).to.equal(3);
 
-    expect(trie.has('a.skk.moe')).toBeTrue();
-    expect(trie.has('skk.moe')).toBeTrue();
-    expect(trie.has('anotherskk.moe')).toBeTrue();
-    expect(trie.has('example.com')).toBeFalse();
-    expect(trie.has('skk.mo')).toBeFalse();
-    expect(trie.has('another.skk.moe')).toBeFalse();
+    expect(trie.has('a.skk.moe')).to.equal(true);
+    expect(trie.has('skk.moe')).to.equal(true);
+    expect(trie.has('anotherskk.moe')).to.equal(true);
+    expect(trie.has('example.com')).to.equal(false);
+    expect(trie.has('skk.mo')).to.equal(false);
+    expect(trie.has('another.skk.moe')).to.equal(false);
   });
 
   it('adding the same item several times should not increase size.', () => {
@@ -44,8 +44,8 @@ describe('Trie', () => {
     trie.add('erat');
     trie.add('rat');
 
-    expect(trie.size).toBe(2);
-    expect(trie.has('rat')).toBeTrue();
+    expect(trie.size).to.equal(2);
+    expect(trie.has('rat')).to.equal(true);
   });
 
   it('adding the same item several times should not increase size (hostname).', () => {
@@ -55,19 +55,19 @@ describe('Trie', () => {
     trie.add('blog.skk.moe');
     trie.add('skk.moe');
 
-    expect(trie.size).toBe(2);
-    expect(trie.has('skk.moe')).toBeTrue();
+    expect(trie.size).to.equal(2);
+    expect(trie.has('skk.moe')).to.equal(true);
   });
 
   it('should be possible to set the null sequence.', () => {
     let trie = createTrie();
 
     trie.add('');
-    expect(trie.has('')).toBeTrue();
+    expect(trie.has('')).to.equal(true);
 
     trie = createTrie(null, true);
     trie.add('');
-    expect(trie.has('')).toBeTrue();
+    expect(trie.has('')).to.equal(true);
   });
 
   it('should be possible to delete items.', () => {
@@ -77,20 +77,20 @@ describe('Trie', () => {
     trie.add('rate');
     trie.add('tar');
 
-    expect(trie.delete('')).toBeFalse();
-    expect(trie.delete('')).toBeFalse();
-    expect(trie.delete('hello')).toBeFalse();
+    expect(trie.delete('')).to.equal(false);
+    expect(trie.delete('')).to.equal(false);
+    expect(trie.delete('hello')).to.equal(false);
 
-    expect(trie.delete('rat')).toBeTrue();
-    expect(trie.has('rat')).toBeFalse();
-    expect(trie.has('rate')).toBeTrue();
+    expect(trie.delete('rat')).to.equal(true);
+    expect(trie.has('rat')).to.equal(false);
+    expect(trie.has('rate')).to.equal(true);
 
-    expect(trie.size).toBe(2);
+    expect(trie.size).to.equal(2);
 
-    expect(trie.delete('rate')).toBeTrue();
-    expect(trie.size).toBe(1);
-    expect(trie.delete('tar')).toBeTrue();
-    expect(trie.size).toBe(0);
+    expect(trie.delete('rate')).to.equal(true);
+    expect(trie.size).to.equal(1);
+    expect(trie.delete('tar')).to.equal(true);
+    expect(trie.size).to.equal(0);
   });
 
   it('should be possible to delete items (hostname).', () => {
@@ -100,20 +100,20 @@ describe('Trie', () => {
     trie.add('example.com');
     trie.add('moe.sb');
 
-    expect(trie.delete('')).toBeFalse();
-    expect(trie.delete('')).toBeFalse();
-    expect(trie.delete('example.org')).toBeFalse();
+    expect(trie.delete('')).to.equal(false);
+    expect(trie.delete('')).to.equal(false);
+    expect(trie.delete('example.org')).to.equal(false);
 
-    expect(trie.delete('skk.moe')).toBeTrue();
-    expect(trie.has('skk.moe')).toBeFalse();
-    expect(trie.has('moe.sb')).toBeTrue();
+    expect(trie.delete('skk.moe')).to.equal(true);
+    expect(trie.has('skk.moe')).to.equal(false);
+    expect(trie.has('moe.sb')).to.equal(true);
 
-    expect(trie.size).toBe(2);
+    expect(trie.size).to.equal(2);
 
-    expect(trie.delete('example.com')).toBeTrue();
-    expect(trie.size).toBe(1);
-    expect(trie.delete('moe.sb')).toBeTrue();
-    expect(trie.size).toBe(0);
+    expect(trie.delete('example.com')).to.equal(true);
+    expect(trie.size).to.equal(1);
+    expect(trie.delete('moe.sb')).to.equal(true);
+    expect(trie.size).to.equal(0);
   });
 
   it('should be possible to check the existence of a sequence in the Trie.', () => {
@@ -121,10 +121,10 @@ describe('Trie', () => {
 
     trie.add('romanesque');
 
-    expect(trie.has('romanesque')).toBe(true);
-    expect(trie.has('roman')).toBe(false);
-    expect(trie.has('esque')).toBe(false);
-    expect(trie.has('')).toBe(false);
+    expect(trie.has('romanesque')).to.equal(true);
+    expect(trie.has('roman')).to.equal(false);
+    expect(trie.has('esque')).to.equal(false);
+    expect(trie.has('')).to.equal(false);
   });
 
   it('should be possible to check the existence of a sequence in the Trie (hostname).', () => {
@@ -132,10 +132,10 @@ describe('Trie', () => {
 
     trie.add('example.org.skk.moe');
 
-    expect(trie.has('example.org.skk.moe')).toBe(true);
-    expect(trie.has('skk.moe')).toBe(false);
-    expect(trie.has('example.org')).toBe(false);
-    expect(trie.has('')).toBe(false);
+    expect(trie.has('example.org.skk.moe')).to.equal(true);
+    expect(trie.has('skk.moe')).to.equal(false);
+    expect(trie.has('example.org')).to.equal(false);
+    expect(trie.has('')).to.equal(false);
   });
 
   it('should be possible to retrieve items matching the given prefix.', () => {
@@ -146,12 +146,12 @@ describe('Trie', () => {
     trie.add('sesqueroman');
     trie.add('greek');
 
-    expect(trie.find('roman')).toEqual(['roman', 'esqueroman', 'sesqueroman']);
-    expect(trie.find('man')).toEqual(['roman', 'esqueroman', 'sesqueroman']);
-    expect(trie.find('esqueroman')).toEqual(['esqueroman', 'sesqueroman']);
-    expect(trie.find('eek')).toEqual(['greek']);
-    expect(trie.find('hello')).toEqual([]);
-    expect(trie.find('')).toEqual(['greek', 'roman', 'esqueroman', 'sesqueroman']);
+    expect(trie.find('roman')).to.deep.equal(['roman', 'esqueroman', 'sesqueroman']);
+    expect(trie.find('man')).to.deep.equal(['roman', 'esqueroman', 'sesqueroman']);
+    expect(trie.find('esqueroman')).to.deep.equal(['esqueroman', 'sesqueroman']);
+    expect(trie.find('eek')).to.deep.equal(['greek']);
+    expect(trie.find('hello')).to.deep.equal([]);
+    expect(trie.find('')).to.deep.equal(['greek', 'roman', 'esqueroman', 'sesqueroman']);
   });
 
   it('should be possible to retrieve items matching the given prefix (hostname).', () => {
@@ -162,54 +162,56 @@ describe('Trie', () => {
     trie.add('cdn.example.com');
     trie.add('example.org');
 
-    expect(trie.find('example.com')).toEqual(['example.com', 'cdn.example.com', 'blog.example.com']);
-    expect(trie.find('com')).toEqual(['example.com', 'cdn.example.com', 'blog.example.com']);
-    expect(trie.find('.example.com')).toEqual(['cdn.example.com', 'blog.example.com']);
-    expect(trie.find('org')).toEqual(['example.org']);
-    expect(trie.find('example.net')).toEqual([]);
-    expect(trie.find('')).toEqual(['example.org', 'example.com', 'cdn.example.com', 'blog.example.com']);
+    expect(trie.find('example.com')).to.deep.equal(['example.com', 'cdn.example.com', 'blog.example.com']);
+    expect(trie.find('com')).to.deep.equal(['example.com', 'cdn.example.com', 'blog.example.com']);
+    expect(trie.find('.example.com')).to.deep.equal(['cdn.example.com', 'blog.example.com']);
+    expect(trie.find('org')).to.deep.equal(['example.org']);
+    expect(trie.find('example.net')).to.deep.equal([]);
+    expect(trie.find('')).to.deep.equal(['example.org', 'example.com', 'cdn.example.com', 'blog.example.com']);
   });
 
   it('should be possible to create a trie from an arbitrary iterable.', () => {
     let trie = createTrie(['roman', 'esqueroman']);
 
-    expect(trie.size).toBe(2);
-    expect(trie.has('roman')).toBe(true);
+    expect(trie.size).to.equal(2);
+    expect(trie.has('roman')).to.equal(true);
 
     trie = createTrie(new Set(['skk.moe', 'example.com']), true);
-    expect(trie.size).toBe(2);
-    expect(trie.has('skk.moe')).toBe(true);
+    expect(trie.size).to.equal(2);
+    expect(trie.has('skk.moe')).to.equal(true);
   });
 });
 
-describe.each([
+([
   ['hostname mode off', false],
   ['hostname mode on', true]
-])('surge domainset dedupe %s', (_, hostnameMode) => {
-  it('should not remove same entry', () => {
-    const trie = createTrie(['.skk.moe', 'noc.one'], hostnameMode);
+] as const).forEach(([description, hostnameMode]) => {
+  describe('surge domainset dedupe ' + description, () => {
+    it('should not remove same entry', () => {
+      const trie = createTrie(['.skk.moe', 'noc.one'], hostnameMode);
 
-    expect(trie.find('.skk.moe')).toStrictEqual(['.skk.moe']);
-    expect(trie.find('noc.one')).toStrictEqual(['noc.one']);
-  });
+      expect(trie.find('.skk.moe')).to.deep.equal(['.skk.moe']);
+      expect(trie.find('noc.one')).to.deep.equal(['noc.one']);
+    });
 
-  it('should match subdomain - 1', () => {
-    const trie = createTrie(['www.noc.one', 'www.sukkaw.com', 'blog.skk.moe', 'image.cdn.skk.moe', 'cdn.sukkaw.net'], hostnameMode);
+    it('should match subdomain - 1', () => {
+      const trie = createTrie(['www.noc.one', 'www.sukkaw.com', 'blog.skk.moe', 'image.cdn.skk.moe', 'cdn.sukkaw.net'], hostnameMode);
 
-    expect(trie.find('.skk.moe')).toStrictEqual(['image.cdn.skk.moe', 'blog.skk.moe']);
-    expect(trie.find('.sukkaw.com')).toStrictEqual(['www.sukkaw.com']);
-  });
+      expect(trie.find('.skk.moe')).to.deep.equal(['image.cdn.skk.moe', 'blog.skk.moe']);
+      expect(trie.find('.sukkaw.com')).to.deep.equal(['www.sukkaw.com']);
+    });
 
-  it('should match subdomain - 2', () => {
-    const trie = createTrie(['www.noc.one', 'www.sukkaw.com', '.skk.moe', 'blog.skk.moe', 'image.cdn.skk.moe', 'cdn.sukkaw.net'], hostnameMode);
+    it('should match subdomain - 2', () => {
+      const trie = createTrie(['www.noc.one', 'www.sukkaw.com', '.skk.moe', 'blog.skk.moe', 'image.cdn.skk.moe', 'cdn.sukkaw.net'], hostnameMode);
 
-    expect(trie.find('.skk.moe')).toStrictEqual(['.skk.moe', 'image.cdn.skk.moe', 'blog.skk.moe']);
-    expect(trie.find('.sukkaw.com')).toStrictEqual(['www.sukkaw.com']);
-  });
+      expect(trie.find('.skk.moe')).to.deep.equal(['.skk.moe', 'image.cdn.skk.moe', 'blog.skk.moe']);
+      expect(trie.find('.sukkaw.com')).to.deep.equal(['www.sukkaw.com']);
+    });
 
-  it('should not remove non-subdomain', () => {
-    const trie = createTrie(['skk.moe', 'sukkaskk.moe'], hostnameMode);
-    expect(trie.find('.skk.moe')).toStrictEqual([]);
+    it('should not remove non-subdomain', () => {
+      const trie = createTrie(['skk.moe', 'sukkaskk.moe'], hostnameMode);
+      expect(trie.find('.skk.moe')).to.deep.equal([]);
+    });
   });
 });
 
@@ -221,7 +223,7 @@ describe('smol tree', () => {
       '.blog.sub.example.com', 'sub.example.com', 'cdn.sub.example.com', '.sub.example.com'
     ], true, true);
 
-    expect(trie.dump()).toStrictEqual([
+    expect(trie.dump()).to.deep.equal([
       '.sub.example.com',
       'cdn.noc.one', 'www.noc.one',
       '.skk.moe'
@@ -233,7 +235,7 @@ describe('smol tree', () => {
       '.skk.moe', 'blog.skk.moe', '.cdn.skk.moe', 'skk.moe'
     ], true, true);
 
-    expect(trie.dump()).toStrictEqual([
+    expect(trie.dump()).to.deep.equal([
       '.skk.moe'
     ]);
   });
@@ -243,12 +245,12 @@ describe('smol tree', () => {
       '.blog.sub.example.com', 'cdn.sub.example.com', '.sub.example.com'
     ], true, true);
 
-    expect(trie.dump()).toStrictEqual([
+    expect(trie.dump()).to.deep.equal([
       '.sub.example.com'
     ]);
 
     trie.add('.sub.example.com');
-    expect(trie.dump()).toStrictEqual([
+    expect(trie.dump()).to.deep.equal([
       '.sub.example.com'
     ]);
   });
@@ -261,7 +263,7 @@ describe('smol tree', () => {
       'px.cdn.creative.medialytics.com'
     ], true, true);
 
-    expect(trie.dump()).toStrictEqual([
+    expect(trie.dump()).to.deep.equal([
       'cdn.creative.medialytics.com',
       'px.cdn.creative.medialytics.com',
       'commercial.shouji.360.cn',
@@ -277,7 +279,7 @@ describe('smol tree', () => {
       'blog.skk.moe'
     ], true, true);
 
-    expect(trie.dump()).toStrictEqual([
+    expect(trie.dump()).to.deep.equal([
       'anotherskk.moe',
       'blog.anotherskk.moe',
       'skk.moe',
@@ -293,7 +295,7 @@ describe('smol tree', () => {
       'blog.skk.moe'
     ], true, true);
 
-    expect(trie.dump()).toStrictEqual([
+    expect(trie.dump()).to.deep.equal([
       'anotherskk.moe',
       'blog.anotherskk.moe',
       'skk.moe',
@@ -302,20 +304,20 @@ describe('smol tree', () => {
 
     trie.whitelist('.skk.moe');
 
-    expect(trie.dump()).toStrictEqual([
+    expect(trie.dump()).to.deep.equal([
       'anotherskk.moe',
       'blog.anotherskk.moe'
     ]);
 
     trie.whitelist('anotherskk.moe');
-    expect(trie.dump()).toStrictEqual([
+    expect(trie.dump()).to.deep.equal([
       'blog.anotherskk.moe'
     ]);
 
     trie.add('anotherskk.moe');
     trie.whitelist('.anotherskk.moe');
 
-    expect(trie.dump()).toStrictEqual([]);
+    expect(trie.dump()).to.deep.equal([]);
   });
 
   it('should whitelist trie correctly', () => {
@@ -328,22 +330,22 @@ describe('smol tree', () => {
       'cdn.example.com'
     ], true, true);
 
-    expect(trie.dump()).toStrictEqual([
+    expect(trie.dump()).to.deep.equal([
       'cdn.example.com', 'blog.cdn.example.com',
       '.skk.moe',
       '.t.co'
     ]);
 
     trie.whitelist('.t.co');
-    expect(trie.dump()).toStrictEqual([
+    expect(trie.dump()).to.deep.equal([
       'cdn.example.com', 'blog.cdn.example.com',
       '.skk.moe'
     ]);
 
     trie.whitelist('skk.moe');
-    expect(trie.dump()).toStrictEqual(['cdn.example.com', 'blog.cdn.example.com']);
+    expect(trie.dump()).to.deep.equal(['cdn.example.com', 'blog.cdn.example.com']);
 
     trie.whitelist('cdn.example.com');
-    expect(trie.dump()).toStrictEqual(['blog.cdn.example.com']);
+    expect(trie.dump()).to.deep.equal(['blog.cdn.example.com']);
   });
 });

+ 6 - 1
package.json

@@ -14,7 +14,8 @@
     "build": "pnpm run node ./Build/index.ts",
     "build-profile": "pnpm run dexnode -r @swc-node/register ./Build/index.ts",
     "build-webstream": "ENABLE_EXPERIMENTAL_WEBSTREAMS=true pnpm run node ./Build/index.ts",
-    "lint": "eslint --format=sukka ."
+    "lint": "eslint --format=sukka .",
+    "test": "SWCRC=true mocha --require @swc-node/register --watch-extensions ts,tsx"
   },
   "author": "",
   "license": "ISC",
@@ -45,12 +46,16 @@
     "@swc/core": "^1.7.0",
     "@types/async-retry": "^1.4.8",
     "@types/better-sqlite3": "^7.6.11",
+    "@types/chai": "^4.3.16",
+    "@types/mocha": "^10.0.7",
     "@types/punycode": "^2.1.4",
     "@types/tar-stream": "^3.1.3",
+    "chai": "4",
     "eslint": "^9.7.0",
     "eslint-config-sukka": "^6.1.6",
     "eslint-formatter-sukka": "^6.1.6",
     "mitata": "^0.1.11",
+    "mocha": "^10.7.0",
     "typescript": "^5.5.3"
   },
   "packageManager": "pnpm@9.6.0+sha512.38dc6fba8dba35b39340b9700112c2fe1e12f10b17134715a4aa98ccf7bb035e76fd981cf0bb384dfa98f8d6af5481c2bef2f4266a24bfa20c34eb7147ce0b5e",

+ 378 - 10
pnpm-lock.yaml

@@ -84,12 +84,21 @@ importers:
       '@types/better-sqlite3':
         specifier: ^7.6.11
         version: 7.6.11
+      '@types/chai':
+        specifier: ^4.3.16
+        version: 4.3.16
+      '@types/mocha':
+        specifier: ^10.0.7
+        version: 10.0.7
       '@types/punycode':
         specifier: ^2.1.4
         version: 2.1.4
       '@types/tar-stream':
         specifier: ^3.1.3
         version: 3.1.3
+      chai:
+        specifier: '4'
+        version: 4.4.1
       eslint:
         specifier: ^9.7.0
         version: 9.7.0
@@ -102,6 +111,9 @@ importers:
       mitata:
         specifier: ^0.1.11
         version: 0.1.11
+      mocha:
+        specifier: ^10.7.0
+        version: 10.7.0
       typescript:
         specifier: ^5.5.3
         version: 5.5.4
@@ -388,6 +400,9 @@ packages:
   '@types/better-sqlite3@7.6.11':
     resolution: {integrity: sha512-i8KcD3PgGtGBLl3+mMYA8PdKkButvPyARxA7IQAd6qeslht13qxb1zzO8dRCtE7U3IoJS782zDBAeoKiM695kg==}
 
+  '@types/chai@4.3.16':
+    resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==}
+
   '@types/chrome@0.0.268':
     resolution: {integrity: sha512-7N1QH9buudSJ7sI8Pe4mBHJr5oZ48s0hcanI9w3wgijAlv1OZNUZve9JR4x42dn5lJ5Sm87V1JNfnoh10EnQlA==}
 
@@ -412,6 +427,9 @@ packages:
   '@types/json-schema@7.0.15':
     resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
 
+  '@types/mocha@10.0.7':
+    resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==}
+
   '@types/node@20.14.11':
     resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==}
 
@@ -524,6 +542,10 @@ packages:
   ajv@8.17.1:
     resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
 
+  ansi-colors@4.1.3:
+    resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+    engines: {node: '>=6'}
+
   ansi-regex@5.0.1:
     resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
     engines: {node: '>=8'}
@@ -532,6 +554,10 @@ packages:
     resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
     engines: {node: '>=8'}
 
+  anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+
   argparse@2.0.1:
     resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
 
@@ -539,6 +565,9 @@ packages:
     resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
     engines: {node: '>=8'}
 
+  assertion-error@1.1.0:
+    resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+
   astral-regex@2.0.0:
     resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
     engines: {node: '>=8'}
@@ -564,6 +593,10 @@ packages:
   better-sqlite3@11.1.2:
     resolution: {integrity: sha512-gujtFwavWU4MSPT+h9B+4pkvZdyOUkH54zgLdIrMmmmd4ZqiBIrRNBzNzYVFO417xo882uP5HBu4GjOfaSrIQw==}
 
+  binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+
   bindings@1.5.0:
     resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
 
@@ -580,6 +613,9 @@ packages:
     resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
     engines: {node: '>=8'}
 
+  browser-stdout@1.3.1:
+    resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
+
   buffer-from@1.1.2:
     resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
 
@@ -590,10 +626,25 @@ packages:
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
     engines: {node: '>=6'}
 
+  camelcase@6.3.0:
+    resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+    engines: {node: '>=10'}
+
+  chai@4.4.1:
+    resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==}
+    engines: {node: '>=4'}
+
   chalk@4.1.2:
     resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
     engines: {node: '>=10'}
 
+  check-error@1.0.3:
+    resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
+
+  chokidar@3.6.0:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+
   chownr@1.1.4:
     resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
 
@@ -604,6 +655,9 @@ packages:
   client-only@0.0.1:
     resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
 
+  cliui@7.0.4:
+    resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+
   color-convert@2.0.1:
     resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
     engines: {node: '>=7.0.0'}
@@ -641,10 +695,18 @@ packages:
       supports-color:
         optional: true
 
+  decamelize@4.0.0:
+    resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==}
+    engines: {node: '>=10'}
+
   decompress-response@6.0.0:
     resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
     engines: {node: '>=10'}
 
+  deep-eql@4.1.4:
+    resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==}
+    engines: {node: '>=6'}
+
   deep-extend@0.6.0:
     resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
     engines: {node: '>=4.0.0'}
@@ -659,6 +721,10 @@ packages:
     resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
     engines: {node: '>=8'}
 
+  diff@5.2.0:
+    resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
+    engines: {node: '>=0.3.1'}
+
   dir-glob@3.0.1:
     resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
     engines: {node: '>=8'}
@@ -677,6 +743,10 @@ packages:
     resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==}
     engines: {node: '>=10.13.0'}
 
+  escalade@3.1.2:
+    resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+    engines: {node: '>=6'}
+
   escape-string-regexp@4.0.0:
     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
     engines: {node: '>=10'}
@@ -859,6 +929,10 @@ packages:
     resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
     engines: {node: '>=16'}
 
+  flat@5.0.2:
+    resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
+    hasBin: true
+
   flatted@3.3.1:
     resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
 
@@ -873,9 +947,24 @@ packages:
   fs-constants@1.0.0:
     resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
 
+  fs.realpath@1.0.0:
+    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+  fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+
   function-bind@1.1.2:
     resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
 
+  get-caller-file@2.0.5:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+
+  get-func-name@2.0.2:
+    resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
+
   get-tsconfig@4.7.6:
     resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==}
 
@@ -890,6 +979,11 @@ packages:
     resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
     engines: {node: '>=10.13.0'}
 
+  glob@8.1.0:
+    resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
+    engines: {node: '>=12'}
+    deprecated: Glob versions prior to v9 are no longer supported
+
   globals@14.0.0:
     resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
     engines: {node: '>=18'}
@@ -916,6 +1010,10 @@ packages:
     resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
     engines: {node: '>= 0.4'}
 
+  he@1.2.0:
+    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+    hasBin: true
+
   ieee754@1.2.1:
     resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
 
@@ -931,12 +1029,20 @@ packages:
     resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
     engines: {node: '>=0.8.19'}
 
+  inflight@1.0.6:
+    resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+    deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
   inherits@2.0.4:
     resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
 
   ini@1.3.8:
     resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
 
+  is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+
   is-core-module@2.15.0:
     resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==}
     engines: {node: '>= 0.4'}
@@ -961,6 +1067,14 @@ packages:
     resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
     engines: {node: '>=8'}
 
+  is-plain-obj@2.1.0:
+    resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
+    engines: {node: '>=8'}
+
+  is-unicode-supported@0.1.0:
+    resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+    engines: {node: '>=10'}
+
   isexe@2.0.0:
     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
 
@@ -1004,6 +1118,13 @@ packages:
   lodash@4.17.21:
     resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
 
+  log-symbols@4.1.0:
+    resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+    engines: {node: '>=10'}
+
+  loupe@2.3.7:
+    resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+
   lru-cache@10.4.3:
     resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
 
@@ -1022,6 +1143,10 @@ packages:
   minimatch@3.1.2:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
 
+  minimatch@5.1.6:
+    resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+    engines: {node: '>=10'}
+
   minimatch@9.0.5:
     resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
     engines: {node: '>=16 || 14 >=14.17'}
@@ -1042,6 +1167,11 @@ packages:
   mnemonist@0.39.8:
     resolution: {integrity: sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==}
 
+  mocha@10.7.0:
+    resolution: {integrity: sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==}
+    engines: {node: '>= 14.0.0'}
+    hasBin: true
+
   ms@2.1.2:
     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
 
@@ -1058,6 +1188,10 @@ packages:
     resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==}
     engines: {node: '>=10'}
 
+  normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
   obliterator@2.0.4:
     resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==}
 
@@ -1102,6 +1236,9 @@ packages:
     resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
     engines: {node: '>=8'}
 
+  pathval@1.1.1:
+    resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+
   picocolors@1.0.1:
     resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
 
@@ -1135,6 +1272,9 @@ packages:
   queue-tick@1.0.1:
     resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==}
 
+  randombytes@2.1.0:
+    resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
   rc@1.2.8:
     resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
     hasBin: true
@@ -1143,6 +1283,14 @@ packages:
     resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
     engines: {node: '>= 6'}
 
+  readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+
+  require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+
   require-from-string@2.0.2:
     resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
     engines: {node: '>=0.10.0'}
@@ -1177,6 +1325,9 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
 
+  serialize-javascript@6.0.2:
+    resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+
   server-only@0.0.1:
     resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==}
 
@@ -1242,6 +1393,10 @@ packages:
     resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
     engines: {node: '>=8'}
 
+  supports-color@8.1.1:
+    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+    engines: {node: '>=10'}
+
   supports-preserve-symlinks-flag@1.0.0:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
     engines: {node: '>= 0.4'}
@@ -1304,6 +1459,10 @@ packages:
     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
     engines: {node: '>= 0.8.0'}
 
+  type-detect@4.0.8:
+    resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+    engines: {node: '>=4'}
+
   type-fest@4.23.0:
     resolution: {integrity: sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==}
     engines: {node: '>=16'}
@@ -1340,14 +1499,37 @@ packages:
     resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
     engines: {node: '>=0.10.0'}
 
+  workerpool@6.5.1:
+    resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==}
+
+  wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
+
   wrappy@1.0.2:
     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
 
+  y18n@5.0.8:
+    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
+
   yaml@2.4.5:
     resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==}
     engines: {node: '>= 14'}
     hasBin: true
 
+  yargs-parser@20.2.9:
+    resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+    engines: {node: '>=10'}
+
+  yargs-unparser@2.0.0:
+    resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
+    engines: {node: '>=10'}
+
+  yargs@16.2.0:
+    resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+    engines: {node: '>=10'}
+
   yocto-queue@0.1.0:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}
@@ -1428,7 +1610,7 @@ snapshots:
   '@eslint/config-array@0.17.1':
     dependencies:
       '@eslint/object-schema': 2.1.4
-      debug: 4.3.5
+      debug: 4.3.5(supports-color@8.1.1)
       minimatch: 3.1.2
     transitivePeerDependencies:
       - supports-color
@@ -1436,7 +1618,7 @@ snapshots:
   '@eslint/eslintrc@3.1.0':
     dependencies:
       ajv: 6.12.6
-      debug: 4.3.5
+      debug: 4.3.5(supports-color@8.1.1)
       espree: 10.1.0
       globals: 14.0.0
       ignore: 5.3.1
@@ -1566,7 +1748,7 @@ snapshots:
       '@swc-node/sourcemap-support': 0.5.1
       '@swc/core': 1.7.0
       colorette: 2.0.20
-      debug: 4.3.5
+      debug: 4.3.5(supports-color@8.1.1)
       oxc-resolver: 1.10.2
       pirates: 4.0.6
       tslib: 2.6.3
@@ -1645,6 +1827,8 @@ snapshots:
     dependencies:
       '@types/node': 20.14.11
 
+  '@types/chai@4.3.16': {}
+
   '@types/chrome@0.0.268':
     dependencies:
       '@types/filesystem': 0.0.36
@@ -1669,6 +1853,8 @@ snapshots:
 
   '@types/json-schema@7.0.15': {}
 
+  '@types/mocha@10.0.7': {}
+
   '@types/node@20.14.11':
     dependencies:
       undici-types: 5.26.5
@@ -1705,7 +1891,7 @@ snapshots:
       '@typescript-eslint/types': 8.0.0-alpha.45
       '@typescript-eslint/typescript-estree': 8.0.0-alpha.45(typescript@5.5.4)
       '@typescript-eslint/visitor-keys': 8.0.0-alpha.45
-      debug: 4.3.5
+      debug: 4.3.5(supports-color@8.1.1)
       eslint: 9.7.0
     optionalDependencies:
       typescript: 5.5.4
@@ -1726,7 +1912,7 @@ snapshots:
     dependencies:
       '@typescript-eslint/typescript-estree': 8.0.0-alpha.45(typescript@5.5.4)
       '@typescript-eslint/utils': 8.0.0-alpha.45(eslint@9.7.0)(typescript@5.5.4)
-      debug: 4.3.5
+      debug: 4.3.5(supports-color@8.1.1)
       ts-api-utils: 1.3.0(typescript@5.5.4)
     optionalDependencies:
       typescript: 5.5.4
@@ -1742,7 +1928,7 @@ snapshots:
     dependencies:
       '@typescript-eslint/types': 7.17.0
       '@typescript-eslint/visitor-keys': 7.17.0
-      debug: 4.3.5
+      debug: 4.3.5(supports-color@8.1.1)
       globby: 11.1.0
       is-glob: 4.0.3
       minimatch: 9.0.5
@@ -1757,7 +1943,7 @@ snapshots:
     dependencies:
       '@typescript-eslint/types': 8.0.0-alpha.45
       '@typescript-eslint/visitor-keys': 8.0.0-alpha.45
-      debug: 4.3.5
+      debug: 4.3.5(supports-color@8.1.1)
       globby: 11.1.0
       is-glob: 4.0.3
       minimatch: 9.0.5
@@ -1820,16 +2006,25 @@ snapshots:
       json-schema-traverse: 1.0.0
       require-from-string: 2.0.2
 
+  ansi-colors@4.1.3: {}
+
   ansi-regex@5.0.1: {}
 
   ansi-styles@4.3.0:
     dependencies:
       color-convert: 2.0.1
 
+  anymatch@3.1.3:
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+
   argparse@2.0.1: {}
 
   array-union@2.1.0: {}
 
+  assertion-error@1.1.0: {}
+
   astral-regex@2.0.0: {}
 
   async-retry@1.3.3:
@@ -1852,6 +2047,8 @@ snapshots:
       bindings: 1.5.0
       prebuild-install: 7.1.2
 
+  binary-extensions@2.3.0: {}
+
   bindings@1.5.0:
     dependencies:
       file-uri-to-path: 1.0.0
@@ -1875,6 +2072,8 @@ snapshots:
     dependencies:
       fill-range: 7.1.1
 
+  browser-stdout@1.3.1: {}
+
   buffer-from@1.1.2: {}
 
   buffer@5.7.1:
@@ -1884,17 +2083,51 @@ snapshots:
 
   callsites@3.1.0: {}
 
+  camelcase@6.3.0: {}
+
+  chai@4.4.1:
+    dependencies:
+      assertion-error: 1.1.0
+      check-error: 1.0.3
+      deep-eql: 4.1.4
+      get-func-name: 2.0.2
+      loupe: 2.3.7
+      pathval: 1.1.1
+      type-detect: 4.0.8
+
   chalk@4.1.2:
     dependencies:
       ansi-styles: 4.3.0
       supports-color: 7.2.0
 
+  check-error@1.0.3:
+    dependencies:
+      get-func-name: 2.0.2
+
+  chokidar@3.6.0:
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.3
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.3
+
   chownr@1.1.4: {}
 
   ci-info@4.0.0: {}
 
   client-only@0.0.1: {}
 
+  cliui@7.0.4:
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 7.0.0
+
   color-convert@2.0.1:
     dependencies:
       color-name: 1.1.4
@@ -1917,14 +2150,22 @@ snapshots:
     dependencies:
       ms: 2.1.3
 
-  debug@4.3.5:
+  debug@4.3.5(supports-color@8.1.1):
     dependencies:
       ms: 2.1.2
+    optionalDependencies:
+      supports-color: 8.1.1
+
+  decamelize@4.0.0: {}
 
   decompress-response@6.0.0:
     dependencies:
       mimic-response: 3.1.0
 
+  deep-eql@4.1.4:
+    dependencies:
+      type-detect: 4.0.8
+
   deep-extend@0.6.0: {}
 
   deep-is@0.1.4: {}
@@ -1933,6 +2174,8 @@ snapshots:
 
   detect-libc@2.0.3: {}
 
+  diff@5.2.0: {}
+
   dir-glob@3.0.1:
     dependencies:
       path-type: 4.0.0
@@ -1952,6 +2195,8 @@ snapshots:
       graceful-fs: 4.2.11
       tapable: 2.2.1
 
+  escalade@3.1.2: {}
+
   escape-string-regexp@4.0.0: {}
 
   eslint-compat-utils@0.5.1(eslint@9.7.0):
@@ -2035,7 +2280,7 @@ snapshots:
   eslint-plugin-import-x@3.1.0(eslint@9.7.0)(typescript@5.5.4):
     dependencies:
       '@typescript-eslint/utils': 7.17.0(eslint@9.7.0)(typescript@5.5.4)
-      debug: 4.3.5
+      debug: 4.3.5(supports-color@8.1.1)
       doctrine: 3.0.0
       eslint: 9.7.0
       eslint-import-resolver-node: 0.3.9
@@ -2123,7 +2368,7 @@ snapshots:
       ajv: 6.12.6
       chalk: 4.1.2
       cross-spawn: 7.0.3
-      debug: 4.3.5
+      debug: 4.3.5(supports-color@8.1.1)
       escape-string-regexp: 4.0.0
       eslint-scope: 8.0.2
       eslint-visitor-keys: 4.0.0
@@ -2221,6 +2466,8 @@ snapshots:
       flatted: 3.3.1
       keyv: 4.5.4
 
+  flat@5.0.2: {}
+
   flatted@3.3.1: {}
 
   foxact@0.2.36:
@@ -2230,8 +2477,17 @@ snapshots:
 
   fs-constants@1.0.0: {}
 
+  fs.realpath@1.0.0: {}
+
+  fsevents@2.3.3:
+    optional: true
+
   function-bind@1.1.2: {}
 
+  get-caller-file@2.0.5: {}
+
+  get-func-name@2.0.2: {}
+
   get-tsconfig@4.7.6:
     dependencies:
       resolve-pkg-maps: 1.0.0
@@ -2246,6 +2502,14 @@ snapshots:
     dependencies:
       is-glob: 4.0.3
 
+  glob@8.1.0:
+    dependencies:
+      fs.realpath: 1.0.0
+      inflight: 1.0.6
+      inherits: 2.0.4
+      minimatch: 5.1.6
+      once: 1.4.0
+
   globals@14.0.0: {}
 
   globals@15.8.0: {}
@@ -2269,6 +2533,8 @@ snapshots:
     dependencies:
       function-bind: 1.1.2
 
+  he@1.2.0: {}
+
   ieee754@1.2.1: {}
 
   ignore@5.3.1: {}
@@ -2280,10 +2546,19 @@ snapshots:
 
   imurmurhash@0.1.4: {}
 
+  inflight@1.0.6:
+    dependencies:
+      once: 1.4.0
+      wrappy: 1.0.2
+
   inherits@2.0.4: {}
 
   ini@1.3.8: {}
 
+  is-binary-path@2.1.0:
+    dependencies:
+      binary-extensions: 2.3.0
+
   is-core-module@2.15.0:
     dependencies:
       hasown: 2.0.2
@@ -2300,6 +2575,10 @@ snapshots:
 
   is-path-inside@3.0.3: {}
 
+  is-plain-obj@2.1.0: {}
+
+  is-unicode-supported@0.1.0: {}
+
   isexe@2.0.0: {}
 
   js-yaml@4.1.0:
@@ -2340,6 +2619,15 @@ snapshots:
 
   lodash@4.17.21: {}
 
+  log-symbols@4.1.0:
+    dependencies:
+      chalk: 4.1.2
+      is-unicode-supported: 0.1.0
+
+  loupe@2.3.7:
+    dependencies:
+      get-func-name: 2.0.2
+
   lru-cache@10.4.3: {}
 
   merge2@1.4.1: {}
@@ -2355,6 +2643,10 @@ snapshots:
     dependencies:
       brace-expansion: 1.1.11
 
+  minimatch@5.1.6:
+    dependencies:
+      brace-expansion: 2.0.1
+
   minimatch@9.0.5:
     dependencies:
       brace-expansion: 2.0.1
@@ -2371,6 +2663,29 @@ snapshots:
     dependencies:
       obliterator: 2.0.4
 
+  mocha@10.7.0:
+    dependencies:
+      ansi-colors: 4.1.3
+      browser-stdout: 1.3.1
+      chokidar: 3.6.0
+      debug: 4.3.5(supports-color@8.1.1)
+      diff: 5.2.0
+      escape-string-regexp: 4.0.0
+      find-up: 5.0.0
+      glob: 8.1.0
+      he: 1.2.0
+      js-yaml: 4.1.0
+      log-symbols: 4.1.0
+      minimatch: 5.1.6
+      ms: 2.1.3
+      serialize-javascript: 6.0.2
+      strip-json-comments: 3.1.1
+      supports-color: 8.1.1
+      workerpool: 6.5.1
+      yargs: 16.2.0
+      yargs-parser: 20.2.9
+      yargs-unparser: 2.0.0
+
   ms@2.1.2: {}
 
   ms@2.1.3: {}
@@ -2383,6 +2698,8 @@ snapshots:
     dependencies:
       semver: 7.6.3
 
+  normalize-path@3.0.0: {}
+
   obliterator@2.0.4: {}
 
   once@1.4.0:
@@ -2437,6 +2754,8 @@ snapshots:
 
   path-type@4.0.0: {}
 
+  pathval@1.1.1: {}
+
   picocolors@1.0.1: {}
 
   picomatch@2.3.1: {}
@@ -2471,6 +2790,10 @@ snapshots:
 
   queue-tick@1.0.1: {}
 
+  randombytes@2.1.0:
+    dependencies:
+      safe-buffer: 5.2.1
+
   rc@1.2.8:
     dependencies:
       deep-extend: 0.6.0
@@ -2484,6 +2807,12 @@ snapshots:
       string_decoder: 1.3.0
       util-deprecate: 1.0.2
 
+  readdirp@3.6.0:
+    dependencies:
+      picomatch: 2.3.1
+
+  require-directory@2.1.1: {}
+
   require-from-string@2.0.2: {}
 
   resolve-from@4.0.0: {}
@@ -2508,6 +2837,10 @@ snapshots:
 
   semver@7.6.3: {}
 
+  serialize-javascript@6.0.2:
+    dependencies:
+      randombytes: 2.1.0
+
   server-only@0.0.1: {}
 
   shebang-command@2.0.0:
@@ -2573,6 +2906,10 @@ snapshots:
     dependencies:
       has-flag: 4.0.0
 
+  supports-color@8.1.1:
+    dependencies:
+      has-flag: 4.0.0
+
   supports-preserve-symlinks-flag@1.0.0: {}
 
   synckit@0.6.2:
@@ -2644,6 +2981,8 @@ snapshots:
     dependencies:
       prelude-ls: 1.2.1
 
+  type-detect@4.0.8: {}
+
   type-fest@4.23.0: {}
 
   typescript-eslint@8.0.0-alpha.45(eslint@9.7.0)(typescript@5.5.4):
@@ -2673,8 +3012,37 @@ snapshots:
 
   word-wrap@1.2.5: {}
 
+  workerpool@6.5.1: {}
+
+  wrap-ansi@7.0.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
   wrappy@1.0.2: {}
 
+  y18n@5.0.8: {}
+
   yaml@2.4.5: {}
 
+  yargs-parser@20.2.9: {}
+
+  yargs-unparser@2.0.0:
+    dependencies:
+      camelcase: 6.3.0
+      decamelize: 4.0.0
+      flat: 5.0.2
+      is-plain-obj: 2.1.0
+
+  yargs@16.2.0:
+    dependencies:
+      cliui: 7.0.4
+      escalade: 3.1.2
+      get-caller-file: 2.0.5
+      require-directory: 2.1.1
+      string-width: 4.2.3
+      y18n: 5.0.8
+      yargs-parser: 20.2.9
+
   yocto-queue@0.1.0: {}