diff --git a/.c8rc.json b/.c8rc.json
deleted file mode 100644
index 987f3f7b..00000000
--- a/.c8rc.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "reporter": [
-    "lcov"
-  ],
-  "include": [
-    "lib/**/*.js"
-  ],
-  "exclude": [
-    "lib/test/**/*.js"
-  ]
-}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 09b9e339..d58afefa 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -29,7 +29,7 @@ jobs:
 
         include:
           - executeLint: true
-            node: 20
+            node: lts/*
             os: ubuntu-latest
       fail-fast: false
 
@@ -44,11 +44,6 @@ jobs:
           node-version: ${{ matrix.node }}
           cache: yarn
 
-      # - name: Install ESLint ${{ matrix.eslint }}
-      #   if: ${{ matrix.eslint != 9 }}
-      #   run: |
-      #     yarn add -D eslint@${{ matrix.eslint }} eslint-plugin-unicorn@56
-
       - name: Install Dependencies
         run: yarn --immutable
 
diff --git a/README.md b/README.md
index 1be1e311..62174275 100644
--- a/README.md
+++ b/README.md
@@ -1,31 +1,22 @@
-
-  
-     -  
-  
-
-  
-  
-     -  
-  
-
-  
-  
-     -  
-  
-
-  
-  
-     -  
-  
-
-  
-  
-     -  
-
-  
-
+# eslint-plugin-jsx-a11y-x
 
-Get professional support for eslint-plugin-jsx-a11y-x on Tidelift
+[](https://github.com/es-tooling/eslint-plugin-jsx-a11y-x/actions/workflows/ci.yml?query=branch%3Amain)
+[](https://codecov.io/gh/es-tooling/eslint-plugin-jsx-a11y-x)
+[](https://github.com/plantain-00/type-coverage)
+[](https://coderabbit.ai)
+[](https://www.npmjs.com/package/eslint-plugin-jsx-a11y-x)
+[](https://github.com/es-tooling/eslint-plugin-jsx-a11y-x/releases)
 
-# eslint-plugin-jsx-a11y-x
+[](https://conventionalcommits.org)
+[](https://renovatebot.com)
+[](https://standardjs.com)
+[](https://github.com/prettier/prettier)
+[](https://github.com/changesets/changesets)
 
 Static AST checker for accessibility rules on JSX elements.
 
+Get professional support for eslint-plugin-jsx-a11y-x on Tidelift
+
 ## Why?
 
 This plugin does a static evaluation of the JSX to spot accessibility issues in React apps. Because it only catches errors in static code, use it in combination with [@axe-core/react](https://github.com/dequelabs/axe-core-npm/tree/develop/packages/react) to test the accessibility of the rendered DOM. Consider these tools just as one step of a larger a11y testing process and always test your apps with assistive technology.
diff --git a/__tests__/index-test.js b/__tests__/index.spec.js
similarity index 54%
rename from __tests__/index-test.js
rename to __tests__/index.spec.js
index 3a22cbba..521bc10d 100644
--- a/__tests__/index-test.js
+++ b/__tests__/index.spec.js
@@ -2,7 +2,6 @@
 
 import fs from 'fs';
 import path from 'path';
-import test from 'tape';
 
 import plugin from '../src';
 
@@ -10,49 +9,32 @@ const rules = fs
   .readdirSync(path.resolve(__dirname, '../src/rules/'))
   .map(f => path.basename(f, '.js'));
 
-test('all rule files should be exported by the plugin', t => {
+test('all rule files should be exported by the plugin', () => {
   rules.forEach(ruleName => {
-    t.equal(
-      plugin.rules[ruleName],
+    expect(plugin.rules[ruleName]).toBe(
       require(path.join('../src/rules', ruleName)),
-      `exports ${ruleName}`,
     );
   });
-
-  t.end();
 });
 
-test('configurations', t => {
-  t.notEqual(
-    plugin.configs.recommended,
-    undefined,
-    "exports a 'recommended' configuration",
-  );
-
-  t.end();
+test('configurations', () => {
+  expect(plugin.configs.recommended).not.toBe(undefined);
 });
 
-test('schemas', t => {
+test('schemas', () => {
   rules.forEach(ruleName => {
     const rule = require(path.join('../src/rules', ruleName));
     const schema = rule.meta && rule.meta.schema && rule.meta.schema[0];
     const { type } = schema;
 
-    t.equal(type, 'object', `${ruleName} exports a schema with type object`);
+    expect(type).toBe('object');
   });
-
-  t.end();
 });
 
-test('plugin referentially equal to prevent flat config issues', t => {
+test('plugin referentially equal to prevent flat config issues', () => {
   const keys = Object.keys(plugin.flatConfigs);
   for (let i = 0; i < keys.length; i += 1) {
     const config = plugin.flatConfigs[keys[i]];
-    t.equal(
-      plugin,
-      config.plugins['jsx-a11y-x'],
-      `${config.name}'s plugin reference is referentially equal to the top-level export`,
-    );
+    expect(plugin).toBe(config.plugins['jsx-a11y-x']);
   }
-  t.end();
 });
diff --git a/__tests__/src/rules/accessible-emoji-test.js b/__tests__/src/rules/accessible-emoji.spec.js
similarity index 100%
rename from __tests__/src/rules/accessible-emoji-test.js
rename to __tests__/src/rules/accessible-emoji.spec.js
diff --git a/__tests__/src/rules/alt-text-test.js b/__tests__/src/rules/alt-text.spec.js
similarity index 100%
rename from __tests__/src/rules/alt-text-test.js
rename to __tests__/src/rules/alt-text.spec.js
diff --git a/__tests__/src/rules/anchor-ambiguous-text-test.js b/__tests__/src/rules/anchor-ambiguous-text.spec.js
similarity index 100%
rename from __tests__/src/rules/anchor-ambiguous-text-test.js
rename to __tests__/src/rules/anchor-ambiguous-text.spec.js
diff --git a/__tests__/src/rules/anchor-has-content-test.js b/__tests__/src/rules/anchor-has-content.spec.js
similarity index 100%
rename from __tests__/src/rules/anchor-has-content-test.js
rename to __tests__/src/rules/anchor-has-content.spec.js
diff --git a/__tests__/src/rules/anchor-is-valid-test.js b/__tests__/src/rules/anchor-is-valid.spec.js
similarity index 100%
rename from __tests__/src/rules/anchor-is-valid-test.js
rename to __tests__/src/rules/anchor-is-valid.spec.js
diff --git a/__tests__/src/rules/aria-activedescendant-has-tabindex-test.js b/__tests__/src/rules/aria-activedescendant-has-tabindex.spec.js
similarity index 100%
rename from __tests__/src/rules/aria-activedescendant-has-tabindex-test.js
rename to __tests__/src/rules/aria-activedescendant-has-tabindex.spec.js
diff --git a/__tests__/src/rules/aria-props-test.js b/__tests__/src/rules/aria-props.spec.js
similarity index 100%
rename from __tests__/src/rules/aria-props-test.js
rename to __tests__/src/rules/aria-props.spec.js
diff --git a/__tests__/src/rules/aria-proptypes-test.js b/__tests__/src/rules/aria-proptypes.spec.js
similarity index 98%
rename from __tests__/src/rules/aria-proptypes-test.js
rename to __tests__/src/rules/aria-proptypes.spec.js
index 161a74fa..e54d6172 100644
--- a/__tests__/src/rules/aria-proptypes-test.js
+++ b/__tests__/src/rules/aria-proptypes.spec.js
@@ -9,7 +9,6 @@
 
 import { aria } from 'aria-query';
 import { RuleTester } from 'eslint';
-import test from 'tape';
 
 import parserOptionsMapper from '../../__util__/parserOptionsMapper';
 import parsers from '../../__util__/helpers/parsers';
@@ -57,14 +56,8 @@ tokens from the following: ${permittedValues}.`,
   }
 };
 
-test('validityCheck', t => {
-  t.equal(
-    validityCheck(null, null),
-    false,
-    'is false for an unknown expected type',
-  );
-
-  t.end();
+test('validityCheck', () => {
+  expect(validityCheck(null, null)).toBe(false);
 });
 
 ruleTester.run('aria-proptypes', rule, {
diff --git a/__tests__/src/rules/aria-role-test.js b/__tests__/src/rules/aria-role.spec.js
similarity index 100%
rename from __tests__/src/rules/aria-role-test.js
rename to __tests__/src/rules/aria-role.spec.js
diff --git a/__tests__/src/rules/aria-unsupported-elements-test.js b/__tests__/src/rules/aria-unsupported-elements.spec.js
similarity index 100%
rename from __tests__/src/rules/aria-unsupported-elements-test.js
rename to __tests__/src/rules/aria-unsupported-elements.spec.js
diff --git a/__tests__/src/rules/autocomplete-valid-test.js b/__tests__/src/rules/autocomplete-valid.spec.js
similarity index 100%
rename from __tests__/src/rules/autocomplete-valid-test.js
rename to __tests__/src/rules/autocomplete-valid.spec.js
diff --git a/__tests__/src/rules/click-events-have-key-events-test.js b/__tests__/src/rules/click-events-have-key-events.spec.js
similarity index 100%
rename from __tests__/src/rules/click-events-have-key-events-test.js
rename to __tests__/src/rules/click-events-have-key-events.spec.js
diff --git a/__tests__/src/rules/control-has-associated-label-test.js b/__tests__/src/rules/control-has-associated-label.spec.js
similarity index 100%
rename from __tests__/src/rules/control-has-associated-label-test.js
rename to __tests__/src/rules/control-has-associated-label.spec.js
diff --git a/__tests__/src/rules/heading-has-content-test.js b/__tests__/src/rules/heading-has-content.spec.js
similarity index 100%
rename from __tests__/src/rules/heading-has-content-test.js
rename to __tests__/src/rules/heading-has-content.spec.js
diff --git a/__tests__/src/rules/html-has-lang-test.js b/__tests__/src/rules/html-has-lang.spec.js
similarity index 100%
rename from __tests__/src/rules/html-has-lang-test.js
rename to __tests__/src/rules/html-has-lang.spec.js
diff --git a/__tests__/src/rules/iframe-has-title-test.js b/__tests__/src/rules/iframe-has-title.spec.js
similarity index 100%
rename from __tests__/src/rules/iframe-has-title-test.js
rename to __tests__/src/rules/iframe-has-title.spec.js
diff --git a/__tests__/src/rules/img-redundant-alt-test.js b/__tests__/src/rules/img-redundant-alt.spec.js
similarity index 100%
rename from __tests__/src/rules/img-redundant-alt-test.js
rename to __tests__/src/rules/img-redundant-alt.spec.js
diff --git a/__tests__/src/rules/interactive-supports-focus-test.js b/__tests__/src/rules/interactive-supports-focus.spec.js
similarity index 100%
rename from __tests__/src/rules/interactive-supports-focus-test.js
rename to __tests__/src/rules/interactive-supports-focus.spec.js
diff --git a/__tests__/src/rules/label-has-associated-control-test.js b/__tests__/src/rules/label-has-associated-control.spec.js
similarity index 100%
rename from __tests__/src/rules/label-has-associated-control-test.js
rename to __tests__/src/rules/label-has-associated-control.spec.js
diff --git a/__tests__/src/rules/label-has-for-test.js b/__tests__/src/rules/label-has-for.spec.js
similarity index 100%
rename from __tests__/src/rules/label-has-for-test.js
rename to __tests__/src/rules/label-has-for.spec.js
diff --git a/__tests__/src/rules/lang-test.js b/__tests__/src/rules/lang.spec.js
similarity index 100%
rename from __tests__/src/rules/lang-test.js
rename to __tests__/src/rules/lang.spec.js
diff --git a/__tests__/src/rules/media-has-caption-test.js b/__tests__/src/rules/media-has-caption.spec.js
similarity index 100%
rename from __tests__/src/rules/media-has-caption-test.js
rename to __tests__/src/rules/media-has-caption.spec.js
diff --git a/__tests__/src/rules/mouse-events-have-key-events-test.js b/__tests__/src/rules/mouse-events-have-key-events.spec.js
similarity index 100%
rename from __tests__/src/rules/mouse-events-have-key-events-test.js
rename to __tests__/src/rules/mouse-events-have-key-events.spec.js
diff --git a/__tests__/src/rules/no-access-key-test.js b/__tests__/src/rules/no-access-key.spec.js
similarity index 100%
rename from __tests__/src/rules/no-access-key-test.js
rename to __tests__/src/rules/no-access-key.spec.js
diff --git a/__tests__/src/rules/no-aria-hidden-on-focusable-test.js b/__tests__/src/rules/no-aria-hidden-on-focusable.spec.js
similarity index 100%
rename from __tests__/src/rules/no-aria-hidden-on-focusable-test.js
rename to __tests__/src/rules/no-aria-hidden-on-focusable.spec.js
diff --git a/__tests__/src/rules/no-autofocus-test.js b/__tests__/src/rules/no-autofocus.spec.js
similarity index 100%
rename from __tests__/src/rules/no-autofocus-test.js
rename to __tests__/src/rules/no-autofocus.spec.js
diff --git a/__tests__/src/rules/no-distracting-elements-test.js b/__tests__/src/rules/no-distracting-elements.spec.js
similarity index 100%
rename from __tests__/src/rules/no-distracting-elements-test.js
rename to __tests__/src/rules/no-distracting-elements.spec.js
diff --git a/__tests__/src/rules/no-interactive-element-to-noninteractive-role-test.js b/__tests__/src/rules/no-interactive-element-to-noninteractive-role.spec.js
similarity index 100%
rename from __tests__/src/rules/no-interactive-element-to-noninteractive-role-test.js
rename to __tests__/src/rules/no-interactive-element-to-noninteractive-role.spec.js
diff --git a/__tests__/src/rules/no-noninteractive-element-interactions-test.js b/__tests__/src/rules/no-noninteractive-element-interactions.spec.js
similarity index 100%
rename from __tests__/src/rules/no-noninteractive-element-interactions-test.js
rename to __tests__/src/rules/no-noninteractive-element-interactions.spec.js
diff --git a/__tests__/src/rules/no-noninteractive-element-to-interactive-role-test.js b/__tests__/src/rules/no-noninteractive-element-to-interactive-role.spec.js
similarity index 100%
rename from __tests__/src/rules/no-noninteractive-element-to-interactive-role-test.js
rename to __tests__/src/rules/no-noninteractive-element-to-interactive-role.spec.js
diff --git a/__tests__/src/rules/no-noninteractive-tabindex-test.js b/__tests__/src/rules/no-noninteractive-tabindex.spec.js
similarity index 100%
rename from __tests__/src/rules/no-noninteractive-tabindex-test.js
rename to __tests__/src/rules/no-noninteractive-tabindex.spec.js
diff --git a/__tests__/src/rules/no-onchange-test.js b/__tests__/src/rules/no-onchange.spec.js
similarity index 100%
rename from __tests__/src/rules/no-onchange-test.js
rename to __tests__/src/rules/no-onchange.spec.js
diff --git a/__tests__/src/rules/no-redundant-roles-test.js b/__tests__/src/rules/no-redundant-roles.spec.js
similarity index 100%
rename from __tests__/src/rules/no-redundant-roles-test.js
rename to __tests__/src/rules/no-redundant-roles.spec.js
diff --git a/__tests__/src/rules/no-static-element-interactions-test.js b/__tests__/src/rules/no-static-element-interactions.spec.js
similarity index 100%
rename from __tests__/src/rules/no-static-element-interactions-test.js
rename to __tests__/src/rules/no-static-element-interactions.spec.js
diff --git a/__tests__/src/rules/prefer-tag-over-role-test.js b/__tests__/src/rules/prefer-tag-over-role.spec.js
similarity index 100%
rename from __tests__/src/rules/prefer-tag-over-role-test.js
rename to __tests__/src/rules/prefer-tag-over-role.spec.js
diff --git a/__tests__/src/rules/role-has-required-aria-props-test.js b/__tests__/src/rules/role-has-required-aria-props.spec.js
similarity index 100%
rename from __tests__/src/rules/role-has-required-aria-props-test.js
rename to __tests__/src/rules/role-has-required-aria-props.spec.js
diff --git a/__tests__/src/rules/role-supports-aria-props-test.js b/__tests__/src/rules/role-supports-aria-props.spec.js
similarity index 100%
rename from __tests__/src/rules/role-supports-aria-props-test.js
rename to __tests__/src/rules/role-supports-aria-props.spec.js
diff --git a/__tests__/src/rules/scope-test.js b/__tests__/src/rules/scope.spec.js
similarity index 100%
rename from __tests__/src/rules/scope-test.js
rename to __tests__/src/rules/scope.spec.js
diff --git a/__tests__/src/rules/tabindex-no-positive-test.js b/__tests__/src/rules/tabindex-no-positive.spec.js
similarity index 100%
rename from __tests__/src/rules/tabindex-no-positive-test.js
rename to __tests__/src/rules/tabindex-no-positive.spec.js
diff --git a/__tests__/src/util/attributesComparator-test.js b/__tests__/src/util/attributesComparator.spec.js
similarity index 53%
rename from __tests__/src/util/attributesComparator-test.js
rename to __tests__/src/util/attributesComparator.spec.js
index d9a0b709..48218447 100644
--- a/__tests__/src/util/attributesComparator-test.js
+++ b/__tests__/src/util/attributesComparator.spec.js
@@ -1,30 +1,18 @@
-import test from 'tape';
-
 import attributesComparator from '../../../src/util/attributesComparator';
 import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
 import JSXElementMock from '../../../__mocks__/JSXElementMock';
 
-test('attributesComparator', t => {
-  t.equal(
-    attributesComparator(),
-    true,
-    'baseAttributes are undefined and attributes are undefined -> true',
-  );
+test('attributesComparator', () => {
+  expect(attributesComparator()).toBe(true);
 
-  t.equal(
-    attributesComparator([], []),
-    true,
-    'baseAttributes are empty and attributes are empty -> true',
-  );
+  expect(attributesComparator([], [])).toBe(true);
 
-  t.equal(
+  expect(
     attributesComparator(
       [],
       [JSXAttributeMock('foo', 0), JSXAttributeMock('bar', 'baz')],
     ),
-    true,
-    'baseAttributes are empty and attributes have values -> true',
-  );
+  ).toBe(true);
 
   const baseAttributes = [
     {
@@ -41,53 +29,39 @@ test('attributesComparator', t => {
     },
   ];
 
-  t.equal(
-    attributesComparator(baseAttributes, []),
-    false,
-    'baseAttributes have values and attributes are empty -> false',
-  );
+  expect(attributesComparator(baseAttributes, [])).toBe(false);
 
-  t.equal(
+  expect(
     attributesComparator(baseAttributes, [
       JSXElementMock(),
       JSXAttributeMock('biz', 2),
       JSXAttributeMock('ziff', 'opo'),
       JSXAttributeMock('far', 'lolz'),
     ]),
-    false,
-    'baseAttributes have values and attributes have values, and the values are different -> false',
-  );
+  ).toBe(false);
 
-  t.equal(
+  expect(
     attributesComparator(baseAttributes, [
       JSXAttributeMock('biz', 1),
       JSXAttributeMock('fizz', 'pop'),
       JSXAttributeMock('goo', 'gazz'),
     ]),
-    false,
-    'baseAttributes have values and attributes have values, and the values are a subset -> false',
-  );
+  ).toBe(false);
 
-  t.equal(
+  expect(
     attributesComparator(baseAttributes, [
       JSXAttributeMock('biz', 1),
       JSXAttributeMock('fizz', 'pop'),
       JSXAttributeMock('fuzz', 'lolz'),
     ]),
-    true,
-    'baseAttributes have values and attributes have values, and the values are the same -> true',
-  );
+  ).toBe(true);
 
-  t.equal(
+  expect(
     attributesComparator(baseAttributes, [
       JSXAttributeMock('biz', 1),
       JSXAttributeMock('fizz', 'pop'),
       JSXAttributeMock('fuzz', 'lolz'),
       JSXAttributeMock('dar', 'tee'),
     ]),
-    true,
-    'baseAttributes have values and attributes have values, and the values are a superset -> true',
-  );
-
-  t.end();
+  ).toBe(true);
 });
diff --git a/__tests__/src/util/getAccessibleChildText-test.js b/__tests__/src/util/getAccessibleChildText.spec.js
similarity index 70%
rename from __tests__/src/util/getAccessibleChildText-test.js
rename to __tests__/src/util/getAccessibleChildText.spec.js
index db9db1de..d3089317 100644
--- a/__tests__/src/util/getAccessibleChildText-test.js
+++ b/__tests__/src/util/getAccessibleChildText.spec.js
@@ -1,21 +1,18 @@
-import test from 'tape';
 import { elementType } from 'jsx-ast-utils-x';
 
 import getAccessibleChildText from '../../../src/util/getAccessibleChildText';
 import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
 import JSXElementMock from '../../../__mocks__/JSXElementMock';
 
-test('getAccessibleChildText', t => {
-  t.equal(
+test('getAccessibleChildText', () => {
+  expect(
     getAccessibleChildText(
       JSXElementMock('a', [JSXAttributeMock('aria-label', 'foo')]),
       elementType,
     ),
-    'foo',
-    'returns the aria-label when present',
-  );
+  ).toBe('foo');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock(
         'a',
@@ -24,29 +21,23 @@ test('getAccessibleChildText', t => {
       ),
       elementType,
     ),
-    'foo',
-    'returns the aria-label instead of children',
-  );
+  ).toBe('foo');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock('a', [JSXAttributeMock('aria-hidden', 'true')]),
       elementType,
     ),
-    '',
-    'skips elements with aria-hidden=true',
-  );
+  ).toBe('');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock('a', [], [{ type: 'JSXText', value: 'bar' }]),
       elementType,
     ),
-    'bar',
-    'returns literal value for JSXText child',
-  );
+  ).toBe('bar');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock(
         'a',
@@ -60,11 +51,9 @@ test('getAccessibleChildText', t => {
       ),
       elementType,
     ),
-    'a sensible label',
-    'returns alt text for img child',
-  );
+  ).toBe('a sensible label');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock(
         'a',
@@ -73,38 +62,30 @@ test('getAccessibleChildText', t => {
       ),
       elementType,
     ),
-    '',
-    'returns blank when alt tag is used on arbitrary element',
-  );
+  ).toBe('');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock('a', [], [{ type: 'Literal', value: 'bar' }]),
       elementType,
     ),
-    'bar',
-    'returns literal value for JSXText child',
-  );
+  ).toBe('bar');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock('a', [], [{ type: 'Literal', value: ' bar   ' }]),
       elementType,
     ),
-    'bar',
-    'returns trimmed literal value for JSXText child',
-  );
+  ).toBe('bar');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock('a', [], [{ type: 'Literal', value: 'foo         bar' }]),
       elementType,
     ),
-    'foo bar',
-    'returns space-collapsed literal value for JSXText child',
-  );
+  ).toBe('foo bar');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock(
         'a',
@@ -113,11 +94,9 @@ test('getAccessibleChildText', t => {
       ),
       elementType,
     ),
-    'foo bar baz foo bar',
-    'returns punctuation-stripped literal value for JSXText child',
-  );
+  ).toBe('foo bar baz foo bar');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock(
         'a',
@@ -126,11 +105,9 @@ test('getAccessibleChildText', t => {
       ),
       elementType,
     ),
-    'bar',
-    'returns recursive value for JSXElement child',
-  );
+  ).toBe('bar');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock(
         'a',
@@ -145,11 +122,9 @@ test('getAccessibleChildText', t => {
       ),
       elementType,
     ),
-    '',
-    'skips children with aria-hidden-true',
-  );
+  ).toBe('');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock(
         'a',
@@ -161,11 +136,9 @@ test('getAccessibleChildText', t => {
       ),
       elementType,
     ),
-    'foo bar',
-    'joins multiple children properly - no spacing',
-  );
+  ).toBe('foo bar');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock(
         'a',
@@ -177,11 +150,9 @@ test('getAccessibleChildText', t => {
       ),
       elementType,
     ),
-    'foo bar',
-    'joins multiple children properly - with spacing',
-  );
+  ).toBe('foo bar');
 
-  t.equal(
+  expect(
     getAccessibleChildText(
       JSXElementMock(
         'a',
@@ -194,9 +165,5 @@ test('getAccessibleChildText', t => {
       ),
       elementType,
     ),
-    'foo bar',
-    'skips unknown elements',
-  );
-
-  t.end();
+  ).toBe('foo bar');
 });
diff --git a/__tests__/src/util/getComputedRole-test.js b/__tests__/src/util/getComputedRole-test.js
deleted file mode 100644
index df440496..00000000
--- a/__tests__/src/util/getComputedRole-test.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import test from 'tape';
-
-import getComputedRole from '../../../src/util/getComputedRole';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-
-test('getComputedRole', t => {
-  t.equal(
-    getComputedRole('div', [JSXAttributeMock('role', 'button')]),
-    'button',
-    'explicit role + valid role -> returns the role',
-  );
-
-  t.equal(
-    getComputedRole('li', [JSXAttributeMock('role', 'beeswax')]),
-    'listitem',
-    'explicit role + invalid role + has implicit -> returns the implicit role',
-  );
-
-  t.equal(
-    getComputedRole('div', [JSXAttributeMock('role', 'beeswax')]),
-    null,
-    'explicit role + invalid role + lacks implicit -> returns null',
-  );
-
-  t.equal(
-    getComputedRole('li', []),
-    'listitem',
-    'explicit role + no role + has implicit -> returns the implicit role',
-  );
-
-  t.equal(
-    getComputedRole('div', []),
-    null,
-    'explicit role + no role + lacks implicit -> returns null',
-  );
-
-  t.equal(
-    getComputedRole('li', [JSXAttributeMock('role', 'beeswax')]),
-    'listitem',
-    'implicit role + has implicit -> returns the implicit role',
-  );
-
-  t.equal(
-    getComputedRole('div', []),
-    null,
-    'implicit role + lacks implicit -> returns null',
-  );
-
-  t.end();
-});
diff --git a/__tests__/src/util/getComputedRole.spec.js b/__tests__/src/util/getComputedRole.spec.js
new file mode 100644
index 00000000..cbe84ab7
--- /dev/null
+++ b/__tests__/src/util/getComputedRole.spec.js
@@ -0,0 +1,26 @@
+import getComputedRole from '../../../src/util/getComputedRole';
+import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
+
+test('getComputedRole', () => {
+  expect(getComputedRole('div', [JSXAttributeMock('role', 'button')])).toBe(
+    'button',
+  );
+
+  expect(getComputedRole('li', [JSXAttributeMock('role', 'beeswax')])).toBe(
+    'listitem',
+  );
+
+  expect(getComputedRole('div', [JSXAttributeMock('role', 'beeswax')])).toBe(
+    null,
+  );
+
+  expect(getComputedRole('li', [])).toBe('listitem');
+
+  expect(getComputedRole('div', [])).toBe(null);
+
+  expect(getComputedRole('li', [JSXAttributeMock('role', 'beeswax')])).toBe(
+    'listitem',
+  );
+
+  expect(getComputedRole('div', [])).toBe(null);
+});
diff --git a/__tests__/src/util/getElementType-test.js b/__tests__/src/util/getElementType-test.js
deleted file mode 100644
index 9c2c0f64..00000000
--- a/__tests__/src/util/getElementType-test.js
+++ /dev/null
@@ -1,178 +0,0 @@
-import test from 'tape';
-
-import getElementType from '../../../src/util/getElementType';
-import JSXElementMock from '../../../__mocks__/JSXElementMock';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-
-test('getElementType', t => {
-  t.test('no settings in context', st => {
-    const elementType = getElementType({ settings: {} });
-
-    st.equal(
-      elementType(JSXElementMock('input').openingElement),
-      'input',
-      'returns the exact tag name for a DOM element',
-    );
-
-    st.equal(
-      elementType(JSXElementMock('CustomInput').openingElement),
-      'CustomInput',
-      'returns the exact tag name for a custom element',
-    );
-
-    st.equal(
-      elementType(JSXElementMock('toString').openingElement),
-      'toString',
-      'returns the exact tag name for names that are in Object.prototype',
-    );
-
-    st.equal(
-      elementType(
-        JSXElementMock('span', [JSXAttributeMock('as', 'h1')]).openingElement,
-      ),
-      'span',
-      'returns the default tag name provided',
-    );
-
-    st.end();
-  });
-
-  t.test('components settings in context', st => {
-    const elementType = getElementType({
-      settings: {
-        'jsx-a11y-x': {
-          components: {
-            CustomInput: 'input',
-          },
-        },
-      },
-    });
-
-    st.equal(
-      elementType(JSXElementMock('input').openingElement),
-      'input',
-      'returns the exact tag name for a DOM element',
-    );
-
-    st.equal(
-      elementType(JSXElementMock('CustomInput').openingElement),
-      'input',
-      'returns the mapped tag name for a custom element',
-    );
-
-    st.equal(
-      elementType(JSXElementMock('CityInput').openingElement),
-      'CityInput',
-      'returns the exact tag name for a custom element not in the components map',
-    );
-
-    st.equal(
-      elementType(
-        JSXElementMock('span', [JSXAttributeMock('as', 'h1')]).openingElement,
-      ),
-      'span',
-      'return the default tag name since not polymorphicPropName was provided',
-    );
-
-    st.end();
-  });
-
-  t.test('polymorphicPropName settings in context', st => {
-    const elementType = getElementType({
-      settings: {
-        'jsx-a11y-x': {
-          polymorphicPropName: 'asChild',
-          components: {
-            CustomButton: 'button',
-          },
-        },
-      },
-    });
-
-    st.equal(
-      elementType(
-        JSXElementMock('span', [JSXAttributeMock('asChild', 'h1')])
-          .openingElement,
-      ),
-      'h1',
-      'returns the tag name provided by the polymorphic prop, "asChild", defined in the settings',
-    );
-
-    st.equal(
-      elementType(
-        JSXElementMock('CustomButton', [JSXAttributeMock('asChild', 'a')])
-          .openingElement,
-      ),
-      'a',
-      'returns the tag name provided by the polymorphic prop, "asChild", defined in the settings instead of the component mapping tag',
-    );
-
-    st.equal(
-      elementType(
-        JSXElementMock('CustomButton', [JSXAttributeMock('as', 'a')])
-          .openingElement,
-      ),
-      'button',
-      'returns the tag name provided by the componnet mapping if the polymorphic prop, "asChild", defined in the settings is not set',
-    );
-
-    st.end();
-  });
-
-  t.test(
-    'polymorphicPropName settings and explicitly defined polymorphicAllowList in context',
-    st => {
-      const elementType = getElementType({
-        settings: {
-          'jsx-a11y-x': {
-            polymorphicPropName: 'asChild',
-            polymorphicAllowList: ['Box', 'Icon'],
-            components: {
-              Box: 'div',
-              Icon: 'svg',
-            },
-          },
-        },
-      });
-
-      st.equal(
-        elementType(
-          JSXElementMock('Spinner', [JSXAttributeMock('asChild', 'img')])
-            .openingElement,
-        ),
-        'Spinner',
-        'does not use the polymorphic prop if polymorphicAllowList is defined, but element is not part of polymorphicAllowList',
-      );
-
-      st.equal(
-        elementType(
-          JSXElementMock('Icon', [JSXAttributeMock('asChild', 'img')])
-            .openingElement,
-        ),
-        'img',
-        'uses the polymorphic prop if it is in explicitly defined polymorphicAllowList',
-      );
-
-      st.equal(
-        elementType(
-          JSXElementMock('Box', [JSXAttributeMock('asChild', 'span')])
-            .openingElement,
-        ),
-        'span',
-        'returns the tag name provided by the polymorphic prop, "asChild", defined in the settings instead of the component mapping tag',
-      );
-
-      st.equal(
-        elementType(
-          JSXElementMock('Box', [JSXAttributeMock('as', 'a')]).openingElement,
-        ),
-        'div',
-        'returns the tag name provided by the component mapping if the polymorphic prop, "asChild", defined in the settings is not set',
-      );
-
-      st.end();
-    },
-  );
-
-  t.end();
-});
diff --git a/__tests__/src/util/getElementType.spec.js b/__tests__/src/util/getElementType.spec.js
new file mode 100644
index 00000000..1ee46513
--- /dev/null
+++ b/__tests__/src/util/getElementType.spec.js
@@ -0,0 +1,163 @@
+import getElementType from '../../../src/util/getElementType';
+import JSXElementMock from '../../../__mocks__/JSXElementMock';
+import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
+
+describe('getElementType', () => {
+  test('no settings in context', () => {
+    const elementType = getElementType({ settings: {} });
+
+    expect(elementType(JSXElementMock('input').openingElement)).toBe(
+      'input',
+      'returns the exact tag name for a DOM element',
+    );
+
+    expect(elementType(JSXElementMock('CustomInput').openingElement)).toBe(
+      'CustomInput',
+      'returns the exact tag name for a custom element',
+    );
+
+    expect(elementType(JSXElementMock('toString').openingElement)).toBe(
+      'toString',
+      'returns the exact tag name for names that are in Object.prototype',
+    );
+
+    expect(
+      elementType(
+        JSXElementMock('span', [JSXAttributeMock('as', 'h1')]).openingElement,
+      ),
+    ).toBe('span', 'returns the default tag name provided');
+  });
+
+  test('components settings in context', () => {
+    const elementType = getElementType({
+      settings: {
+        'jsx-a11y-x': {
+          components: {
+            CustomInput: 'input',
+          },
+        },
+      },
+    });
+
+    expect(elementType(JSXElementMock('input').openingElement)).toBe(
+      'input',
+      'returns the exact tag name for a DOM element',
+    );
+
+    expect(elementType(JSXElementMock('CustomInput').openingElement)).toBe(
+      'input',
+      'returns the mapped tag name for a custom element',
+    );
+
+    expect(elementType(JSXElementMock('CityInput').openingElement)).toBe(
+      'CityInput',
+      'returns the exact tag name for a custom element not in the components map',
+    );
+
+    expect(
+      elementType(
+        JSXElementMock('span', [JSXAttributeMock('as', 'h1')]).openingElement,
+      ),
+    ).toBe(
+      'span',
+      'return the default tag name since not polymorphicPropName was provided',
+    );
+  });
+
+  test('polymorphicPropName settings in context', () => {
+    const elementType = getElementType({
+      settings: {
+        'jsx-a11y-x': {
+          polymorphicPropName: 'asChild',
+          components: {
+            CustomButton: 'button',
+          },
+        },
+      },
+    });
+
+    expect(
+      elementType(
+        JSXElementMock('span', [JSXAttributeMock('asChild', 'h1')])
+          .openingElement,
+      ),
+    ).toBe(
+      'h1',
+      'returns the tag name provided by the polymorphic prop, "asChild", defined in the settings',
+    );
+
+    expect(
+      elementType(
+        JSXElementMock('CustomButton', [JSXAttributeMock('asChild', 'a')])
+          .openingElement,
+      ),
+    ).toBe(
+      'a',
+      'returns the tag name provided by the polymorphic prop, "asChild", defined in the settings instead of the component mapping tag',
+    );
+
+    expect(
+      elementType(
+        JSXElementMock('CustomButton', [JSXAttributeMock('as', 'a')])
+          .openingElement,
+      ),
+    ).toBe(
+      'button',
+      'returns the tag name provided by the componnet mapping if the polymorphic prop, "asChild", defined in the settings is not set',
+    );
+  });
+
+  test('polymorphicPropName settings and explicitly defined polymorphicAllowList in context', () => {
+    const elementType = getElementType({
+      settings: {
+        'jsx-a11y-x': {
+          polymorphicPropName: 'asChild',
+          polymorphicAllowList: ['Box', 'Icon'],
+          components: {
+            Box: 'div',
+            Icon: 'svg',
+          },
+        },
+      },
+    });
+
+    expect(
+      elementType(
+        JSXElementMock('Spinner', [JSXAttributeMock('asChild', 'img')])
+          .openingElement,
+      ),
+    ).toBe(
+      'Spinner',
+      'does not use the polymorphic prop if polymorphicAllowList is defined, but element is not part of polymorphicAllowList',
+    );
+
+    expect(
+      elementType(
+        JSXElementMock('Icon', [JSXAttributeMock('asChild', 'img')])
+          .openingElement,
+      ),
+    ).toBe(
+      'img',
+      'uses the polymorphic prop if it is in explicitly defined polymorphicAllowList',
+    );
+
+    expect(
+      elementType(
+        JSXElementMock('Box', [JSXAttributeMock('asChild', 'span')])
+          .openingElement,
+      ),
+    ).toBe(
+      'span',
+      'returns the tag name provided by the polymorphic prop, "asChild", defined in the settings instead of the component mapping tag',
+    );
+
+    expect(
+      elementType(
+        JSXElementMock('Box', [JSXAttributeMock('as', 'a')]).openingElement,
+      ),
+    ).toBe(
+      'div',
+      'returns the tag name provided by the component mapping if the polymorphic prop, "asChild", defined in the settings is not set',
+    );
+  });
+});
diff --git a/__tests__/src/util/getExplicitRole-test.js b/__tests__/src/util/getExplicitRole-test.js
deleted file mode 100644
index fd468c0c..00000000
--- a/__tests__/src/util/getExplicitRole-test.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import test from 'tape';
-
-import getExplicitRole from '../../../src/util/getExplicitRole';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-
-test('getExplicitRole', t => {
-  t.equal(
-    getExplicitRole('div', [JSXAttributeMock('role', 'button')]),
-    'button',
-    'valid role returns the role',
-  );
-
-  t.equal(
-    getExplicitRole('div', [JSXAttributeMock('role', 'beeswax')]),
-    null,
-    'invalid role returns null',
-  );
-
-  t.equal(getExplicitRole('div', []), null, 'no role returns null');
-
-  t.end();
-});
diff --git a/__tests__/src/util/getExplicitRole.spec.js b/__tests__/src/util/getExplicitRole.spec.js
new file mode 100644
index 00000000..b3fab819
--- /dev/null
+++ b/__tests__/src/util/getExplicitRole.spec.js
@@ -0,0 +1,14 @@
+import getExplicitRole from '../../../src/util/getExplicitRole';
+import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
+
+test('getExplicitRole', () => {
+  expect(getExplicitRole('div', [JSXAttributeMock('role', 'button')])).toBe(
+    'button',
+  );
+
+  expect(getExplicitRole('div', [JSXAttributeMock('role', 'beeswax')])).toBe(
+    null,
+  );
+
+  expect(getExplicitRole('div', [])).toBe(null);
+});
diff --git a/__tests__/src/util/getImplicitRole-test.js b/__tests__/src/util/getImplicitRole-test.js
deleted file mode 100644
index deef0a37..00000000
--- a/__tests__/src/util/getImplicitRole-test.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import test from 'tape';
-
-import getImplicitRole from '../../../src/util/getImplicitRole';
-
-test('getImplicitRole', t => {
-  t.equal(
-    getImplicitRole('li', []),
-    'listitem',
-    'has implicit, returns implicit role',
-  );
-
-  t.equal(getImplicitRole('div', []), null, 'lacks implicit, returns null');
-
-  t.end();
-});
diff --git a/__tests__/src/util/getImplicitRole.spec.js b/__tests__/src/util/getImplicitRole.spec.js
new file mode 100644
index 00000000..ee852f8d
--- /dev/null
+++ b/__tests__/src/util/getImplicitRole.spec.js
@@ -0,0 +1,7 @@
+import getImplicitRole from '../../../src/util/getImplicitRole';
+
+test('getImplicitRole', () => {
+  expect(getImplicitRole('li', [])).toBe('listitem');
+
+  expect(getImplicitRole('div', [])).toBe(null);
+});
diff --git a/__tests__/src/util/getSuggestion-test.js b/__tests__/src/util/getSuggestion-test.js
deleted file mode 100644
index 765abf9c..00000000
--- a/__tests__/src/util/getSuggestion-test.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import test from 'tape';
-
-import getSuggestion from '../../../src/util/getSuggestion';
-
-test('spell check suggestion API', t => {
-  t.deepEqual(
-    [],
-    getSuggestion('foo'),
-    'returns no suggestions given empty word and no dictionary',
-  );
-
-  t.deepEqual(
-    getSuggestion('foo'),
-    [],
-    'returns no suggestions given real word and no dictionary',
-  );
-
-  t.deepEqual(
-    getSuggestion('fo', ['foo', 'bar', 'baz']),
-    ['foo'],
-    'returns correct suggestion given real word and a dictionary',
-  );
-
-  t.deepEqual(
-    getSuggestion('theer', ['there', 'their', 'foo', 'bar']),
-    ['there', 'their'],
-    'returns multiple correct suggestions given real word and a dictionary',
-  );
-
-  t.deepEqual(
-    getSuggestion('theer', ['there', 'their', 'foo', 'bar'], 1),
-    ['there'],
-    'returns correct # of suggestions given the limit argument',
-  );
-
-  t.end();
-});
diff --git a/__tests__/src/util/getSuggestion.spec.js b/__tests__/src/util/getSuggestion.spec.js
new file mode 100644
index 00000000..71b74666
--- /dev/null
+++ b/__tests__/src/util/getSuggestion.spec.js
@@ -0,0 +1,18 @@
+import getSuggestion from '../../../src/util/getSuggestion';
+
+test('spell check suggestion API', () => {
+  expect([]).toEqual(getSuggestion('foo'));
+
+  expect(getSuggestion('foo')).toEqual([]);
+
+  expect(getSuggestion('fo', ['foo', 'bar', 'baz'])).toEqual(['foo']);
+
+  expect(getSuggestion('theer', ['there', 'their', 'foo', 'bar'])).toEqual([
+    'there',
+    'their',
+  ]);
+
+  expect(getSuggestion('theer', ['there', 'their', 'foo', 'bar'], 1)).toEqual([
+    'there',
+  ]);
+});
diff --git a/__tests__/src/util/getTabIndex-test.js b/__tests__/src/util/getTabIndex-test.js
deleted file mode 100644
index 926656b0..00000000
--- a/__tests__/src/util/getTabIndex-test.js
+++ /dev/null
@@ -1,81 +0,0 @@
-import test from 'tape';
-
-import getTabIndex from '../../../src/util/getTabIndex';
-import IdentifierMock from '../../../__mocks__/IdentifierMock';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-
-test('getTabIndex', t => {
-  t.equal(
-    getTabIndex(JSXAttributeMock('tabIndex', 0)),
-    0,
-    'tabIndex is defined as zero -> zero',
-  );
-
-  t.equal(
-    getTabIndex(JSXAttributeMock('tabIndex', 1)),
-    1,
-    'tabIndex is defined as a positive integer -> returns it',
-  );
-
-  t.equal(
-    getTabIndex(JSXAttributeMock('tabIndex', -1)),
-    -1,
-    'tabIndex is defined as a negative integer -> returns it',
-  );
-
-  t.equal(
-    getTabIndex(JSXAttributeMock('tabIndex', '')),
-    undefined,
-    'tabIndex is defined as an empty string -> undefined',
-  );
-
-  t.equal(
-    getTabIndex(JSXAttributeMock('tabIndex', 9.1)),
-    undefined,
-    'tabIndex is defined as a float -> undefined',
-  );
-
-  t.equal(
-    getTabIndex(JSXAttributeMock('tabIndex', '0')),
-    0,
-    'tabIndex is defined as a string which converts to a number -> returns the integer',
-  );
-
-  t.equal(
-    getTabIndex(JSXAttributeMock('tabIndex', '0a')),
-    undefined,
-    'tabIndex is defined as a string which is NaN -> returns undefined',
-  );
-
-  t.equal(
-    getTabIndex(JSXAttributeMock('tabIndex', true)),
-    undefined,
-    'tabIndex is defined as true -> returns undefined',
-  );
-  t.equal(
-    getTabIndex(JSXAttributeMock('tabIndex', false)),
-    undefined,
-    'tabIndex is defined as false -> returns undefined',
-  );
-
-  t.equal(
-    typeof getTabIndex(JSXAttributeMock('tabIndex', () => 0)),
-    'function',
-    'tabIndex is defined as a function expression -> returns the correct type',
-  );
-
-  const name = 'identName';
-  t.equal(
-    getTabIndex(JSXAttributeMock('tabIndex', IdentifierMock(name), true)),
-    name,
-    'tabIndex is defined as a variable expression -> returns the Identifier name',
-  );
-
-  t.equal(
-    getTabIndex(JSXAttributeMock('tabIndex', undefined)),
-    undefined,
-    'tabIndex is not defined -> returns undefined',
-  );
-
-  t.end();
-});
diff --git a/__tests__/src/util/getTabIndex.spec.js b/__tests__/src/util/getTabIndex.spec.js
new file mode 100644
index 00000000..137b6ad3
--- /dev/null
+++ b/__tests__/src/util/getTabIndex.spec.js
@@ -0,0 +1,33 @@
+import getTabIndex from '../../../src/util/getTabIndex';
+import IdentifierMock from '../../../__mocks__/IdentifierMock';
+import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
+
+test('getTabIndex', () => {
+  expect(getTabIndex(JSXAttributeMock('tabIndex', 0))).toBe(0);
+
+  expect(getTabIndex(JSXAttributeMock('tabIndex', 1))).toBe(1);
+
+  expect(getTabIndex(JSXAttributeMock('tabIndex', -1))).toBe(-1);
+
+  expect(getTabIndex(JSXAttributeMock('tabIndex', ''))).toBe(undefined);
+
+  expect(getTabIndex(JSXAttributeMock('tabIndex', 9.1))).toBe(undefined);
+
+  expect(getTabIndex(JSXAttributeMock('tabIndex', '0'))).toBe(0);
+
+  expect(getTabIndex(JSXAttributeMock('tabIndex', '0a'))).toBe(undefined);
+
+  expect(getTabIndex(JSXAttributeMock('tabIndex', true))).toBe(undefined);
+  expect(getTabIndex(JSXAttributeMock('tabIndex', false))).toBe(undefined);
+
+  expect(typeof getTabIndex(JSXAttributeMock('tabIndex', () => 0))).toBe(
+    'function',
+  );
+
+  const name = 'identName';
+  expect(
+    getTabIndex(JSXAttributeMock('tabIndex', IdentifierMock(name), true)),
+  ).toBe(name);
+
+  expect(getTabIndex(JSXAttributeMock('tabIndex', undefined))).toBe(undefined);
+});
diff --git a/__tests__/src/util/hasAccessibleChild-test.js b/__tests__/src/util/hasAccessibleChild.spec.js
similarity index 68%
rename from __tests__/src/util/hasAccessibleChild-test.js
rename to __tests__/src/util/hasAccessibleChild.spec.js
index f2df739f..19b74f5d 100644
--- a/__tests__/src/util/hasAccessibleChild-test.js
+++ b/__tests__/src/util/hasAccessibleChild.spec.js
@@ -1,4 +1,3 @@
-import test from 'tape';
 import { elementType } from 'jsx-ast-utils-x';
 
 import hasAccessibleChild from '../../../src/util/hasAccessibleChild';
@@ -6,14 +5,12 @@ import JSXElementMock from '../../../__mocks__/JSXElementMock';
 import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
 import JSXExpressionContainerMock from '../../../__mocks__/JSXExpressionContainerMock';
 
-test('hasAccessibleChild', t => {
-  t.equal(
-    hasAccessibleChild(JSXElementMock('div', []), elementType),
+test('hasAccessibleChild', () => {
+  expect(hasAccessibleChild(JSXElementMock('div', []), elementType)).toBe(
     false,
-    'has no children and does not set dangerouslySetInnerHTML -> false',
   );
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock(
         'div',
@@ -22,11 +19,9 @@ test('hasAccessibleChild', t => {
       ),
       elementType,
     ),
-    true,
-    'has no children and sets dangerouslySetInnerHTML -> true',
-  );
+  ).toBe(true);
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock(
         'div',
@@ -40,20 +35,16 @@ test('hasAccessibleChild', t => {
       ),
       elementType,
     ),
-    true,
-    'has children + Literal child -> true',
-  );
+  ).toBe(true);
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock('div', [], [JSXElementMock('div', [])]),
       elementType,
     ),
-    true,
-    'has children + visible JSXElement child -> true',
-  );
+  ).toBe(true);
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock(
         'div',
@@ -67,11 +58,9 @@ test('hasAccessibleChild', t => {
       ),
       elementType,
     ),
-    true,
-    'has children + JSText element -> true',
-  );
+  ).toBe(true);
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock(
         'div',
@@ -80,11 +69,9 @@ test('hasAccessibleChild', t => {
       ),
       elementType,
     ),
-    false,
-    'has children + hidden child JSXElement -> false',
-  );
+  ).toBe(false);
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock(
         'div',
@@ -98,11 +85,9 @@ test('hasAccessibleChild', t => {
       ),
       elementType,
     ),
-    true,
-    'defined JSXExpressionContainer -> true',
-  );
+  ).toBe(true);
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock(
         'div',
@@ -116,11 +101,9 @@ test('hasAccessibleChild', t => {
       ),
       elementType,
     ),
-    false,
-    'has children + undefined JSXExpressionContainer -> false',
-  );
+  ).toBe(false);
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock(
         'div',
@@ -133,20 +116,16 @@ test('hasAccessibleChild', t => {
       ),
       elementType,
     ),
-    false,
-    'unknown child type -> false',
-  );
+  ).toBe(false);
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock('div', [JSXAttributeMock('children', true)], []),
       elementType,
     ),
-    true,
-    'children passed as a prop -> true',
-  );
+  ).toBe(true);
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock(
         'div',
@@ -155,11 +134,9 @@ test('hasAccessibleChild', t => {
       ),
       elementType,
     ),
-    false,
-    'has chidren -> hidden child input JSXElement -> false',
-  );
+  ).toBe(false);
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock(
         'div',
@@ -168,11 +145,9 @@ test('hasAccessibleChild', t => {
       ),
       elementType,
     ),
-    true,
-    'has children + custom JSXElement of type hidden -> true',
-  );
+  ).toBe(true);
 
-  t.equal(
+  expect(
     hasAccessibleChild(
       JSXElementMock(
         'div',
@@ -181,9 +156,5 @@ test('hasAccessibleChild', t => {
       ),
       () => 'input',
     ),
-    false,
-    'custom JSXElement mapped to input if type is hidden -> false',
-  );
-
-  t.end();
+  ).toBe(false);
 });
diff --git a/__tests__/src/util/implicitRoles/input-test.js b/__tests__/src/util/implicitRoles/input-test.js
deleted file mode 100644
index a85f21eb..00000000
--- a/__tests__/src/util/implicitRoles/input-test.js
+++ /dev/null
@@ -1,87 +0,0 @@
-import test from 'tape';
-
-import JSXAttributeMock from '../../../../__mocks__/JSXAttributeMock';
-import getImplicitRoleForInput from '../../../../src/util/implicitRoles/input';
-
-test('isAbstractRole', t => {
-  t.test('works for buttons', st => {
-    st.equal(
-      getImplicitRoleForInput([JSXAttributeMock('type', 'button')]),
-      'button',
-    );
-
-    st.equal(
-      getImplicitRoleForInput([JSXAttributeMock('type', 'image')]),
-      'button',
-    );
-
-    st.equal(
-      getImplicitRoleForInput([JSXAttributeMock('type', 'reset')]),
-      'button',
-    );
-
-    st.equal(
-      getImplicitRoleForInput([JSXAttributeMock('type', 'submit')]),
-      'button',
-    );
-
-    st.end();
-  });
-
-  t.equal(
-    getImplicitRoleForInput([JSXAttributeMock('type', 'checkbox')]),
-    'checkbox',
-    'works for checkboxes',
-  );
-
-  t.equal(
-    getImplicitRoleForInput([JSXAttributeMock('type', 'radio')]),
-    'radio',
-    'works for radios',
-  );
-
-  t.equal(
-    getImplicitRoleForInput([JSXAttributeMock('type', 'range')]),
-    'slider',
-    'works for ranges',
-  );
-
-  t.test('works for textboxes', st => {
-    st.equal(
-      getImplicitRoleForInput([JSXAttributeMock('type', 'email')]),
-      'textbox',
-    );
-    st.equal(
-      getImplicitRoleForInput([JSXAttributeMock('type', 'password')]),
-      'textbox',
-    );
-    st.equal(
-      getImplicitRoleForInput([JSXAttributeMock('type', 'search')]),
-      'textbox',
-    );
-    st.equal(
-      getImplicitRoleForInput([JSXAttributeMock('type', 'tel')]),
-      'textbox',
-    );
-    st.equal(
-      getImplicitRoleForInput([JSXAttributeMock('type', 'url')]),
-      'textbox',
-    );
-
-    st.end();
-  });
-
-  t.equal(
-    getImplicitRoleForInput([JSXAttributeMock('type', '')]),
-    'textbox',
-    'works for the default case',
-  );
-
-  t.equal(
-    getImplicitRoleForInput([JSXAttributeMock('type', true)]),
-    'textbox',
-    'works for the true case',
-  );
-
-  t.end();
-});
diff --git a/__tests__/src/util/implicitRoles/input.spec.js b/__tests__/src/util/implicitRoles/input.spec.js
new file mode 100644
index 00000000..12f5b5f3
--- /dev/null
+++ b/__tests__/src/util/implicitRoles/input.spec.js
@@ -0,0 +1,60 @@
+import JSXAttributeMock from '../../../../__mocks__/JSXAttributeMock';
+import getImplicitRoleForInput from '../../../../src/util/implicitRoles/input';
+
+describe('isAbstractRole', () => {
+  test('works for buttons', () => {
+    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'button')])).toBe(
+      'button',
+    );
+
+    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'image')])).toBe(
+      'button',
+    );
+
+    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'reset')])).toBe(
+      'button',
+    );
+
+    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'submit')])).toBe(
+      'button',
+    );
+  });
+
+  expect(getImplicitRoleForInput([JSXAttributeMock('type', 'checkbox')])).toBe(
+    'checkbox',
+  );
+
+  expect(getImplicitRoleForInput([JSXAttributeMock('type', 'radio')])).toBe(
+    'radio',
+  );
+
+  expect(getImplicitRoleForInput([JSXAttributeMock('type', 'range')])).toBe(
+    'slider',
+  );
+
+  test('works for textboxes', () => {
+    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'email')])).toBe(
+      'textbox',
+    );
+    expect(
+      getImplicitRoleForInput([JSXAttributeMock('type', 'password')]),
+    ).toBe('textbox');
+    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'search')])).toBe(
+      'textbox',
+    );
+    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'tel')])).toBe(
+      'textbox',
+    );
+    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'url')])).toBe(
+      'textbox',
+    );
+  });
+
+  expect(getImplicitRoleForInput([JSXAttributeMock('type', '')])).toBe(
+    'textbox',
+  );
+
+  expect(getImplicitRoleForInput([JSXAttributeMock('type', true)])).toBe(
+    'textbox',
+  );
+});
diff --git a/__tests__/src/util/implicitRoles/menu-test.js b/__tests__/src/util/implicitRoles/menu-test.js
deleted file mode 100644
index fcc55b99..00000000
--- a/__tests__/src/util/implicitRoles/menu-test.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import test from 'tape';
-
-import JSXAttributeMock from '../../../../__mocks__/JSXAttributeMock';
-import getImplicitRoleForMenu from '../../../../src/util/implicitRoles/menu';
-
-test('isAbstractRole', t => {
-  t.equal(
-    getImplicitRoleForMenu([JSXAttributeMock('type', 'toolbar')]),
-    'toolbar',
-    'works for toolbars',
-  );
-
-  t.equal(
-    getImplicitRoleForMenu([JSXAttributeMock('type', '')]),
-    '',
-    'works for non-toolbars',
-  );
-
-  t.end();
-});
diff --git a/__tests__/src/util/implicitRoles/menu.spec.js b/__tests__/src/util/implicitRoles/menu.spec.js
new file mode 100644
index 00000000..acc17f4d
--- /dev/null
+++ b/__tests__/src/util/implicitRoles/menu.spec.js
@@ -0,0 +1,10 @@
+import JSXAttributeMock from '../../../../__mocks__/JSXAttributeMock';
+import getImplicitRoleForMenu from '../../../../src/util/implicitRoles/menu';
+
+test('isAbstractRole', () => {
+  expect(getImplicitRoleForMenu([JSXAttributeMock('type', 'toolbar')])).toBe(
+    'toolbar',
+  );
+
+  expect(getImplicitRoleForMenu([JSXAttributeMock('type', '')])).toBe('');
+});
diff --git a/__tests__/src/util/implicitRoles/menuitem-test.js b/__tests__/src/util/implicitRoles/menuitem-test.js
deleted file mode 100644
index be789e85..00000000
--- a/__tests__/src/util/implicitRoles/menuitem-test.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import test from 'tape';
-
-import JSXAttributeMock from '../../../../__mocks__/JSXAttributeMock';
-import getImplicitRoleForMenuitem from '../../../../src/util/implicitRoles/menuitem';
-
-test('isAbstractRole', t => {
-  t.equal(
-    getImplicitRoleForMenuitem([JSXAttributeMock('type', 'command')]),
-    'menuitem',
-    'works for menu items',
-  );
-
-  t.equal(
-    getImplicitRoleForMenuitem([JSXAttributeMock('type', 'checkbox')]),
-    'menuitemcheckbox',
-    'works for menu item checkboxes',
-  );
-
-  t.equal(
-    getImplicitRoleForMenuitem([JSXAttributeMock('type', 'radio')]),
-    'menuitemradio',
-    'works for menu item radios',
-  );
-
-  t.equal(
-    getImplicitRoleForMenuitem([JSXAttributeMock('type', '')]),
-    '',
-    'works for non-toolbars',
-  );
-
-  t.equal(
-    getImplicitRoleForMenuitem([JSXAttributeMock('type', true)]),
-    '',
-    'works for the true case',
-  );
-
-  t.end();
-});
diff --git a/__tests__/src/util/implicitRoles/menuitem.spec.js b/__tests__/src/util/implicitRoles/menuitem.spec.js
new file mode 100644
index 00000000..83144d28
--- /dev/null
+++ b/__tests__/src/util/implicitRoles/menuitem.spec.js
@@ -0,0 +1,20 @@
+import JSXAttributeMock from '../../../../__mocks__/JSXAttributeMock';
+import getImplicitRoleForMenuitem from '../../../../src/util/implicitRoles/menuitem';
+
+test('isAbstractRole', () => {
+  expect(
+    getImplicitRoleForMenuitem([JSXAttributeMock('type', 'command')]),
+  ).toBe('menuitem');
+
+  expect(
+    getImplicitRoleForMenuitem([JSXAttributeMock('type', 'checkbox')]),
+  ).toBe('menuitemcheckbox');
+
+  expect(getImplicitRoleForMenuitem([JSXAttributeMock('type', 'radio')])).toBe(
+    'menuitemradio',
+  );
+
+  expect(getImplicitRoleForMenuitem([JSXAttributeMock('type', '')])).toBe('');
+
+  expect(getImplicitRoleForMenuitem([JSXAttributeMock('type', true)])).toBe('');
+});
diff --git a/__tests__/src/util/implicitRoles/select-test.js b/__tests__/src/util/implicitRoles/select.spec.js
similarity index 53%
rename from __tests__/src/util/implicitRoles/select-test.js
rename to __tests__/src/util/implicitRoles/select.spec.js
index 05e90136..96ccdc92 100644
--- a/__tests__/src/util/implicitRoles/select-test.js
+++ b/__tests__/src/util/implicitRoles/select.spec.js
@@ -1,154 +1,129 @@
-import test from 'tape';
-
 import JSXAttributeMock from '../../../../__mocks__/JSXAttributeMock';
 import getImplicitRoleForSelect from '../../../../src/util/implicitRoles/select';
 
-test('isAbstractRole', t => {
-  t.test('works for combobox', st => {
-    st.equal(getImplicitRoleForSelect([]), 'combobox', 'defaults to combobox');
+describe('isAbstractRole', () => {
+  test('works for combobox', () => {
+    expect(getImplicitRoleForSelect([])).toBe(
+      'combobox',
+      'defaults to combobox',
+    );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('multiple', null)]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('multiple', null)])).toBe(
       'combobox',
       'is combobox when multiple attribute is set to not be present',
     );
 
-    st.equal(
+    expect(
       getImplicitRoleForSelect([JSXAttributeMock('multiple', undefined)]),
+    ).toBe(
       'combobox',
       'is combobox when multiple attribute is set to not be present',
     );
 
-    st.equal(
+    expect(
       getImplicitRoleForSelect([JSXAttributeMock('multiple', false)]),
+    ).toBe(
       'combobox',
       'is combobox when multiple attribute is set to boolean false',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('multiple', '')]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('multiple', '')])).toBe(
       'combobox',
       'is listbox when multiple attribute is falsey (empty string)',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', '1')]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', '1')])).toBe(
       'combobox',
       'is combobox when size is not greater than 1',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', 1)]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', 1)])).toBe(
       'combobox',
       'is combobox when size is not greater than 1',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', 0)]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', 0)])).toBe(
       'combobox',
       'is combobox when size is not greater than 1',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', '0')]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', '0')])).toBe(
       'combobox',
       'is combobox when size is not greater than 1',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', '-1')]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', '-1')])).toBe(
       'combobox',
       'is combobox when size is not greater than 1',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', '')]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', '')])).toBe(
       'combobox',
       'is combobox when size is a valid number',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', 'true')]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', 'true')])).toBe(
       'combobox',
       'is combobox when size is a valid number',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', true)]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', true)])).toBe(
       'combobox',
       'is combobox when size is a valid number',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', NaN)]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', NaN)])).toBe(
       'combobox',
       'is combobox when size is a valid number',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', '')]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', '')])).toBe(
       'combobox',
       'is combobox when size is a valid number',
     );
 
-    st.equal(
+    expect(
       getImplicitRoleForSelect([JSXAttributeMock('size', undefined)]),
-      'combobox',
-      'is combobox when size is a valid number',
-    );
+    ).toBe('combobox', 'is combobox when size is a valid number');
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', false)]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', false)])).toBe(
       'combobox',
       'is combobox when size is a valid number',
     );
-
-    st.end();
   });
 
-  t.test('works for listbox based on multiple attribute', st => {
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('multiple', true)]),
+  test('works for listbox based on multiple attribute', () => {
+    expect(getImplicitRoleForSelect([JSXAttributeMock('multiple', true)])).toBe(
       'listbox',
       'is listbox when multiple is boolean true',
     );
 
-    st.equal(
+    expect(
       getImplicitRoleForSelect([JSXAttributeMock('multiple', 'multiple')]),
-      'listbox',
-      'is listbox when multiple is truthy (string)',
-    );
+    ).toBe('listbox', 'is listbox when multiple is truthy (string)');
 
-    st.equal(
+    expect(
       getImplicitRoleForSelect([JSXAttributeMock('multiple', 'true')]),
+    ).toBe(
       'listbox',
       'is listbox when multiple is truthy (string) - React will warn about this',
     );
-
-    st.end();
   });
 
-  t.test('works for listbox based on size attribute', st => {
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', 2)]),
+  test('works for listbox based on size attribute', () => {
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', 2)])).toBe(
       'listbox',
       'is listbox when size is greater than 1',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', '3')]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', '3')])).toBe(
       'listbox',
       'is listbox when size is greater than 1',
     );
 
-    st.equal(
-      getImplicitRoleForSelect([JSXAttributeMock('size', 40)]),
+    expect(getImplicitRoleForSelect([JSXAttributeMock('size', 40)])).toBe(
       'listbox',
       'is listbox when size is greater than 1',
     );
-
-    st.end();
   });
-
-  t.end();
 });
diff --git a/__tests__/src/util/isAbstractRole-test.js b/__tests__/src/util/isAbstractRole.spec.js
similarity index 59%
rename from __tests__/src/util/isAbstractRole-test.js
rename to __tests__/src/util/isAbstractRole.spec.js
index cc6a6b2e..2275e161 100644
--- a/__tests__/src/util/isAbstractRole-test.js
+++ b/__tests__/src/util/isAbstractRole.spec.js
@@ -1,4 +1,3 @@
-import test from 'tape';
 import { elementType } from 'jsx-ast-utils-x';
 
 import isAbstractRole from '../../../src/util/isAbstractRole';
@@ -8,38 +7,26 @@ import {
   genNonAbstractRoleElements,
 } from '../../../__mocks__/genInteractives';
 
-test('isAbstractRole', t => {
-  t.equal(
-    isAbstractRole(undefined, []),
-    false,
-    'does NOT identify JSX Components (no tagName) as abstract role elements',
-  );
+describe('isAbstractRole', () => {
+  expect(isAbstractRole(undefined, [])).toBe(false);
 
-  t.test('elements with an abstract role', st => {
+  test('elements with an abstract role', () => {
     genAbstractRoleElements().forEach(({ openingElement }) => {
       const { attributes } = openingElement;
-      st.equal(
-        isAbstractRole(elementType(openingElement), attributes),
+      expect(isAbstractRole(elementType(openingElement), attributes)).toBe(
         true,
         `identifies \`${genElementSymbol(openingElement)}\` as an abstract role element`,
       );
     });
-
-    st.end();
   });
 
-  t.test('elements with a non-abstract role', st => {
+  test('elements with a non-abstract role', () => {
     genNonAbstractRoleElements().forEach(({ openingElement }) => {
       const { attributes } = openingElement;
-      st.equal(
-        isAbstractRole(elementType(openingElement), attributes),
+      expect(isAbstractRole(elementType(openingElement), attributes)).toBe(
         false,
         `does NOT identify \`${genElementSymbol(openingElement)}\` as an abstract role element`,
       );
     });
-
-    st.end();
   });
-
-  t.end();
 });
diff --git a/__tests__/src/util/isContentEditable-test.js b/__tests__/src/util/isContentEditable.spec.js
similarity index 80%
rename from __tests__/src/util/isContentEditable-test.js
rename to __tests__/src/util/isContentEditable.spec.js
index 16b87a21..4cbceba8 100644
--- a/__tests__/src/util/isContentEditable-test.js
+++ b/__tests__/src/util/isContentEditable.spec.js
@@ -1,52 +1,48 @@
-import test from 'tape';
-
 import isContentEditable from '../../../src/util/isContentEditable';
 import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
 
-test('isContentEditable - HTML5', t => {
-  t.equal(
+describe('isContentEditable - HTML5', () => {
+  expect(
     isContentEditable('some tag', [
       JSXAttributeMock('contentEditable', 'true'),
     ]),
-    true,
-    'identifies HTML5 contentEditable elements',
-  );
+  ).toBe(true);
 
-  t.test('not content editable', st => {
-    st.equal(
+  test('not content editable', () => {
+    expect(
       isContentEditable('some tag', [
         JSXAttributeMock('contentEditable', null),
       ]),
+    ).toBe(
       false,
       'does not identify HTML5 content editable elements with null as the value',
     );
 
-    st.equal(
+    expect(
       isContentEditable('some tag', [
         JSXAttributeMock('contentEditable', undefined),
       ]),
+    ).toBe(
       false,
       'does not identify HTML5 content editable elements with undefined as the value',
     );
 
-    st.equal(
+    expect(
       isContentEditable('some tag', [
         JSXAttributeMock('contentEditable', true),
       ]),
+    ).toBe(
       false,
       'does not identify HTML5 content editable elements with true as the value',
     );
 
-    st.equal(
+    expect(
       isContentEditable('some tag', [
         JSXAttributeMock('contentEditable', 'false'),
       ]),
+    ).toBe(
       false,
       'does not identify HTML5 content editable elements with "false" as the value',
     );
-
-    st.end();
   });
-
-  t.end();
 });
diff --git a/__tests__/src/util/isDOMElement-test.js b/__tests__/src/util/isDOMElement.spec.js
similarity index 54%
rename from __tests__/src/util/isDOMElement-test.js
rename to __tests__/src/util/isDOMElement.spec.js
index 343e95cc..572d1955 100644
--- a/__tests__/src/util/isDOMElement-test.js
+++ b/__tests__/src/util/isDOMElement.spec.js
@@ -1,30 +1,20 @@
-import test from 'tape';
 import { dom } from 'aria-query';
 import { elementType } from 'jsx-ast-utils-x';
 
 import isDOMElement from '../../../src/util/isDOMElement';
 import JSXElementMock from '../../../__mocks__/JSXElementMock';
 
-test('isDOMElement', t => {
-  t.test('DOM elements', st => {
+describe('isDOMElement', () => {
+  test('DOM elements', () => {
     dom.forEach((_, el) => {
       const element = JSXElementMock(el);
 
-      st.equal(
-        isDOMElement(elementType(element.openingElement)),
+      expect(isDOMElement(elementType(element.openingElement))).toBe(
         true,
         `identifies ${el} as a DOM element`,
       );
     });
-
-    st.end();
   });
 
-  t.equal(
-    isDOMElement(JSXElementMock('CustomElement')),
-    false,
-    'does not identify a custom element',
-  );
-
-  t.end();
+  expect(isDOMElement(JSXElementMock('CustomElement'))).toBe(false);
 });
diff --git a/__tests__/src/util/isDisabledElement-test.js b/__tests__/src/util/isDisabledElement.spec.js
similarity index 53%
rename from __tests__/src/util/isDisabledElement-test.js
rename to __tests__/src/util/isDisabledElement.spec.js
index 5b627242..4f2c020a 100644
--- a/__tests__/src/util/isDisabledElement-test.js
+++ b/__tests__/src/util/isDisabledElement.spec.js
@@ -1,70 +1,54 @@
-import test from 'tape';
-
 import isDisabledElement from '../../../src/util/isDisabledElement';
 import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
 
-test('isDisabledElement', t => {
-  t.test('HTML5', st => {
-    st.equal(
-      isDisabledElement([JSXAttributeMock('disabled', 'disabled')]),
+describe('isDisabledElement', () => {
+  test('HTML5', () => {
+    expect(isDisabledElement([JSXAttributeMock('disabled', 'disabled')])).toBe(
       true,
       'identifies HTML5 disabled elements',
     );
 
-    st.equal(
-      isDisabledElement([JSXAttributeMock('disabled', null)]),
+    expect(isDisabledElement([JSXAttributeMock('disabled', null)])).toBe(
       true,
       'identifies HTML5 disabled elements with null as the value',
     );
 
-    st.equal(
-      isDisabledElement([JSXAttributeMock('disabled', undefined)]),
+    expect(isDisabledElement([JSXAttributeMock('disabled', undefined)])).toBe(
       false,
       'does not identify HTML5 disabled elements with undefined as the value',
     );
-
-    st.end();
   });
 
-  t.test('ARIA', st => {
-    st.equal(
-      isDisabledElement([JSXAttributeMock('aria-disabled', 'true')]),
+  test('ARIA', () => {
+    expect(isDisabledElement([JSXAttributeMock('aria-disabled', 'true')])).toBe(
       true,
       'does not identify ARIA disabled elements',
     );
 
-    st.equal(
-      isDisabledElement([JSXAttributeMock('aria-disabled', true)]),
+    expect(isDisabledElement([JSXAttributeMock('aria-disabled', true)])).toBe(
       true,
       'does not identify ARIA disabled elements',
     );
 
-    st.equal(
+    expect(
       isDisabledElement([JSXAttributeMock('aria-disabled', 'false')]),
-      false,
-      'does not identify ARIA disabled elements',
-    );
+    ).toBe(false, 'does not identify ARIA disabled elements');
 
-    st.equal(
-      isDisabledElement([JSXAttributeMock('aria-disabled', false)]),
+    expect(isDisabledElement([JSXAttributeMock('aria-disabled', false)])).toBe(
       false,
       'does not identify ARIA disabled elements',
     );
 
-    st.equal(
-      isDisabledElement([JSXAttributeMock('aria-disabled', null)]),
+    expect(isDisabledElement([JSXAttributeMock('aria-disabled', null)])).toBe(
       false,
       'does not identify ARIA disabled elements with null as the value',
     );
 
-    st.equal(
+    expect(
       isDisabledElement([JSXAttributeMock('aria-disabled', undefined)]),
+    ).toBe(
       false,
       'does not identify ARIA disabled elements with undefined as the value',
     );
-
-    st.end();
   });
-
-  t.end();
 });
diff --git a/__tests__/src/util/isFocusable-test.js b/__tests__/src/util/isFocusable.spec.js
similarity index 88%
rename from __tests__/src/util/isFocusable-test.js
rename to __tests__/src/util/isFocusable.spec.js
index 22c71e05..b97c6102 100644
--- a/__tests__/src/util/isFocusable-test.js
+++ b/__tests__/src/util/isFocusable.spec.js
@@ -1,4 +1,3 @@
-import test from 'tape';
 import { elementType } from 'jsx-ast-utils-x';
 
 import isFocusable from '../../../src/util/isFocusable';
@@ -13,93 +12,96 @@ function mergeTabIndex(index, attributes) {
   return [].concat(attributes, JSXAttributeMock('tabIndex', index));
 }
 
-test('isFocusable', t => {
-  t.test('interactive elements', st => {
+describe('isFocusable', () => {
+  test('interactive elements', () => {
     genInteractiveElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isFocusable(elementType(openingElement), openingElement.attributes),
+      ).toBe(
         true,
         `identifies \`${genElementSymbol(openingElement)}\` as a focusable element`,
       );
 
-      st.equal(
+      expect(
         isFocusable(
           elementType(openingElement),
           mergeTabIndex(-1, openingElement.attributes),
         ),
+      ).toBe(
         false,
         `does NOT identify \`${genElementSymbol(openingElement)}\` with tabIndex of -1 as a focusable element`,
       );
 
-      st.equal(
+      expect(
         isFocusable(
           elementType(openingElement),
           mergeTabIndex(0, openingElement.attributes),
         ),
+      ).toBe(
         true,
         `identifies \`${genElementSymbol(openingElement)}\` with tabIndex of 0 as a focusable element`,
       );
 
-      st.equal(
+      expect(
         isFocusable(
           elementType(openingElement),
           mergeTabIndex(1, openingElement.attributes),
         ),
+      ).toBe(
         true,
         `identifies \`${genElementSymbol(openingElement)}\` with tabIndex of 1 as a focusable element`,
       );
     });
-
-    st.end();
   });
 
-  t.test('non-interactive elements', st => {
+  test('non-interactive elements', () => {
     genNonInteractiveElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isFocusable(elementType(openingElement), openingElement.attributes),
+      ).toBe(
         false,
         `does NOT identify \`${genElementSymbol(openingElement)}\` as a focusable element`,
       );
 
-      st.equal(
+      expect(
         isFocusable(
           elementType(openingElement),
           mergeTabIndex(-1, openingElement.attributes),
         ),
+      ).toBe(
         false,
         `does NOT identify \`${genElementSymbol(openingElement)}\` with tabIndex of -1 as a focusable element`,
       );
 
-      st.equal(
+      expect(
         isFocusable(
           elementType(openingElement),
           mergeTabIndex(0, openingElement.attributes),
         ),
+      ).toBe(
         true,
         `identifies \`${genElementSymbol(openingElement)}\` with tabIndex of 0 as a focusable element`,
       );
 
-      st.equal(
+      expect(
         isFocusable(
           elementType(openingElement),
           mergeTabIndex(1, openingElement.attributes),
         ),
+      ).toBe(
         true,
         `identifies \`${genElementSymbol(openingElement)}\` with tabIndex of 1 as a focusable element`,
       );
 
-      st.equal(
+      expect(
         isFocusable(
           elementType(openingElement),
           mergeTabIndex('bogus', openingElement.attributes),
         ),
+      ).toBe(
         false,
         `does NOT identify \`${genElementSymbol(openingElement)}\` with tabIndex of 'bogus' as a focusable element`,
       );
     });
-
-    st.end();
   });
-
-  t.end();
 });
diff --git a/__tests__/src/util/isInteractiveElement-test.js b/__tests__/src/util/isInteractiveElement.spec.js
similarity index 73%
rename from __tests__/src/util/isInteractiveElement-test.js
rename to __tests__/src/util/isInteractiveElement.spec.js
index 69284989..c063c401 100644
--- a/__tests__/src/util/isInteractiveElement-test.js
+++ b/__tests__/src/util/isInteractiveElement.spec.js
@@ -1,4 +1,3 @@
-import test from 'tape';
 import { elementType } from 'jsx-ast-utils-x';
 
 import isInteractiveElement from '../../../src/util/isInteractiveElement';
@@ -12,93 +11,78 @@ import {
   genNonInteractiveRoleElements,
 } from '../../../__mocks__/genInteractives';
 
-test('isInteractiveElement', t => {
-  t.equal(
-    isInteractiveElement(undefined, []),
-    false,
-    'identifies them as interactive elements',
-  );
+describe('isInteractiveElement', () => {
+  expect(isInteractiveElement(undefined, [])).toBe(false);
 
-  t.test('interactive elements', st => {
+  test('interactive elements', () => {
     genInteractiveElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isInteractiveElement(
           elementType(openingElement),
           openingElement.attributes,
         ),
+      ).toBe(
         true,
         `identifies \`${genElementSymbol(openingElement)}\` as an interactive element`,
       );
     });
-
-    st.end();
   });
 
-  t.test('interactive role elements', st => {
+  test('interactive role elements', () => {
     genInteractiveRoleElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isInteractiveElement(
           elementType(openingElement),
           openingElement.attributes,
         ),
+      ).toBe(
         false,
         `identifies \`${genElementSymbol(openingElement)}\` as an interactive element`,
       );
     });
-
-    st.end();
   });
 
-  t.test('non-interactive elements', st => {
+  test('non-interactive elements', () => {
     genNonInteractiveElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isInteractiveElement(
           elementType(openingElement),
           openingElement.attributes,
         ),
+      ).toBe(
         false,
         `identifies \`${genElementSymbol(openingElement)}\` as an interactive element`,
       );
     });
-
-    st.end();
   });
 
-  t.test('non-interactive role elements', st => {
+  test('non-interactive role elements', () => {
     genNonInteractiveRoleElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isInteractiveElement(
           elementType(openingElement),
           openingElement.attributes,
         ),
+      ).toBe(
         false,
         `identifies \`${genElementSymbol(openingElement)}\` as an interactive element`,
       );
     });
-
-    st.end();
   });
 
-  t.test('indeterminate elements', st => {
+  test('indeterminate elements', () => {
     genIndeterminantInteractiveElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isInteractiveElement(
           elementType(openingElement),
           openingElement.attributes,
         ),
+      ).toBe(
         false,
         `identifies \`${genElementSymbol(openingElement)}\` as an interactive element`,
       );
     });
-
-    st.end();
   });
 
-  t.equal(
-    isInteractiveElement('CustomComponent', JSXElementMock()),
-    false,
-    'JSX elements are not interactive',
-  );
-
-  t.end();
+  expect(isInteractiveElement('CustomComponent', JSXElementMock())).toBe(false);
 });
diff --git a/__tests__/src/util/isInteractiveRole-test.js b/__tests__/src/util/isInteractiveRole.spec.js
similarity index 53%
rename from __tests__/src/util/isInteractiveRole-test.js
rename to __tests__/src/util/isInteractiveRole.spec.js
index 0987fd70..31d49703 100644
--- a/__tests__/src/util/isInteractiveRole-test.js
+++ b/__tests__/src/util/isInteractiveRole.spec.js
@@ -1,4 +1,3 @@
-import test from 'tape';
 import { elementType } from 'jsx-ast-utils-x';
 
 import isInteractiveRole from '../../../src/util/isInteractiveRole';
@@ -8,46 +7,30 @@ import {
   genNonInteractiveRoleElements,
 } from '../../../__mocks__/genInteractives';
 
-test('isInteractiveRole', t => {
-  t.equal(
-    isInteractiveRole(undefined, []),
-    false,
-    'identifies JSX Components (no tagName) as interactive role elements',
-  );
+describe('isInteractiveRole', () => {
+  expect(isInteractiveRole(undefined, [])).toBe(false);
 
-  t.test('elements with a non-interactive role', st => {
+  test('elements with a non-interactive role', () => {
     genNonInteractiveRoleElements().forEach(({ openingElement }) => {
       const { attributes } = openingElement;
 
-      st.equal(
-        isInteractiveRole(elementType(openingElement), attributes),
+      expect(isInteractiveRole(elementType(openingElement), attributes)).toBe(
         false,
         `does NOT identify \`${genElementSymbol(openingElement)}\` as an interactive role element`,
       );
     });
-
-    st.end();
   });
 
-  t.equal(
-    isInteractiveRole('div', []),
-    false,
-    'does NOT identify elements without a role as interactive role elements',
-  );
+  expect(isInteractiveRole('div', [])).toBe(false);
 
-  t.test('elements with an interactive role', st => {
+  test('elements with an interactive role', () => {
     genInteractiveRoleElements().forEach(({ openingElement }) => {
       const { attributes } = openingElement;
 
-      st.equal(
-        isInteractiveRole(elementType(openingElement), attributes),
+      expect(isInteractiveRole(elementType(openingElement), attributes)).toBe(
         true,
         `identifies \`${genElementSymbol(openingElement)}\` as an interactive role element`,
       );
     });
-
-    st.end();
   });
-
-  t.end();
 });
diff --git a/__tests__/src/util/isNonInteractiveElement-test.js b/__tests__/src/util/isNonInteractiveElement.spec.js
similarity index 76%
rename from __tests__/src/util/isNonInteractiveElement-test.js
rename to __tests__/src/util/isNonInteractiveElement.spec.js
index 441b9d22..f8d2b6e5 100644
--- a/__tests__/src/util/isNonInteractiveElement-test.js
+++ b/__tests__/src/util/isNonInteractiveElement.spec.js
@@ -1,4 +1,3 @@
-import test from 'tape';
 import { elementType } from 'jsx-ast-utils-x';
 
 import isNonInteractiveElement from '../../../src/util/isNonInteractiveElement';
@@ -11,87 +10,76 @@ import {
   genNonInteractiveRoleElements,
 } from '../../../__mocks__/genInteractives';
 
-test('isNonInteractiveElement', t => {
-  t.equal(
-    isNonInteractiveElement(undefined, []),
-    false,
-    'identifies JSX Components (no tagName) as non-interactive elements',
-  );
+describe('isNonInteractiveElement', () => {
+  expect(isNonInteractiveElement(undefined, [])).toBe(false);
 
-  t.test('non-interactive elements', st => {
+  test('non-interactive elements', () => {
     genNonInteractiveElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isNonInteractiveElement(
           elementType(openingElement),
           openingElement.attributes,
         ),
+      ).toBe(
         true,
         `identifies \`${genElementSymbol(openingElement)}\` as a non-interactive element`,
       );
     });
-
-    st.end();
   });
 
-  t.test('non-interactive role elements', st => {
+  test('non-interactive role elements', () => {
     genNonInteractiveRoleElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isNonInteractiveElement(
           elementType(openingElement),
           openingElement.attributes,
         ),
+      ).toBe(
         false,
         `identifies \`${genElementSymbol(openingElement)}\` as a non-interactive element`,
       );
     });
-
-    st.end();
   });
 
-  t.test('interactive elements', st => {
+  test('interactive elements', () => {
     genInteractiveElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isNonInteractiveElement(
           elementType(openingElement),
           openingElement.attributes,
         ),
+      ).toBe(
         false,
         `identifies \`${genElementSymbol(openingElement)}\` as a non-interactive element`,
       );
     });
-
-    st.end();
   });
 
-  t.test('interactive role elements', st => {
+  test('interactive role elements', () => {
     genInteractiveRoleElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isNonInteractiveElement(
           elementType(openingElement),
           openingElement.attributes,
         ),
+      ).toBe(
         false,
         `identifies \`${genElementSymbol(openingElement)}\` as a non-interactive element`,
       );
     });
-
-    st.end();
   });
 
-  t.test('indeterminate elements', st => {
+  test('indeterminate elements', () => {
     genIndeterminantInteractiveElements().forEach(({ openingElement }) => {
-      st.equal(
+      expect(
         isNonInteractiveElement(
           elementType(openingElement),
           openingElement.attributes,
         ),
+      ).toBe(
         false,
         `identifies \`${genElementSymbol(openingElement)}\` as a non-interactive element`,
       );
     });
-
-    st.end();
   });
-
-  t.end();
 });
diff --git a/__tests__/src/util/isNonInteractiveRole-test.js b/__tests__/src/util/isNonInteractiveRole.spec.js
similarity index 63%
rename from __tests__/src/util/isNonInteractiveRole-test.js
rename to __tests__/src/util/isNonInteractiveRole.spec.js
index 37f3fbcf..34900d62 100644
--- a/__tests__/src/util/isNonInteractiveRole-test.js
+++ b/__tests__/src/util/isNonInteractiveRole.spec.js
@@ -1,4 +1,3 @@
-import test from 'tape';
 import { elementType } from 'jsx-ast-utils-x';
 
 import isNonInteractiveRole from '../../../src/util/isNonInteractiveRole';
@@ -8,46 +7,34 @@ import {
   genNonInteractiveRoleElements,
 } from '../../../__mocks__/genInteractives';
 
-test('isNonInteractiveRole', t => {
-  t.equal(
-    isNonInteractiveRole(undefined, []),
-    false,
-    'identifies JSX Components (no tagName) as non-interactive elements',
-  );
+describe('isNonInteractiveRole', () => {
+  expect(isNonInteractiveRole(undefined, [])).toBe(false);
 
-  t.test('elements with a non-interactive role', st => {
+  test('elements with a non-interactive role', () => {
     genNonInteractiveRoleElements().forEach(({ openingElement }) => {
       const { attributes } = openingElement;
 
-      st.equal(
+      expect(
         isNonInteractiveRole(elementType(openingElement), attributes),
+      ).toBe(
         true,
         `identifies \`${genElementSymbol(openingElement)}\` as a non-interactive role element`,
       );
     });
-
-    st.end();
   });
 
-  t.equal(
-    isNonInteractiveRole('div', []),
-    false,
-    'does NOT identify elements without a role as non-interactive role elements',
-  );
+  expect(isNonInteractiveRole('div', [])).toBe(false);
 
-  t.test('elements with an interactive role', st => {
+  test('elements with an interactive role', () => {
     genInteractiveRoleElements().forEach(({ openingElement }) => {
       const { attributes } = openingElement;
 
-      st.equal(
+      expect(
         isNonInteractiveRole(elementType(openingElement), attributes),
+      ).toBe(
         false,
         `does NOT identify \`${genElementSymbol(openingElement)}\` as a non-interactive role element`,
       );
     });
-
-    st.end();
   });
-
-  t.end();
 });
diff --git a/__tests__/src/util/isNonLiteralProperty-test.js b/__tests__/src/util/isNonLiteralProperty.spec.js
similarity index 56%
rename from __tests__/src/util/isNonLiteralProperty-test.js
rename to __tests__/src/util/isNonLiteralProperty.spec.js
index f9c4fa7e..a14bb5cd 100644
--- a/__tests__/src/util/isNonLiteralProperty-test.js
+++ b/__tests__/src/util/isNonLiteralProperty.spec.js
@@ -1,5 +1,3 @@
-import test from 'tape';
-
 import isNonLiteralProperty from '../../../src/util/isNonLiteralProperty';
 import IdentifierMock from '../../../__mocks__/IdentifierMock';
 import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
@@ -11,57 +9,41 @@ const theProp = 'theProp';
 
 const spread = JSXSpreadAttributeMock('theSpread');
 
-test('isNonLiteralProperty', t => {
-  t.equal(
-    isNonLiteralProperty([], theProp),
-    false,
-    'does not identify them as non-literal role elements',
-  );
+test('isNonLiteralProperty', () => {
+  expect(isNonLiteralProperty([], theProp)).toBe(false);
 
-  t.equal(
+  expect(
     isNonLiteralProperty(
       [JSXAttributeMock(theProp, LiteralMock('theRole'))],
       theProp,
     ),
-    false,
-    'does not identify elements with a literal property as non-literal role elements without spread operator',
-  );
+  ).toBe(false);
 
-  t.equal(
+  expect(
     isNonLiteralProperty(
       [spread, JSXAttributeMock(theProp, LiteralMock('theRole'))],
       theProp,
     ),
-    false,
-    'does not identify elements with a literal property as non-literal role elements with spread operator',
-  );
+  ).toBe(false);
 
-  t.equal(
+  expect(
     isNonLiteralProperty(
       [JSXAttributeMock(theProp, JSXTextMock('theRole'))],
       theProp,
     ),
-    false,
-    'identifies elements with a JSXText property as non-literal role elements',
-  );
+  ).toBe(false);
 
-  t.equal(
+  expect(
     isNonLiteralProperty(
       [JSXAttributeMock(theProp, IdentifierMock('undefined'))],
       theProp,
     ),
-    false,
-    'does not identify elements with a property of undefined as non-literal role elements',
-  );
+  ).toBe(false);
 
-  t.equal(
+  expect(
     isNonLiteralProperty(
       [JSXAttributeMock(theProp, IdentifierMock('theIdentifier'))],
       theProp,
     ),
-    true,
-    'identifies elements with an expression property as non-literal role elements',
-  );
-
-  t.end();
+  ).toBe(true);
 });
diff --git a/__tests__/src/util/isSemanticRoleElement-test.js b/__tests__/src/util/isSemanticRoleElement.spec.js
similarity index 74%
rename from __tests__/src/util/isSemanticRoleElement-test.js
rename to __tests__/src/util/isSemanticRoleElement.spec.js
index 4e54c6ce..fb3e4562 100644
--- a/__tests__/src/util/isSemanticRoleElement-test.js
+++ b/__tests__/src/util/isSemanticRoleElement.spec.js
@@ -1,52 +1,42 @@
-import test from 'tape';
-
 import isSemanticRoleElement from '../../../src/util/isSemanticRoleElement';
 import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
 
-test('isSemanticRoleElement', t => {
-  t.equal(
+describe('isSemanticRoleElement', () => {
+  expect(
     isSemanticRoleElement('input', [
       JSXAttributeMock('type', 'checkbox'),
       JSXAttributeMock('role', 'switch'),
     ]),
-    true,
-    'identifies semantic role elements',
-  );
+  ).toBe(true);
 
-  t.test('rejects non-semantics role elements', st => {
-    st.equal(
+  test('rejects non-semantics role elements', () => {
+    expect(
       isSemanticRoleElement('input', [
         JSXAttributeMock('type', 'radio'),
         JSXAttributeMock('role', 'switch'),
       ]),
-      false,
-    );
+    ).toBe(false);
 
-    st.equal(
+    expect(
       isSemanticRoleElement('input', [
         JSXAttributeMock('type', 'text'),
         JSXAttributeMock('role', 'combobox'),
       ]),
-      false,
-    );
+    ).toBe(false);
 
-    st.equal(
+    expect(
       isSemanticRoleElement('button', [
         JSXAttributeMock('role', 'switch'),
         JSXAttributeMock('aria-pressed', 'true'),
       ]),
-      false,
-    );
+    ).toBe(false);
 
-    st.equal(
+    expect(
       isSemanticRoleElement('input', [JSXAttributeMock('role', 'switch')]),
-      false,
-    );
-
-    st.end();
+    ).toBe(false);
   });
 
-  t.doesNotThrow(() => {
+  expect(() => {
     isSemanticRoleElement('input', [
       JSXAttributeMock('type', 'checkbox'),
       JSXAttributeMock('role', 'checkbox'),
@@ -61,7 +51,5 @@ test('isSemanticRoleElement', t => {
         },
       },
     ]);
-  }, 'does not throw on JSXSpreadAttribute');
-
-  t.end();
+  }).not.toThrow();
 });
diff --git a/__tests__/src/util/mayContainChildComponent-test.js b/__tests__/src/util/mayContainChildComponent.spec.js
similarity index 68%
rename from __tests__/src/util/mayContainChildComponent-test.js
rename to __tests__/src/util/mayContainChildComponent.spec.js
index 1dd6d997..a3d6e082 100644
--- a/__tests__/src/util/mayContainChildComponent-test.js
+++ b/__tests__/src/util/mayContainChildComponent.spec.js
@@ -1,12 +1,10 @@
-import test from 'tape';
-
 import mayContainChildComponent from '../../../src/util/mayContainChildComponent';
 import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
 import JSXElementMock from '../../../__mocks__/JSXElementMock';
 import JSXExpressionContainerMock from '../../../__mocks__/JSXExpressionContainerMock';
 
-test('mayContainChildComponent', t => {
-  t.equal(
+describe('mayContainChildComponent', () => {
+  expect(
     mayContainChildComponent(
       JSXElementMock(
         'div',
@@ -34,30 +32,24 @@ test('mayContainChildComponent', t => {
       'FancyComponent',
       5,
     ),
-    false,
-    'no FancyComponent returns false',
-  );
+  ).toBe(false);
 
-  t.test('contains an indicated component', st => {
-    st.equal(
+  test('contains an indicated component', () => {
+    expect(
       mayContainChildComponent(
         JSXElementMock('div', [], [JSXElementMock('input')]),
         'input',
       ),
-      true,
-      'returns true',
-    );
+    ).toBe(true, 'returns true');
 
-    st.equal(
+    expect(
       mayContainChildComponent(
         JSXElementMock('div', [], [JSXElementMock('FancyComponent')]),
         'FancyComponent',
       ),
-      true,
-      'returns true',
-    );
+    ).toBe(true, 'returns true');
 
-    st.equal(
+    expect(
       mayContainChildComponent(
         JSXElementMock(
           'div',
@@ -66,11 +58,12 @@ test('mayContainChildComponent', t => {
         ),
         'FancyComponent',
       ),
+    ).toBe(
       false,
       'FancyComponent is outside of default depth, should return false',
     );
 
-    st.equal(
+    expect(
       mayContainChildComponent(
         JSXElementMock(
           'div',
@@ -80,11 +73,12 @@ test('mayContainChildComponent', t => {
         'FancyComponent',
         2,
       ),
+    ).toBe(
       true,
       'FancyComponent is inside of custom depth, should return true',
     );
 
-    st.equal(
+    expect(
       mayContainChildComponent(
         JSXElementMock(
           'div',
@@ -128,106 +122,78 @@ test('mayContainChildComponent', t => {
         'FancyComponent',
         6,
       ),
-      true,
-      'deep nesting, returns true',
-    );
-
-    st.end();
+    ).toBe(true, 'deep nesting, returns true');
   });
 
-  t.equal(
+  expect(
     mayContainChildComponent(
       JSXElementMock('div', [], [JSXExpressionContainerMock('mysteryBox')]),
       'FancyComponent',
     ),
-    true,
-    'Intederminate situations + expression container children - returns true',
-  );
+  ).toBe(true);
 
-  t.test(
-    'Glob name matching - component name contains question mark ? - match any single character',
-    st => {
-      st.equal(
+  describe('Glob name matching - component name contains question mark ? - match any single character', () => {
+    expect(
+      mayContainChildComponent(
+        JSXElementMock('div', [], [JSXElementMock('FancyComponent')]),
+        'Fanc?Co??onent',
+      ),
+    ).toBe(true, 'returns true');
+
+    expect(
+      mayContainChildComponent(
+        JSXElementMock('div', [], [JSXElementMock('FancyComponent')]),
+        'FancyComponent?',
+      ),
+    ).toBe(false, 'returns false');
+
+    test('component name contains asterisk * - match zero or more characters', () => {
+      expect(
         mayContainChildComponent(
           JSXElementMock('div', [], [JSXElementMock('FancyComponent')]),
-          'Fanc?Co??onent',
+          'Fancy*',
         ),
-        true,
-        'returns true',
-      );
+      ).toBe(true, 'returns true');
 
-      st.equal(
+      expect(
         mayContainChildComponent(
           JSXElementMock('div', [], [JSXElementMock('FancyComponent')]),
-          'FancyComponent?',
+          '*Component',
         ),
-        false,
-        'returns false',
-      );
-
-      st.test(
-        'component name contains asterisk * - match zero or more characters',
-        s2t => {
-          s2t.equal(
-            mayContainChildComponent(
-              JSXElementMock('div', [], [JSXElementMock('FancyComponent')]),
-              'Fancy*',
-            ),
-            true,
-            'returns true',
-          );
-
-          s2t.equal(
-            mayContainChildComponent(
-              JSXElementMock('div', [], [JSXElementMock('FancyComponent')]),
-              '*Component',
-            ),
-            true,
-            'returns true',
-          );
-
-          s2t.equal(
-            mayContainChildComponent(
-              JSXElementMock('div', [], [JSXElementMock('FancyComponent')]),
-              'Fancy*C*t',
-            ),
-            true,
-            'returns true',
-          );
+      ).toBe(true, 'returns true');
 
-          s2t.end();
-        },
-      );
-
-      st.end();
-    },
-  );
+      expect(
+        mayContainChildComponent(
+          JSXElementMock('div', [], [JSXElementMock('FancyComponent')]),
+          'Fancy*C*t',
+        ),
+      ).toBe(true, 'returns true');
+    });
+  });
 
-  t.test('using a custom elementType function', st => {
-    st.equal(
+  test('using a custom elementType function', () => {
+    expect(
       mayContainChildComponent(
         JSXElementMock('div', [], [JSXElementMock('CustomInput')]),
         'input',
         2,
         () => 'input',
       ),
+    ).toBe(
       true,
       'returns true when the custom elementType returns the proper name',
     );
 
-    st.equal(
+    expect(
       mayContainChildComponent(
         JSXElementMock('div', [], [JSXElementMock('CustomInput')]),
         'input',
         2,
         () => 'button',
       ),
+    ).toBe(
       false,
       'returns false when the custom elementType returns a wrong name',
     );
-
-    st.end();
   });
-
-  t.end();
 });
diff --git a/__tests__/src/util/mayHaveAccessibleLabel-test.js b/__tests__/src/util/mayHaveAccessibleLabel.spec.js
similarity index 76%
rename from __tests__/src/util/mayHaveAccessibleLabel-test.js
rename to __tests__/src/util/mayHaveAccessibleLabel.spec.js
index 7a6fbf4d..d1f3ea84 100644
--- a/__tests__/src/util/mayHaveAccessibleLabel-test.js
+++ b/__tests__/src/util/mayHaveAccessibleLabel.spec.js
@@ -1,5 +1,3 @@
-import test from 'tape';
-
 import mayHaveAccessibleLabel from '../../../src/util/mayHaveAccessibleLabel';
 import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
 import JSXElementMock from '../../../__mocks__/JSXElementMock';
@@ -8,8 +6,8 @@ import JSXSpreadAttributeMock from '../../../__mocks__/JSXSpreadAttributeMock';
 import JSXTextMock from '../../../__mocks__/JSXTextMock';
 import LiteralMock from '../../../__mocks__/LiteralMock';
 
-test('mayHaveAccessibleLabel', t => {
-  t.equal(
+describe('mayHaveAccessibleLabel', () => {
+  expect(
     mayHaveAccessibleLabel(
       JSXElementMock(
         'div',
@@ -36,12 +34,10 @@ test('mayHaveAccessibleLabel', t => {
       ),
       5,
     ),
-    false,
-    'no label returns false',
-  );
+  ).toBe(false);
 
-  t.test('label via attributes', st => {
-    st.equal(
+  test('label via attributes', () => {
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock(
           'div',
@@ -49,34 +45,32 @@ test('mayHaveAccessibleLabel', t => {
           [],
         ),
       ),
-      true,
-      'aria-label returns true',
-    );
+    ).toBe(true, 'aria-label returns true');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock('div', [JSXAttributeMock('aria-label', '')], []),
       ),
-      false,
-      'aria-label without content returns false',
-    );
+    ).toBe(false, 'aria-label without content returns false');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock('div', [JSXAttributeMock('aria-label', ' ')], []),
       ),
+    ).toBe(
       false,
       'aria-label with only spaces whitespace, should return false',
     );
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock('div', [JSXAttributeMock('aria-label', '\n')], []),
       ),
+    ).toBe(
       false,
       'aria-label with only newline whitespace, should return false',
     );
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock(
           'div',
@@ -84,19 +78,15 @@ test('mayHaveAccessibleLabel', t => {
           [],
         ),
       ),
-      true,
-      'aria-labelledby returns true',
-    );
+    ).toBe(true, 'aria-labelledby returns true');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock('div', [JSXAttributeMock('aria-labelledby', '')], []),
       ),
-      false,
-      'aria-labelledby without content returns false',
-    );
+    ).toBe(false, 'aria-labelledby without content returns false');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock(
           'div',
@@ -104,17 +94,16 @@ test('mayHaveAccessibleLabel', t => {
           [],
         ),
       ),
+    ).toBe(
       true,
       'aria-labelledby with an expression container, should return true',
     );
-
-    st.end();
   });
 
-  t.test('label via custom label attribute', st => {
+  test('label via custom label attribute', () => {
     const customLabelProp = 'cowbell';
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock(
           'div',
@@ -124,43 +113,31 @@ test('mayHaveAccessibleLabel', t => {
         1,
         [customLabelProp],
       ),
-      true,
-      'aria-label returns true',
-    );
-
-    st.end();
+    ).toBe(true, 'aria-label returns true');
   });
 
-  t.test('text label', st => {
-    st.equal(
+  test('text label', () => {
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock('div', [], [LiteralMock('A fancy label')]),
       ),
-      true,
-      'Literal text, returns true',
-    );
+    ).toBe(true, 'Literal text, returns true');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(JSXElementMock('div', [], [LiteralMock(' ')])),
-      false,
-      'Literal spaces whitespace, returns false',
-    );
+    ).toBe(false, 'Literal spaces whitespace, returns false');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(JSXElementMock('div', [], [LiteralMock('\n')])),
-      false,
-      'Literal newline whitespace, returns false',
-    );
+    ).toBe(false, 'Literal newline whitespace, returns false');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock('div', [], [JSXTextMock('A fancy label')]),
       ),
-      true,
-      'JSXText, returns true',
-    );
+    ).toBe(true, 'JSXText, returns true');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock(
           'div',
@@ -168,11 +145,9 @@ test('mayHaveAccessibleLabel', t => {
           [JSXElementMock('div', [], [JSXTextMock('A fancy label')])],
         ),
       ),
-      false,
-      'label is outside of default depth, returns false',
-    );
+    ).toBe(false, 'label is outside of default depth, returns false');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock(
           'div',
@@ -181,11 +156,9 @@ test('mayHaveAccessibleLabel', t => {
         ),
         2,
       ),
-      true,
-      'label is inside of custom depth, returns true',
-    );
+    ).toBe(true, 'label is inside of custom depth, returns true');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock(
           'div',
@@ -228,15 +201,11 @@ test('mayHaveAccessibleLabel', t => {
         ),
         6,
       ),
-      true,
-      'deep nesting, returns true',
-    );
-
-    st.end();
+    ).toBe(true, 'deep nesting, returns true');
   });
 
-  t.test('image content', st => {
-    st.equal(
+  test('image content', () => {
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock(
           'div',
@@ -244,11 +213,9 @@ test('mayHaveAccessibleLabel', t => {
           [JSXElementMock('img', [JSXAttributeMock('src', 'some/path')])],
         ),
       ),
-      false,
-      'without alt, returns true',
-    );
+    ).toBe(false, 'without alt, returns true');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock(
           'div',
@@ -261,11 +228,9 @@ test('mayHaveAccessibleLabel', t => {
           ],
         ),
       ),
-      true,
-      'with alt, returns true',
-    );
+    ).toBe(true, 'with alt, returns true');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock(
           'div',
@@ -278,23 +243,17 @@ test('mayHaveAccessibleLabel', t => {
           ],
         ),
       ),
-      true,
-      'with aria-label, returns true',
-    );
-
-    st.end();
+    ).toBe(true, 'with aria-label, returns true');
   });
 
-  t.test('Intederminate situations', st => {
-    st.equal(
+  test('Intederminate situations', () => {
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock('div', [], [JSXExpressionContainerMock('mysteryBox')]),
       ),
-      true,
-      'expression container children, returns true',
-    );
+    ).toBe(true, 'expression container children, returns true');
 
-    st.equal(
+    expect(
       mayHaveAccessibleLabel(
         JSXElementMock(
           'div',
@@ -305,12 +264,6 @@ test('mayHaveAccessibleLabel', t => {
           [],
         ),
       ),
-      true,
-      'spread operator in attributes, returns true',
-    );
-
-    st.end();
+    ).toBe(true, 'spread operator in attributes, returns true');
   });
-
-  t.end();
 });
diff --git a/__tests__/src/util/parserOptionsMapper-test.js b/__tests__/src/util/parserOptionsMapper.spec.js
similarity index 88%
rename from __tests__/src/util/parserOptionsMapper-test.js
rename to __tests__/src/util/parserOptionsMapper.spec.js
index 0059f565..6f115d02 100644
--- a/__tests__/src/util/parserOptionsMapper-test.js
+++ b/__tests__/src/util/parserOptionsMapper.spec.js
@@ -1,12 +1,11 @@
 import { version as eslintVersion } from 'eslint/package.json';
-import test from 'tape';
 import semver from 'semver';
 
 import parserOptionsMapper from '../../__util__/parserOptionsMapper';
 
 const usingLegacy = semver.major(eslintVersion) < 9;
 
-test('parserOptionsMapper', t => {
+test('parserOptionsMapper', () => {
   const expectedResult = usingLegacy
     ? {
         code: '',
@@ -37,15 +36,13 @@ test('parserOptionsMapper', t => {
         settings: {},
       };
 
-  t.deepEqual(
+  expect(
     parserOptionsMapper({
       code: '',
       errors: [],
       options: {},
     }),
-    expectedResult,
-    'returns a test case object',
-  );
+  ).toEqual(expectedResult);
 
   const expectedResult2 = usingLegacy
     ? {
@@ -76,7 +73,7 @@ test('parserOptionsMapper', t => {
         },
         settings: {},
       };
-  t.deepEqual(
+  expect(
     parserOptionsMapper({
       code: '',
       errors: [],
@@ -85,9 +82,5 @@ test('parserOptionsMapper', t => {
         ecmaVersion: 5,
       },
     }),
-    expectedResult2,
-    'allows for overriding parserOptions',
-  );
-
-  t.end();
+  ).toEqual(expectedResult2);
 });
diff --git a/__tests__/src/util/schemas-test.js b/__tests__/src/util/schemas-test.js
deleted file mode 100644
index c691d200..00000000
--- a/__tests__/src/util/schemas-test.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import test from 'tape';
-
-import {
-  generateObjSchema,
-  arraySchema,
-  enumArraySchema,
-} from '../../../src/util/schemas';
-
-test('schemas', t => {
-  t.test('should generate an object schema with correct properties', st => {
-    const schema = generateObjSchema({
-      foo: 'bar',
-      baz: arraySchema,
-    });
-    const properties = schema.properties || {};
-
-    st.deepEqual(properties.foo, properties.foo, 'bar');
-    st.deepEqual(properties.baz.type, 'array');
-
-    st.end();
-  });
-
-  t.deepEqual(
-    enumArraySchema(),
-    {
-      additionalItems: false,
-      items: {
-        enum: [],
-        type: 'string',
-      },
-      minItems: 0,
-      type: 'array',
-      uniqueItems: true,
-    },
-    'enumArraySchema works with no arguments',
-  );
-
-  t.end();
-});
diff --git a/__tests__/src/util/schemas.spec.js b/__tests__/src/util/schemas.spec.js
new file mode 100644
index 00000000..517661cf
--- /dev/null
+++ b/__tests__/src/util/schemas.spec.js
@@ -0,0 +1,29 @@
+import {
+  generateObjSchema,
+  arraySchema,
+  enumArraySchema,
+} from '../../../src/util/schemas';
+
+describe('schemas', () => {
+  test('should generate an object schema with correct properties', () => {
+    const schema = generateObjSchema({
+      foo: 'bar',
+      baz: arraySchema,
+    });
+    const properties = schema.properties || {};
+
+    expect(properties.foo).toBe('bar');
+    expect(properties.baz.type).toBe('array');
+  });
+
+  expect(enumArraySchema()).toEqual({
+    additionalItems: false,
+    items: {
+      enum: [],
+      type: 'string',
+    },
+    minItems: 0,
+    type: 'array',
+    uniqueItems: true,
+  });
+});
diff --git a/package.json b/package.json
index 1806a640..6497d48d 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,8 @@
     "jsx",
     "a11y",
     "eslint",
-    "eslint-plugin"
+    "eslint-plugin",
+    "eslint-plugin-jsx-a11y"
   ],
   "scripts": {
     "build": "premove lib && babel src --out-dir lib --copy-files",
@@ -42,7 +43,7 @@
     "test-example:flat-esm": "cd examples/flat-esm && yarn && yarn lint",
     "test-example:legacy": "cd examples/legacy && yarn && yarn lint",
     "test:examples": "yarn build && yarn test-example:legacy && yarn test-example:flat-esm && yarn test-example:flat-cjs",
-    "tests-only": "tape --require=@babel/register '__tests__/**/*.js'"
+    "tests-only": "jest --coverage"
   },
   "peerDependencies": {
     "eslint": "^8.57.0 || ^9.0.0"
@@ -65,11 +66,11 @@
     "@babel/eslint-parser": "^7.25.9",
     "@babel/plugin-transform-flow-strip-types": "^7.25.9",
     "@babel/preset-env": "^7.27.2",
-    "@babel/register": "^7.25.9",
     "@changesets/changelog-github": "^0.5.1",
     "@changesets/cli": "^2.29.4",
     "@eslint/eslintrc": "^3.3.1",
     "@eslint/js": "^9.26.0",
+    "@types/jest": "^29.5.14",
     "babel-plugin-add-module-exports": "^1.0.4",
     "clean-pkg-json": "^1.3.0",
     "eslint": "^9.27.0",
@@ -79,17 +80,23 @@
     "eslint-plugin-eslint-plugin": "^6.4.0",
     "eslint-plugin-ft-flow": "^3.0.11",
     "eslint-plugin-import-x": "^4.11.1",
+    "eslint-plugin-jest": "^28.11.0",
     "estraverse": "^5.3.0",
     "hermes-eslint": "^0.28.1",
     "in-publish": "^2.0.1",
     "jackspeak": "=2.1.1",
-    "jscodeshift": "^17.0.0",
+    "jest": "^29.7.0",
+    "jscodeshift": "^17.3.0",
     "minimist": "^1.2.8",
     "npm-run-all2": "^8.0.2",
     "premove": "^4.0.0",
     "prettier": "^3.5.3",
     "semver": "^6.3.1",
-    "tape": "^5.9.0",
     "to-ast": "^1.0.0"
+  },
+  "jest": {
+    "testMatch": [
+      "**/__tests__/**/*.spec.*"
+    ]
   }
 }
diff --git a/scripts/create-rule.js b/scripts/create-rule.js
index 50c4f350..72fc94f1 100755
--- a/scripts/create-rule.js
+++ b/scripts/create-rule.js
@@ -1,4 +1,4 @@
-#!/usr/bin/env node --harmony
+#!/usr/bin/env node
 const path = require('path');
 const fs = require('fs');
 const { exec } = require('child_process');
diff --git a/yarn.lock b/yarn.lock
index fe153f1e..94350421 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -72,7 +72,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.27.1":
+"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.27.1":
   version: 7.27.1
   resolution: "@babel/code-frame@npm:7.27.1"
   dependencies:
@@ -90,7 +90,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/core@npm:^7.24.7, @babel/core@npm:^7.26.0":
+"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.7, @babel/core@npm:^7.26.0":
   version: 7.27.1
   resolution: "@babel/core@npm:7.27.1"
   dependencies:
@@ -127,7 +127,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/generator@npm:^7.27.1":
+"@babel/generator@npm:^7.27.1, @babel/generator@npm:^7.7.2":
   version: 7.27.1
   resolution: "@babel/generator@npm:7.27.1"
   dependencies:
@@ -249,7 +249,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.27.1":
+"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0":
   version: 7.27.1
   resolution: "@babel/helper-plugin-utils@npm:7.27.1"
   checksum: 10c0/94cf22c81a0c11a09b197b41ab488d416ff62254ce13c57e62912c85700dc2e99e555225787a4099ff6bae7a1812d622c80fbaeda824b79baa10a6c5ac4cf69b
@@ -334,7 +334,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/parser@npm:^7.24.7, @babel/parser@npm:^7.27.1, @babel/parser@npm:^7.27.2":
+"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.27.1, @babel/parser@npm:^7.27.2":
   version: 7.27.2
   resolution: "@babel/parser@npm:7.27.2"
   dependencies:
@@ -413,6 +413,50 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@babel/plugin-syntax-async-generators@npm:^7.8.4":
+  version: 7.8.4
+  resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.8.0"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-bigint@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-bigint@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.8.0"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/686891b81af2bc74c39013655da368a480f17dd237bf9fbc32048e5865cb706d5a8f65438030da535b332b1d6b22feba336da8fa931f663b6b34e13147d12dde
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-class-properties@npm:^7.12.13":
+  version: 7.12.13
+  resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.12.13"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-class-static-block@npm:^7.14.5":
+  version: 7.14.5
+  resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.14.5"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371
+  languageName: node
+  linkType: hard
+
 "@babel/plugin-syntax-flow@npm:^7.27.1":
   version: 7.27.1
   resolution: "@babel/plugin-syntax-flow@npm:7.27.1"
@@ -435,7 +479,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-import-attributes@npm:^7.27.1":
+"@babel/plugin-syntax-import-attributes@npm:^7.24.7, @babel/plugin-syntax-import-attributes@npm:^7.27.1":
   version: 7.27.1
   resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1"
   dependencies:
@@ -446,7 +490,29 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-jsx@npm:^7.27.1":
+"@babel/plugin-syntax-import-meta@npm:^7.10.4":
+  version: 7.10.4
+  resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.10.4"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-json-strings@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.8.0"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-jsx@npm:^7.27.1, @babel/plugin-syntax-jsx@npm:^7.7.2":
   version: 7.27.1
   resolution: "@babel/plugin-syntax-jsx@npm:7.27.1"
   dependencies:
@@ -457,7 +523,95 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-typescript@npm:^7.27.1":
+"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4":
+  version: 7.10.4
+  resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.10.4"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.8.0"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-numeric-separator@npm:^7.10.4":
+  version: 7.10.4
+  resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.10.4"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.8.0"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.8.0"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-optional-chaining@npm:^7.8.3":
+  version: 7.8.3
+  resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.8.0"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5":
+  version: 7.14.5
+  resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.14.5"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-top-level-await@npm:^7.14.5":
+  version: 7.14.5
+  resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.14.5"
+  peerDependencies:
+    "@babel/core": ^7.0.0-0
+  checksum: 10c0/14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-syntax-typescript@npm:^7.27.1, @babel/plugin-syntax-typescript@npm:^7.7.2":
   version: 7.27.1
   resolution: "@babel/plugin-syntax-typescript@npm:7.27.1"
   dependencies:
@@ -1214,7 +1368,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/register@npm:^7.24.6, @babel/register@npm:^7.25.9":
+"@babel/register@npm:^7.24.6":
   version: 7.27.1
   resolution: "@babel/register@npm:7.27.1"
   dependencies:
@@ -1236,7 +1390,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/template@npm:^7.27.1":
+"@babel/template@npm:^7.27.1, @babel/template@npm:^7.3.3":
   version: 7.27.2
   resolution: "@babel/template@npm:7.27.2"
   dependencies:
@@ -1262,7 +1416,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/types@npm:^7.27.1, @babel/types@npm:^7.4.4":
+"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4":
   version: 7.27.1
   resolution: "@babel/types@npm:7.27.1"
   dependencies:
@@ -1272,6 +1426,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@bcoe/v8-coverage@npm:^0.2.3":
+  version: 0.2.3
+  resolution: "@bcoe/v8-coverage@npm:0.2.3"
+  checksum: 10c0/6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52
+  languageName: node
+  linkType: hard
+
 "@changesets/apply-release-plan@npm:^7.0.12":
   version: 7.0.12
   resolution: "@changesets/apply-release-plan@npm:7.0.12"
@@ -1702,6 +1863,175 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@istanbuljs/load-nyc-config@npm:^1.0.0":
+  version: 1.1.0
+  resolution: "@istanbuljs/load-nyc-config@npm:1.1.0"
+  dependencies:
+    camelcase: "npm:^5.3.1"
+    find-up: "npm:^4.1.0"
+    get-package-type: "npm:^0.1.0"
+    js-yaml: "npm:^3.13.1"
+    resolve-from: "npm:^5.0.0"
+  checksum: 10c0/dd2a8b094887da5a1a2339543a4933d06db2e63cbbc2e288eb6431bd832065df0c099d091b6a67436e71b7d6bf85f01ce7c15f9253b4cbebcc3b9a496165ba42
+  languageName: node
+  linkType: hard
+
+"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3":
+  version: 0.1.3
+  resolution: "@istanbuljs/schema@npm:0.1.3"
+  checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a
+  languageName: node
+  linkType: hard
+
+"@jest/console@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "@jest/console@npm:29.7.0"
+  dependencies:
+    "@jest/types": "npm:^29.6.3"
+    "@types/node": "npm:*"
+    chalk: "npm:^4.0.0"
+    jest-message-util: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+    slash: "npm:^3.0.0"
+  checksum: 10c0/7be408781d0a6f657e969cbec13b540c329671819c2f57acfad0dae9dbfe2c9be859f38fe99b35dba9ff1536937dc6ddc69fdcd2794812fa3c647a1619797f6c
+  languageName: node
+  linkType: hard
+
+"@jest/core@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "@jest/core@npm:29.7.0"
+  dependencies:
+    "@jest/console": "npm:^29.7.0"
+    "@jest/reporters": "npm:^29.7.0"
+    "@jest/test-result": "npm:^29.7.0"
+    "@jest/transform": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    "@types/node": "npm:*"
+    ansi-escapes: "npm:^4.2.1"
+    chalk: "npm:^4.0.0"
+    ci-info: "npm:^3.2.0"
+    exit: "npm:^0.1.2"
+    graceful-fs: "npm:^4.2.9"
+    jest-changed-files: "npm:^29.7.0"
+    jest-config: "npm:^29.7.0"
+    jest-haste-map: "npm:^29.7.0"
+    jest-message-util: "npm:^29.7.0"
+    jest-regex-util: "npm:^29.6.3"
+    jest-resolve: "npm:^29.7.0"
+    jest-resolve-dependencies: "npm:^29.7.0"
+    jest-runner: "npm:^29.7.0"
+    jest-runtime: "npm:^29.7.0"
+    jest-snapshot: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+    jest-validate: "npm:^29.7.0"
+    jest-watcher: "npm:^29.7.0"
+    micromatch: "npm:^4.0.4"
+    pretty-format: "npm:^29.7.0"
+    slash: "npm:^3.0.0"
+    strip-ansi: "npm:^6.0.0"
+  peerDependencies:
+    node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+  peerDependenciesMeta:
+    node-notifier:
+      optional: true
+  checksum: 10c0/934f7bf73190f029ac0f96662c85cd276ec460d407baf6b0dbaec2872e157db4d55a7ee0b1c43b18874602f662b37cb973dda469a4e6d88b4e4845b521adeeb2
+  languageName: node
+  linkType: hard
+
+"@jest/environment@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "@jest/environment@npm:29.7.0"
+  dependencies:
+    "@jest/fake-timers": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    "@types/node": "npm:*"
+    jest-mock: "npm:^29.7.0"
+  checksum: 10c0/c7b1b40c618f8baf4d00609022d2afa086d9c6acc706f303a70bb4b67275868f620ad2e1a9efc5edd418906157337cce50589a627a6400bbdf117d351b91ef86
+  languageName: node
+  linkType: hard
+
+"@jest/expect-utils@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "@jest/expect-utils@npm:29.7.0"
+  dependencies:
+    jest-get-type: "npm:^29.6.3"
+  checksum: 10c0/60b79d23a5358dc50d9510d726443316253ecda3a7fb8072e1526b3e0d3b14f066ee112db95699b7a43ad3f0b61b750c72e28a5a1cac361d7a2bb34747fa938a
+  languageName: node
+  linkType: hard
+
+"@jest/expect@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "@jest/expect@npm:29.7.0"
+  dependencies:
+    expect: "npm:^29.7.0"
+    jest-snapshot: "npm:^29.7.0"
+  checksum: 10c0/b41f193fb697d3ced134349250aed6ccea075e48c4f803159db102b826a4e473397c68c31118259868fd69a5cba70e97e1c26d2c2ff716ca39dc73a2ccec037e
+  languageName: node
+  linkType: hard
+
+"@jest/fake-timers@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "@jest/fake-timers@npm:29.7.0"
+  dependencies:
+    "@jest/types": "npm:^29.6.3"
+    "@sinonjs/fake-timers": "npm:^10.0.2"
+    "@types/node": "npm:*"
+    jest-message-util: "npm:^29.7.0"
+    jest-mock: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+  checksum: 10c0/cf0a8bcda801b28dc2e2b2ba36302200ee8104a45ad7a21e6c234148932f826cb3bc57c8df3b7b815aeea0861d7b6ca6f0d4778f93b9219398ef28749e03595c
+  languageName: node
+  linkType: hard
+
+"@jest/globals@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "@jest/globals@npm:29.7.0"
+  dependencies:
+    "@jest/environment": "npm:^29.7.0"
+    "@jest/expect": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    jest-mock: "npm:^29.7.0"
+  checksum: 10c0/a385c99396878fe6e4460c43bd7bb0a5cc52befb462cc6e7f2a3810f9e7bcce7cdeb51908fd530391ee452dc856c98baa2c5f5fa8a5b30b071d31ef7f6955cea
+  languageName: node
+  linkType: hard
+
+"@jest/reporters@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "@jest/reporters@npm:29.7.0"
+  dependencies:
+    "@bcoe/v8-coverage": "npm:^0.2.3"
+    "@jest/console": "npm:^29.7.0"
+    "@jest/test-result": "npm:^29.7.0"
+    "@jest/transform": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    "@jridgewell/trace-mapping": "npm:^0.3.18"
+    "@types/node": "npm:*"
+    chalk: "npm:^4.0.0"
+    collect-v8-coverage: "npm:^1.0.0"
+    exit: "npm:^0.1.2"
+    glob: "npm:^7.1.3"
+    graceful-fs: "npm:^4.2.9"
+    istanbul-lib-coverage: "npm:^3.0.0"
+    istanbul-lib-instrument: "npm:^6.0.0"
+    istanbul-lib-report: "npm:^3.0.0"
+    istanbul-lib-source-maps: "npm:^4.0.0"
+    istanbul-reports: "npm:^3.1.3"
+    jest-message-util: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+    jest-worker: "npm:^29.7.0"
+    slash: "npm:^3.0.0"
+    string-length: "npm:^4.0.1"
+    strip-ansi: "npm:^6.0.0"
+    v8-to-istanbul: "npm:^9.0.1"
+  peerDependencies:
+    node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+  peerDependenciesMeta:
+    node-notifier:
+      optional: true
+  checksum: 10c0/a754402a799541c6e5aff2c8160562525e2a47e7d568f01ebfc4da66522de39cbb809bbb0a841c7052e4270d79214e70aec3c169e4eae42a03bc1a8a20cb9fa2
+  languageName: node
+  linkType: hard
+
 "@jest/schemas@npm:^29.6.3":
   version: 29.6.3
   resolution: "@jest/schemas@npm:29.6.3"
@@ -1711,6 +2041,78 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@jest/source-map@npm:^29.6.3":
+  version: 29.6.3
+  resolution: "@jest/source-map@npm:29.6.3"
+  dependencies:
+    "@jridgewell/trace-mapping": "npm:^0.3.18"
+    callsites: "npm:^3.0.0"
+    graceful-fs: "npm:^4.2.9"
+  checksum: 10c0/a2f177081830a2e8ad3f2e29e20b63bd40bade294880b595acf2fc09ec74b6a9dd98f126a2baa2bf4941acd89b13a4ade5351b3885c224107083a0059b60a219
+  languageName: node
+  linkType: hard
+
+"@jest/test-result@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "@jest/test-result@npm:29.7.0"
+  dependencies:
+    "@jest/console": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    "@types/istanbul-lib-coverage": "npm:^2.0.0"
+    collect-v8-coverage: "npm:^1.0.0"
+  checksum: 10c0/7de54090e54a674ca173470b55dc1afdee994f2d70d185c80236003efd3fa2b753fff51ffcdda8e2890244c411fd2267529d42c4a50a8303755041ee493e6a04
+  languageName: node
+  linkType: hard
+
+"@jest/test-sequencer@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "@jest/test-sequencer@npm:29.7.0"
+  dependencies:
+    "@jest/test-result": "npm:^29.7.0"
+    graceful-fs: "npm:^4.2.9"
+    jest-haste-map: "npm:^29.7.0"
+    slash: "npm:^3.0.0"
+  checksum: 10c0/593a8c4272797bb5628984486080cbf57aed09c7cfdc0a634e8c06c38c6bef329c46c0016e84555ee55d1cd1f381518cf1890990ff845524c1123720c8c1481b
+  languageName: node
+  linkType: hard
+
+"@jest/transform@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "@jest/transform@npm:29.7.0"
+  dependencies:
+    "@babel/core": "npm:^7.11.6"
+    "@jest/types": "npm:^29.6.3"
+    "@jridgewell/trace-mapping": "npm:^0.3.18"
+    babel-plugin-istanbul: "npm:^6.1.1"
+    chalk: "npm:^4.0.0"
+    convert-source-map: "npm:^2.0.0"
+    fast-json-stable-stringify: "npm:^2.1.0"
+    graceful-fs: "npm:^4.2.9"
+    jest-haste-map: "npm:^29.7.0"
+    jest-regex-util: "npm:^29.6.3"
+    jest-util: "npm:^29.7.0"
+    micromatch: "npm:^4.0.4"
+    pirates: "npm:^4.0.4"
+    slash: "npm:^3.0.0"
+    write-file-atomic: "npm:^4.0.2"
+  checksum: 10c0/7f4a7f73dcf45dfdf280c7aa283cbac7b6e5a904813c3a93ead7e55873761fc20d5c4f0191d2019004fac6f55f061c82eb3249c2901164ad80e362e7a7ede5a6
+  languageName: node
+  linkType: hard
+
+"@jest/types@npm:^29.6.3":
+  version: 29.6.3
+  resolution: "@jest/types@npm:29.6.3"
+  dependencies:
+    "@jest/schemas": "npm:^29.6.3"
+    "@types/istanbul-lib-coverage": "npm:^2.0.0"
+    "@types/istanbul-reports": "npm:^3.0.0"
+    "@types/node": "npm:*"
+    "@types/yargs": "npm:^17.0.8"
+    chalk: "npm:^4.0.0"
+  checksum: 10c0/ea4e493dd3fb47933b8ccab201ae573dcc451f951dc44ed2a86123cd8541b82aa9d2b1031caf9b1080d6673c517e2dcc25a44b2dc4f3fbc37bfc965d444888c0
+  languageName: node
+  linkType: hard
+
 "@jridgewell/gen-mapping@npm:^0.3.5":
   version: 0.3.8
   resolution: "@jridgewell/gen-mapping@npm:0.3.8"
@@ -1743,7 +2145,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25":
+"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25":
   version: 0.3.25
   resolution: "@jridgewell/trace-mapping@npm:0.3.25"
   dependencies:
@@ -1753,25 +2155,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@ljharb/resumer@npm:^0.1.3":
-  version: 0.1.3
-  resolution: "@ljharb/resumer@npm:0.1.3"
-  dependencies:
-    "@ljharb/through": "npm:^2.3.13"
-    call-bind: "npm:^1.0.7"
-  checksum: 10c0/1a598cbaa7ee74ed31a1798649849b915f099c8720c8142edc0829a09df64116e6050fc8d49d6c4d69e0e6814a5e0bded4b8c6d5643c3739af5e8a49d770aa83
-  languageName: node
-  linkType: hard
-
-"@ljharb/through@npm:^2.3.13":
-  version: 2.3.14
-  resolution: "@ljharb/through@npm:2.3.14"
-  dependencies:
-    call-bind: "npm:^1.0.8"
-  checksum: 10c0/7c5c22ed668f51193b82e4a352c7a44f777f537ef47f37befb49032f4827a766ea74c2972e5a0185bdfe355431ae50722d9fb57fa63553ba36aa4aeb941f0e70
-  languageName: node
-  linkType: hard
-
 "@manypkg/find-root@npm:^1.1.0":
   version: 1.1.0
   resolution: "@manypkg/find-root@npm:1.1.0"
@@ -1926,6 +2309,24 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@sinonjs/commons@npm:^3.0.0":
+  version: 3.0.1
+  resolution: "@sinonjs/commons@npm:3.0.1"
+  dependencies:
+    type-detect: "npm:4.0.8"
+  checksum: 10c0/1227a7b5bd6c6f9584274db996d7f8cee2c8c350534b9d0141fc662eaf1f292ea0ae3ed19e5e5271c8fd390d27e492ca2803acd31a1978be2cdc6be0da711403
+  languageName: node
+  linkType: hard
+
+"@sinonjs/fake-timers@npm:^10.0.2":
+  version: 10.3.0
+  resolution: "@sinonjs/fake-timers@npm:10.3.0"
+  dependencies:
+    "@sinonjs/commons": "npm:^3.0.0"
+  checksum: 10c0/2e2fb6cc57f227912814085b7b01fede050cd4746ea8d49a1e44d5a0e56a804663b0340ae2f11af7559ea9bf4d087a11f2f646197a660ea3cb04e19efc04aa63
+  languageName: node
+  linkType: hard
+
 "@taplo/core@npm:^0.2.0":
   version: 0.2.0
   resolution: "@taplo/core@npm:0.2.0"
@@ -1951,6 +2352,47 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/babel__core@npm:^7.1.14":
+  version: 7.20.5
+  resolution: "@types/babel__core@npm:7.20.5"
+  dependencies:
+    "@babel/parser": "npm:^7.20.7"
+    "@babel/types": "npm:^7.20.7"
+    "@types/babel__generator": "npm:*"
+    "@types/babel__template": "npm:*"
+    "@types/babel__traverse": "npm:*"
+  checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff
+  languageName: node
+  linkType: hard
+
+"@types/babel__generator@npm:*":
+  version: 7.27.0
+  resolution: "@types/babel__generator@npm:7.27.0"
+  dependencies:
+    "@babel/types": "npm:^7.0.0"
+  checksum: 10c0/9f9e959a8792df208a9d048092fda7e1858bddc95c6314857a8211a99e20e6830bdeb572e3587ae8be5429e37f2a96fcf222a9f53ad232f5537764c9e13a2bbd
+  languageName: node
+  linkType: hard
+
+"@types/babel__template@npm:*":
+  version: 7.4.4
+  resolution: "@types/babel__template@npm:7.4.4"
+  dependencies:
+    "@babel/parser": "npm:^7.1.0"
+    "@babel/types": "npm:^7.0.0"
+  checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b
+  languageName: node
+  linkType: hard
+
+"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6":
+  version: 7.20.7
+  resolution: "@types/babel__traverse@npm:7.20.7"
+  dependencies:
+    "@babel/types": "npm:^7.20.7"
+  checksum: 10c0/5386f0af44f8746b063b87418f06129a814e16bb2686965a575e9d7376b360b088b89177778d8c426012abc43dd1a2d8ec3218bfc382280c898682746ce2ffbd
+  languageName: node
+  linkType: hard
+
 "@types/debug@npm:^4.0.0":
   version: 4.1.12
   resolution: "@types/debug@npm:4.1.12"
@@ -1967,6 +2409,50 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/graceful-fs@npm:^4.1.3":
+  version: 4.1.9
+  resolution: "@types/graceful-fs@npm:4.1.9"
+  dependencies:
+    "@types/node": "npm:*"
+  checksum: 10c0/235d2fc69741448e853333b7c3d1180a966dd2b8972c8cbcd6b2a0c6cd7f8d582ab2b8e58219dbc62cce8f1b40aa317ff78ea2201cdd8249da5025adebed6f0b
+  languageName: node
+  linkType: hard
+
+"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1":
+  version: 2.0.6
+  resolution: "@types/istanbul-lib-coverage@npm:2.0.6"
+  checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7
+  languageName: node
+  linkType: hard
+
+"@types/istanbul-lib-report@npm:*":
+  version: 3.0.3
+  resolution: "@types/istanbul-lib-report@npm:3.0.3"
+  dependencies:
+    "@types/istanbul-lib-coverage": "npm:*"
+  checksum: 10c0/247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c
+  languageName: node
+  linkType: hard
+
+"@types/istanbul-reports@npm:^3.0.0":
+  version: 3.0.4
+  resolution: "@types/istanbul-reports@npm:3.0.4"
+  dependencies:
+    "@types/istanbul-lib-report": "npm:*"
+  checksum: 10c0/1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee
+  languageName: node
+  linkType: hard
+
+"@types/jest@npm:^29.5.14":
+  version: 29.5.14
+  resolution: "@types/jest@npm:29.5.14"
+  dependencies:
+    expect: "npm:^29.0.0"
+    pretty-format: "npm:^29.0.0"
+  checksum: 10c0/18e0712d818890db8a8dab3d91e9ea9f7f19e3f83c2e50b312f557017dc81466207a71f3ed79cf4428e813ba939954fa26ffa0a9a7f153181ba174581b1c2aed
+  languageName: node
+  linkType: hard
+
 "@types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.9":
   version: 7.0.15
   resolution: "@types/json-schema@npm:7.0.15"
@@ -1990,6 +2476,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/node@npm:*":
+  version: 22.15.21
+  resolution: "@types/node@npm:22.15.21"
+  dependencies:
+    undici-types: "npm:~6.21.0"
+  checksum: 10c0/f092bbccda2131c2b2c8f720338080aa0ef1d928f5f1062c03954a4f7dafa7ee3ed29bc3e51bd4e2584473b3d943c637a2b39ad7174898970818270187cf10c1
+  languageName: node
+  linkType: hard
+
 "@types/node@npm:^12.7.1":
   version: 12.20.55
   resolution: "@types/node@npm:12.20.55"
@@ -2004,6 +2499,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/stack-utils@npm:^2.0.0":
+  version: 2.0.3
+  resolution: "@types/stack-utils@npm:2.0.3"
+  checksum: 10c0/1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c
+  languageName: node
+  linkType: hard
+
 "@types/unist@npm:*, @types/unist@npm:^3.0.0":
   version: 3.0.3
   resolution: "@types/unist@npm:3.0.3"
@@ -2011,10 +2513,26 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/scope-manager@npm:5.62.0":
-  version: 5.62.0
-  resolution: "@typescript-eslint/scope-manager@npm:5.62.0"
-  dependencies:
+"@types/yargs-parser@npm:*":
+  version: 21.0.3
+  resolution: "@types/yargs-parser@npm:21.0.3"
+  checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0
+  languageName: node
+  linkType: hard
+
+"@types/yargs@npm:^17.0.8":
+  version: 17.0.33
+  resolution: "@types/yargs@npm:17.0.33"
+  dependencies:
+    "@types/yargs-parser": "npm:*"
+  checksum: 10c0/d16937d7ac30dff697801c3d6f235be2166df42e4a88bf730fa6dc09201de3727c0a9500c59a672122313341de5f24e45ee0ff579c08ce91928e519090b7906b
+  languageName: node
+  linkType: hard
+
+"@typescript-eslint/scope-manager@npm:5.62.0":
+  version: 5.62.0
+  resolution: "@typescript-eslint/scope-manager@npm:5.62.0"
+  dependencies:
     "@typescript-eslint/types": "npm:5.62.0"
     "@typescript-eslint/visitor-keys": "npm:5.62.0"
   checksum: 10c0/861253235576c1c5c1772d23cdce1418c2da2618a479a7de4f6114a12a7ca853011a1e530525d0931c355a8fd237b9cd828fac560f85f9623e24054fd024726f
@@ -2099,7 +2617,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/utils@npm:^8.31.0":
+"@typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/utils@npm:^8.31.0":
   version: 8.32.1
   resolution: "@typescript-eslint/utils@npm:8.32.1"
   dependencies:
@@ -2336,6 +2854,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"ansi-escapes@npm:^4.2.1":
+  version: 4.3.2
+  resolution: "ansi-escapes@npm:4.3.2"
+  dependencies:
+    type-fest: "npm:^0.21.3"
+  checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50
+  languageName: node
+  linkType: hard
+
 "ansi-regex@npm:^5.0.1":
   version: 5.0.1
   resolution: "ansi-regex@npm:5.0.1"
@@ -2373,7 +2900,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"anymatch@npm:~3.1.2":
+"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2":
   version: 3.1.3
   resolution: "anymatch@npm:3.1.3"
   dependencies:
@@ -2406,16 +2933,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2":
-  version: 1.0.2
-  resolution: "array-buffer-byte-length@npm:1.0.2"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-    is-array-buffer: "npm:^3.0.5"
-  checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d
-  languageName: node
-  linkType: hard
-
 "array-union@npm:^2.1.0":
   version: 2.1.0
   resolution: "array-union@npm:2.1.0"
@@ -2423,34 +2940,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"array.prototype.every@npm:^1.1.6":
-  version: 1.1.7
-  resolution: "array.prototype.every@npm:1.1.7"
-  dependencies:
-    call-bound: "npm:^1.0.2"
-    define-properties: "npm:^1.2.1"
-    es-abstract: "npm:^1.23.5"
-    es-object-atoms: "npm:^1.0.0"
-    is-string: "npm:^1.1.0"
-  checksum: 10c0/1e6c61601bb2831f86b4c6127030332a4ff396403c8932e9d7598f6c441df8e91dd2e71302bad50274cce2186c975a564ba5459df2bbf16cf04d3f53bf384a43
-  languageName: node
-  linkType: hard
-
-"arraybuffer.prototype.slice@npm:^1.0.4":
-  version: 1.0.4
-  resolution: "arraybuffer.prototype.slice@npm:1.0.4"
-  dependencies:
-    array-buffer-byte-length: "npm:^1.0.1"
-    call-bind: "npm:^1.0.8"
-    define-properties: "npm:^1.2.1"
-    es-abstract: "npm:^1.23.5"
-    es-errors: "npm:^1.3.0"
-    get-intrinsic: "npm:^1.2.6"
-    is-array-buffer: "npm:^3.0.4"
-  checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06
-  languageName: node
-  linkType: hard
-
 "ast-types-flow@npm:^0.0.8":
   version: 0.0.8
   resolution: "ast-types-flow@npm:0.0.8"
@@ -2474,13 +2963,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"async-function@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "async-function@npm:1.0.0"
-  checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73
-  languageName: node
-  linkType: hard
-
 "atob@npm:^2.1.2":
   version: 2.1.2
   resolution: "atob@npm:2.1.2"
@@ -2490,15 +2972,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"available-typed-arrays@npm:^1.0.7":
-  version: 1.0.7
-  resolution: "available-typed-arrays@npm:1.0.7"
-  dependencies:
-    possible-typed-array-names: "npm:^1.0.0"
-  checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2
-  languageName: node
-  linkType: hard
-
 "axe-core@npm:^4.10.2":
   version: 4.10.3
   resolution: "axe-core@npm:4.10.3"
@@ -2513,6 +2986,23 @@ __metadata:
   languageName: node
   linkType: hard
 
+"babel-jest@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "babel-jest@npm:29.7.0"
+  dependencies:
+    "@jest/transform": "npm:^29.7.0"
+    "@types/babel__core": "npm:^7.1.14"
+    babel-plugin-istanbul: "npm:^6.1.1"
+    babel-preset-jest: "npm:^29.6.3"
+    chalk: "npm:^4.0.0"
+    graceful-fs: "npm:^4.2.9"
+    slash: "npm:^3.0.0"
+  peerDependencies:
+    "@babel/core": ^7.8.0
+  checksum: 10c0/2eda9c1391e51936ca573dd1aedfee07b14c59b33dbe16ef347873ddd777bcf6e2fc739681e9e9661ab54ef84a3109a03725be2ac32cd2124c07ea4401cbe8c1
+  languageName: node
+  linkType: hard
+
 "babel-plugin-add-module-exports@npm:^1.0.4":
   version: 1.0.4
   resolution: "babel-plugin-add-module-exports@npm:1.0.4"
@@ -2520,6 +3010,31 @@ __metadata:
   languageName: node
   linkType: hard
 
+"babel-plugin-istanbul@npm:^6.1.1":
+  version: 6.1.1
+  resolution: "babel-plugin-istanbul@npm:6.1.1"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.0.0"
+    "@istanbuljs/load-nyc-config": "npm:^1.0.0"
+    "@istanbuljs/schema": "npm:^0.1.2"
+    istanbul-lib-instrument: "npm:^5.0.4"
+    test-exclude: "npm:^6.0.0"
+  checksum: 10c0/1075657feb705e00fd9463b329921856d3775d9867c5054b449317d39153f8fbcebd3e02ebf00432824e647faff3683a9ca0a941325ef1afe9b3c4dd51b24beb
+  languageName: node
+  linkType: hard
+
+"babel-plugin-jest-hoist@npm:^29.6.3":
+  version: 29.6.3
+  resolution: "babel-plugin-jest-hoist@npm:29.6.3"
+  dependencies:
+    "@babel/template": "npm:^7.3.3"
+    "@babel/types": "npm:^7.3.3"
+    "@types/babel__core": "npm:^7.1.14"
+    "@types/babel__traverse": "npm:^7.0.6"
+  checksum: 10c0/7e6451caaf7dce33d010b8aafb970e62f1b0c0b57f4978c37b0d457bbcf0874d75a395a102daf0bae0bd14eafb9f6e9a165ee5e899c0a4f1f3bb2e07b304ed2e
+  languageName: node
+  linkType: hard
+
 "babel-plugin-polyfill-corejs2@npm:^0.4.10":
   version: 0.4.13
   resolution: "babel-plugin-polyfill-corejs2@npm:0.4.13"
@@ -2556,6 +3071,43 @@ __metadata:
   languageName: node
   linkType: hard
 
+"babel-preset-current-node-syntax@npm:^1.0.0":
+  version: 1.1.0
+  resolution: "babel-preset-current-node-syntax@npm:1.1.0"
+  dependencies:
+    "@babel/plugin-syntax-async-generators": "npm:^7.8.4"
+    "@babel/plugin-syntax-bigint": "npm:^7.8.3"
+    "@babel/plugin-syntax-class-properties": "npm:^7.12.13"
+    "@babel/plugin-syntax-class-static-block": "npm:^7.14.5"
+    "@babel/plugin-syntax-import-attributes": "npm:^7.24.7"
+    "@babel/plugin-syntax-import-meta": "npm:^7.10.4"
+    "@babel/plugin-syntax-json-strings": "npm:^7.8.3"
+    "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4"
+    "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3"
+    "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4"
+    "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3"
+    "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3"
+    "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3"
+    "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5"
+    "@babel/plugin-syntax-top-level-await": "npm:^7.14.5"
+  peerDependencies:
+    "@babel/core": ^7.0.0
+  checksum: 10c0/0b838d4412e3322cb4436f246e24e9c00bebcedfd8f00a2f51489db683bd35406bbd55a700759c28d26959c6e03f84dd6a1426f576f440267c1d7a73c5717281
+  languageName: node
+  linkType: hard
+
+"babel-preset-jest@npm:^29.6.3":
+  version: 29.6.3
+  resolution: "babel-preset-jest@npm:29.6.3"
+  dependencies:
+    babel-plugin-jest-hoist: "npm:^29.6.3"
+    babel-preset-current-node-syntax: "npm:^1.0.0"
+  peerDependencies:
+    "@babel/core": ^7.0.0
+  checksum: 10c0/ec5fd0276b5630b05f0c14bb97cc3815c6b31600c683ebb51372e54dcb776cff790bdeeabd5b8d01ede375a040337ccbf6a3ccd68d3a34219125945e167ad943
+  languageName: node
+  linkType: hard
+
 "balanced-match@npm:^1.0.0":
   version: 1.0.2
   resolution: "balanced-match@npm:1.0.2"
@@ -2635,6 +3187,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"bser@npm:2.1.1":
+  version: 2.1.1
+  resolution: "bser@npm:2.1.1"
+  dependencies:
+    node-int64: "npm:^0.4.0"
+  checksum: 10c0/24d8dfb7b6d457d73f32744e678a60cc553e4ec0e9e1a01cf614b44d85c3c87e188d3cc78ef0442ce5032ee6818de20a0162ba1074725c0d08908f62ea979227
+  languageName: node
+  linkType: hard
+
 "buffer-from@npm:^1.0.0":
   version: 1.1.2
   resolution: "buffer-from@npm:1.1.2"
@@ -2662,7 +3223,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2":
+"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2":
   version: 1.0.2
   resolution: "call-bind-apply-helpers@npm:1.0.2"
   dependencies:
@@ -2672,19 +3233,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8":
-  version: 1.0.8
-  resolution: "call-bind@npm:1.0.8"
-  dependencies:
-    call-bind-apply-helpers: "npm:^1.0.0"
-    es-define-property: "npm:^1.0.0"
-    get-intrinsic: "npm:^1.2.4"
-    set-function-length: "npm:^1.2.2"
-  checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4
-  languageName: node
-  linkType: hard
-
-"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4":
+"call-bound@npm:^1.0.2":
   version: 1.0.4
   resolution: "call-bound@npm:1.0.4"
   dependencies:
@@ -2701,6 +3250,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"camelcase@npm:^5.3.1":
+  version: 5.3.1
+  resolution: "camelcase@npm:5.3.1"
+  checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23
+  languageName: node
+  linkType: hard
+
+"camelcase@npm:^6.2.0":
+  version: 6.3.0
+  resolution: "camelcase@npm:6.3.0"
+  checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710
+  languageName: node
+  linkType: hard
+
 "caniuse-lite@npm:^1.0.30001716":
   version: 1.0.30001718
   resolution: "caniuse-lite@npm:1.0.30001718"
@@ -2718,6 +3281,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"char-regex@npm:^1.0.2":
+  version: 1.0.2
+  resolution: "char-regex@npm:1.0.2"
+  checksum: 10c0/57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e
+  languageName: node
+  linkType: hard
+
 "character-entities@npm:^2.0.0":
   version: 2.0.2
   resolution: "character-entities@npm:2.0.2"
@@ -2776,13 +3346,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ci-info@npm:^3.7.0":
+"ci-info@npm:^3.2.0, ci-info@npm:^3.7.0":
   version: 3.9.0
   resolution: "ci-info@npm:3.9.0"
   checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a
   languageName: node
   linkType: hard
 
+"cjs-module-lexer@npm:^1.0.0":
+  version: 1.4.3
+  resolution: "cjs-module-lexer@npm:1.4.3"
+  checksum: 10c0/076b3af85adc4d65dbdab1b5b240fe5b45d44fcf0ef9d429044dd94d19be5589376805c44fb2d4b3e684e5fe6a9b7cf3e426476a6507c45283c5fc6ff95240be
+  languageName: node
+  linkType: hard
+
 "clean-pkg-json@npm:^1.3.0":
   version: 1.3.0
   resolution: "clean-pkg-json@npm:1.3.0"
@@ -2814,6 +3391,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"co@npm:^4.6.0":
+  version: 4.6.0
+  resolution: "co@npm:4.6.0"
+  checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28
+  languageName: node
+  linkType: hard
+
+"collect-v8-coverage@npm:^1.0.0":
+  version: 1.0.2
+  resolution: "collect-v8-coverage@npm:1.0.2"
+  checksum: 10c0/ed7008e2e8b6852c5483b444a3ae6e976e088d4335a85aa0a9db2861c5f1d31bd2d7ff97a60469b3388deeba661a619753afbe201279fb159b4b9548ab8269a1
+  languageName: node
+  linkType: hard
+
 "color-convert@npm:^2.0.1":
   version: 2.0.1
   resolution: "color-convert@npm:2.0.1"
@@ -2898,7 +3489,24 @@ __metadata:
   languageName: node
   linkType: hard
 
-"cross-spawn@npm:^7.0.5, cross-spawn@npm:^7.0.6":
+"create-jest@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "create-jest@npm:29.7.0"
+  dependencies:
+    "@jest/types": "npm:^29.6.3"
+    chalk: "npm:^4.0.0"
+    exit: "npm:^0.1.2"
+    graceful-fs: "npm:^4.2.9"
+    jest-config: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+    prompts: "npm:^2.0.1"
+  bin:
+    create-jest: bin/create-jest.js
+  checksum: 10c0/e7e54c280692470d3398f62a6238fd396327e01c6a0757002833f06d00afc62dd7bfe04ff2b9cd145264460e6b4d1eb8386f2925b7e567f97939843b7b0e812f
+  languageName: node
+  linkType: hard
+
+"cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5, cross-spawn@npm:^7.0.6":
   version: 7.0.6
   resolution: "cross-spawn@npm:7.0.6"
   dependencies:
@@ -2927,39 +3535,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"data-view-buffer@npm:^1.0.2":
-  version: 1.0.2
-  resolution: "data-view-buffer@npm:1.0.2"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-    es-errors: "npm:^1.3.0"
-    is-data-view: "npm:^1.0.2"
-  checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c
-  languageName: node
-  linkType: hard
-
-"data-view-byte-length@npm:^1.0.2":
-  version: 1.0.2
-  resolution: "data-view-byte-length@npm:1.0.2"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-    es-errors: "npm:^1.3.0"
-    is-data-view: "npm:^1.0.2"
-  checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55
-  languageName: node
-  linkType: hard
-
-"data-view-byte-offset@npm:^1.0.1":
-  version: 1.0.1
-  resolution: "data-view-byte-offset@npm:1.0.1"
-  dependencies:
-    call-bound: "npm:^1.0.2"
-    es-errors: "npm:^1.3.0"
-    is-data-view: "npm:^1.0.1"
-  checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4
-  languageName: node
-  linkType: hard
-
 "dataloader@npm:^1.4.0":
   version: 1.4.0
   resolution: "dataloader@npm:1.4.0"
@@ -3004,29 +3579,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"deep-equal@npm:^2.2.3":
-  version: 2.2.3
-  resolution: "deep-equal@npm:2.2.3"
-  dependencies:
-    array-buffer-byte-length: "npm:^1.0.0"
-    call-bind: "npm:^1.0.5"
-    es-get-iterator: "npm:^1.1.3"
-    get-intrinsic: "npm:^1.2.2"
-    is-arguments: "npm:^1.1.1"
-    is-array-buffer: "npm:^3.0.2"
-    is-date-object: "npm:^1.0.5"
-    is-regex: "npm:^1.1.4"
-    is-shared-array-buffer: "npm:^1.0.2"
-    isarray: "npm:^2.0.5"
-    object-is: "npm:^1.1.5"
-    object-keys: "npm:^1.1.1"
-    object.assign: "npm:^4.1.4"
-    regexp.prototype.flags: "npm:^1.5.1"
-    side-channel: "npm:^1.0.4"
-    which-boxed-primitive: "npm:^1.0.2"
-    which-collection: "npm:^1.0.1"
-    which-typed-array: "npm:^1.1.13"
-  checksum: 10c0/a48244f90fa989f63ff5ef0cc6de1e4916b48ea0220a9c89a378561960814794a5800c600254482a2c8fd2e49d6c2e196131dc983976adb024c94a42dfe4949f
+"dedent@npm:^1.0.0":
+  version: 1.6.0
+  resolution: "dedent@npm:1.6.0"
+  peerDependencies:
+    babel-plugin-macros: ^3.1.0
+  peerDependenciesMeta:
+    babel-plugin-macros:
+      optional: true
+  checksum: 10c0/671b8f5e390dd2a560862c4511dd6d2638e71911486f78cb32116551f8f2aa6fcaf50579ffffb2f866d46b5b80fd72470659ca5760ede8f967619ef7df79e8a5
   languageName: node
   linkType: hard
 
@@ -3044,35 +3605,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4":
-  version: 1.1.4
-  resolution: "define-data-property@npm:1.1.4"
-  dependencies:
-    es-define-property: "npm:^1.0.0"
-    es-errors: "npm:^1.3.0"
-    gopd: "npm:^1.0.1"
-  checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37
-  languageName: node
-  linkType: hard
-
-"define-properties@npm:^1.2.1":
-  version: 1.2.1
-  resolution: "define-properties@npm:1.2.1"
-  dependencies:
-    define-data-property: "npm:^1.0.1"
-    has-property-descriptors: "npm:^1.0.0"
-    object-keys: "npm:^1.1.1"
-  checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3
-  languageName: node
-  linkType: hard
-
-"defined@npm:^1.0.1":
-  version: 1.0.1
-  resolution: "defined@npm:1.0.1"
-  checksum: 10c0/357212c95fd69c3b431f4766440f1b10a8362d2663b86e3d7c139fe7fc98a1d5a4996b8b55ca62e97fb882f9887374b76944d29f9650a07993d98e7be86a804a
-  languageName: node
-  linkType: hard
-
 "dequal@npm:^2.0.0":
   version: 2.0.3
   resolution: "dequal@npm:2.0.3"
@@ -3087,6 +3619,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"detect-newline@npm:^3.0.0":
+  version: 3.1.0
+  resolution: "detect-newline@npm:3.1.0"
+  checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d
+  languageName: node
+  linkType: hard
+
 "devlop@npm:^1.0.0":
   version: 1.1.0
   resolution: "devlop@npm:1.1.0"
@@ -3135,18 +3674,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"dotignore@npm:^0.1.2":
-  version: 0.1.2
-  resolution: "dotignore@npm:0.1.2"
-  dependencies:
-    minimatch: "npm:^3.0.4"
-  bin:
-    ignored: bin/ignored
-  checksum: 10c0/71f25a507cbe88a7dbf07d5108bb0924af39c71a3c5fd83045fc42d5dc1605a23113ba29999b94d964555e6e6be2980caa8da3711cfa31a6b6d88c184b1ab181
-  languageName: node
-  linkType: hard
-
-"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1":
+"dunder-proto@npm:^1.0.1":
   version: 1.0.1
   resolution: "dunder-proto@npm:1.0.1"
   dependencies:
@@ -3171,6 +3699,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"emittery@npm:^0.13.1":
+  version: 0.13.1
+  resolution: "emittery@npm:0.13.1"
+  checksum: 10c0/1573d0ae29ab34661b6c63251ff8f5facd24ccf6a823f19417ae8ba8c88ea450325788c67f16c99edec8de4b52ce93a10fe441ece389fd156e88ee7dab9bfa35
+  languageName: node
+  linkType: hard
+
 "emoji-regex@npm:^8.0.0":
   version: 8.0.0
   resolution: "emoji-regex@npm:8.0.0"
@@ -3227,66 +3762,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.9":
-  version: 1.23.9
-  resolution: "es-abstract@npm:1.23.9"
-  dependencies:
-    array-buffer-byte-length: "npm:^1.0.2"
-    arraybuffer.prototype.slice: "npm:^1.0.4"
-    available-typed-arrays: "npm:^1.0.7"
-    call-bind: "npm:^1.0.8"
-    call-bound: "npm:^1.0.3"
-    data-view-buffer: "npm:^1.0.2"
-    data-view-byte-length: "npm:^1.0.2"
-    data-view-byte-offset: "npm:^1.0.1"
-    es-define-property: "npm:^1.0.1"
-    es-errors: "npm:^1.3.0"
-    es-object-atoms: "npm:^1.0.0"
-    es-set-tostringtag: "npm:^2.1.0"
-    es-to-primitive: "npm:^1.3.0"
-    function.prototype.name: "npm:^1.1.8"
-    get-intrinsic: "npm:^1.2.7"
-    get-proto: "npm:^1.0.0"
-    get-symbol-description: "npm:^1.1.0"
-    globalthis: "npm:^1.0.4"
-    gopd: "npm:^1.2.0"
-    has-property-descriptors: "npm:^1.0.2"
-    has-proto: "npm:^1.2.0"
-    has-symbols: "npm:^1.1.0"
-    hasown: "npm:^2.0.2"
-    internal-slot: "npm:^1.1.0"
-    is-array-buffer: "npm:^3.0.5"
-    is-callable: "npm:^1.2.7"
-    is-data-view: "npm:^1.0.2"
-    is-regex: "npm:^1.2.1"
-    is-shared-array-buffer: "npm:^1.0.4"
-    is-string: "npm:^1.1.1"
-    is-typed-array: "npm:^1.1.15"
-    is-weakref: "npm:^1.1.0"
-    math-intrinsics: "npm:^1.1.0"
-    object-inspect: "npm:^1.13.3"
-    object-keys: "npm:^1.1.1"
-    object.assign: "npm:^4.1.7"
-    own-keys: "npm:^1.0.1"
-    regexp.prototype.flags: "npm:^1.5.3"
-    safe-array-concat: "npm:^1.1.3"
-    safe-push-apply: "npm:^1.0.0"
-    safe-regex-test: "npm:^1.1.0"
-    set-proto: "npm:^1.0.0"
-    string.prototype.trim: "npm:^1.2.10"
-    string.prototype.trimend: "npm:^1.0.9"
-    string.prototype.trimstart: "npm:^1.0.8"
-    typed-array-buffer: "npm:^1.0.3"
-    typed-array-byte-length: "npm:^1.0.3"
-    typed-array-byte-offset: "npm:^1.0.4"
-    typed-array-length: "npm:^1.0.7"
-    unbox-primitive: "npm:^1.1.0"
-    which-typed-array: "npm:^1.1.18"
-  checksum: 10c0/1de229c9e08fe13c17fe5abaec8221545dfcd57e51f64909599a6ae896df84b8fd2f7d16c60cb00d7bf495b9298ca3581aded19939d4b7276854a4b066f8422b
-  languageName: node
-  linkType: hard
-
-"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1":
+"es-define-property@npm:^1.0.1":
   version: 1.0.1
   resolution: "es-define-property@npm:1.0.1"
   checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c
@@ -3300,23 +3776,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"es-get-iterator@npm:^1.1.3":
-  version: 1.1.3
-  resolution: "es-get-iterator@npm:1.1.3"
-  dependencies:
-    call-bind: "npm:^1.0.2"
-    get-intrinsic: "npm:^1.1.3"
-    has-symbols: "npm:^1.0.3"
-    is-arguments: "npm:^1.1.1"
-    is-map: "npm:^2.0.2"
-    is-set: "npm:^2.0.2"
-    is-string: "npm:^1.0.7"
-    isarray: "npm:^2.0.5"
-    stop-iteration-iterator: "npm:^1.0.0"
-  checksum: 10c0/ebd11effa79851ea75d7f079405f9d0dc185559fd65d986c6afea59a0ff2d46c2ed8675f19f03dce7429d7f6c14ff9aede8d121fbab78d75cfda6a263030bac0
-  languageName: node
-  linkType: hard
-
 "es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1":
   version: 1.1.1
   resolution: "es-object-atoms@npm:1.1.1"
@@ -3326,36 +3785,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"es-set-tostringtag@npm:^2.1.0":
-  version: 2.1.0
-  resolution: "es-set-tostringtag@npm:2.1.0"
-  dependencies:
-    es-errors: "npm:^1.3.0"
-    get-intrinsic: "npm:^1.2.6"
-    has-tostringtag: "npm:^1.0.2"
-    hasown: "npm:^2.0.2"
-  checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af
-  languageName: node
-  linkType: hard
-
-"es-to-primitive@npm:^1.3.0":
-  version: 1.3.0
-  resolution: "es-to-primitive@npm:1.3.0"
-  dependencies:
-    is-callable: "npm:^1.2.7"
-    is-date-object: "npm:^1.0.5"
-    is-symbol: "npm:^1.0.4"
-  checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b
-  languageName: node
-  linkType: hard
-
-"escalade@npm:^3.2.0":
+"escalade@npm:^3.1.1, escalade@npm:^3.2.0":
   version: 3.2.0
   resolution: "escalade@npm:3.2.0"
   checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65
   languageName: node
   linkType: hard
 
+"escape-string-regexp@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "escape-string-regexp@npm:2.0.0"
+  checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507
+  languageName: node
+  linkType: hard
+
 "escape-string-regexp@npm:^4.0.0":
   version: 4.0.0
   resolution: "escape-string-regexp@npm:4.0.0"
@@ -3478,6 +3921,24 @@ __metadata:
   languageName: node
   linkType: hard
 
+"eslint-plugin-jest@npm:^28.11.0":
+  version: 28.11.0
+  resolution: "eslint-plugin-jest@npm:28.11.0"
+  dependencies:
+    "@typescript-eslint/utils": "npm:^6.0.0 || ^7.0.0 || ^8.0.0"
+  peerDependencies:
+    "@typescript-eslint/eslint-plugin": ^6.0.0 || ^7.0.0 || ^8.0.0
+    eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
+    jest: "*"
+  peerDependenciesMeta:
+    "@typescript-eslint/eslint-plugin":
+      optional: true
+    jest:
+      optional: true
+  checksum: 10c0/faa06ce1c4d0ad7aa0fb1c725edf77fe543a17fe091424dfe5b5e3bba8930470516e5831592e4fb725884f7e5f1034f303f49b7fab28b2abdf99765bfd048473
+  languageName: node
+  linkType: hard
+
 "eslint-plugin-jsx-a11y-x@workspace:.":
   version: 0.0.0-use.local
   resolution: "eslint-plugin-jsx-a11y-x@workspace:."
@@ -3488,11 +3949,11 @@ __metadata:
     "@babel/eslint-parser": "npm:^7.25.9"
     "@babel/plugin-transform-flow-strip-types": "npm:^7.25.9"
     "@babel/preset-env": "npm:^7.27.2"
-    "@babel/register": "npm:^7.25.9"
     "@changesets/changelog-github": "npm:^0.5.1"
     "@changesets/cli": "npm:^2.29.4"
     "@eslint/eslintrc": "npm:^3.3.1"
     "@eslint/js": "npm:^9.26.0"
+    "@types/jest": "npm:^29.5.14"
     aria-query: "npm:^5.3.2"
     ast-types-flow: "npm:^0.0.8"
     axe-core: "npm:^4.10.2"
@@ -3508,11 +3969,13 @@ __metadata:
     eslint-plugin-eslint-plugin: "npm:^6.4.0"
     eslint-plugin-ft-flow: "npm:^3.0.11"
     eslint-plugin-import-x: "npm:^4.11.1"
+    eslint-plugin-jest: "npm:^28.11.0"
     estraverse: "npm:^5.3.0"
     hermes-eslint: "npm:^0.28.1"
     in-publish: "npm:^2.0.1"
     jackspeak: "npm:=2.1.1"
-    jscodeshift: "npm:^17.0.0"
+    jest: "npm:^29.7.0"
+    jscodeshift: "npm:^17.3.0"
     jsx-ast-utils-x: "npm:^0.1.0"
     language-tags: "npm:^1.0.9"
     minimatch: "npm:^3.1.2"
@@ -3521,7 +3984,6 @@ __metadata:
     premove: "npm:^4.0.0"
     prettier: "npm:^3.5.3"
     semver: "npm:^6.3.1"
-    tape: "npm:^5.9.0"
     to-ast: "npm:^1.0.0"
   peerDependencies:
     eslint: ^8.57.0 || ^9.0.0
@@ -3689,6 +4151,43 @@ __metadata:
   languageName: node
   linkType: hard
 
+"execa@npm:^5.0.0":
+  version: 5.1.1
+  resolution: "execa@npm:5.1.1"
+  dependencies:
+    cross-spawn: "npm:^7.0.3"
+    get-stream: "npm:^6.0.0"
+    human-signals: "npm:^2.1.0"
+    is-stream: "npm:^2.0.0"
+    merge-stream: "npm:^2.0.0"
+    npm-run-path: "npm:^4.0.1"
+    onetime: "npm:^5.1.2"
+    signal-exit: "npm:^3.0.3"
+    strip-final-newline: "npm:^2.0.0"
+  checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f
+  languageName: node
+  linkType: hard
+
+"exit@npm:^0.1.2":
+  version: 0.1.2
+  resolution: "exit@npm:0.1.2"
+  checksum: 10c0/71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989
+  languageName: node
+  linkType: hard
+
+"expect@npm:^29.0.0, expect@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "expect@npm:29.7.0"
+  dependencies:
+    "@jest/expect-utils": "npm:^29.7.0"
+    jest-get-type: "npm:^29.6.3"
+    jest-matcher-utils: "npm:^29.7.0"
+    jest-message-util: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+  checksum: 10c0/2eddeace66e68b8d8ee5f7be57f3014b19770caaf6815c7a08d131821da527fb8c8cb7b3dcd7c883d2d3d8d184206a4268984618032d1e4b16dc8d6596475d41
+  languageName: node
+  linkType: hard
+
 "exponential-backoff@npm:^3.1.1":
   version: 3.1.2
   resolution: "exponential-backoff@npm:3.1.2"
@@ -3734,7 +4233,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"fast-json-stable-stringify@npm:^2.0.0":
+"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0":
   version: 2.1.0
   resolution: "fast-json-stable-stringify@npm:2.1.0"
   checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b
@@ -3764,6 +4263,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"fb-watchman@npm:^2.0.0":
+  version: 2.0.2
+  resolution: "fb-watchman@npm:2.0.2"
+  dependencies:
+    bser: "npm:2.1.1"
+  checksum: 10c0/feae89ac148adb8f6ae8ccd87632e62b13563e6fb114cacb5265c51f585b17e2e268084519fb2edd133872f1d47a18e6bfd7e5e08625c0d41b93149694187581
+  languageName: node
+  linkType: hard
+
 "fdir@npm:^6.4.4":
   version: 6.4.4
   resolution: "fdir@npm:6.4.4"
@@ -3814,7 +4322,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"find-up@npm:^4.1.0":
+"find-up@npm:^4.0.0, find-up@npm:^4.1.0":
   version: 4.1.0
   resolution: "find-up@npm:4.1.0"
   dependencies:
@@ -3858,15 +4366,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"for-each@npm:^0.3.3, for-each@npm:^0.3.5":
-  version: 0.3.5
-  resolution: "for-each@npm:0.3.5"
-  dependencies:
-    is-callable: "npm:^1.2.7"
-  checksum: 10c0/0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee
-  languageName: node
-  linkType: hard
-
 "foreground-child@npm:^3.1.0":
   version: 3.3.1
   resolution: "foreground-child@npm:3.3.1"
@@ -3922,7 +4421,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"fsevents@npm:~2.3.2":
+"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2":
   version: 2.3.3
   resolution: "fsevents@npm:2.3.3"
   dependencies:
@@ -3932,7 +4431,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin":
+"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin":
   version: 2.3.3
   resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1"
   dependencies:
@@ -3948,27 +4447,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8":
-  version: 1.1.8
-  resolution: "function.prototype.name@npm:1.1.8"
-  dependencies:
-    call-bind: "npm:^1.0.8"
-    call-bound: "npm:^1.0.3"
-    define-properties: "npm:^1.2.1"
-    functions-have-names: "npm:^1.2.3"
-    hasown: "npm:^2.0.2"
-    is-callable: "npm:^1.2.7"
-  checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253
-  languageName: node
-  linkType: hard
-
-"functions-have-names@npm:^1.2.3":
-  version: 1.2.3
-  resolution: "functions-have-names@npm:1.2.3"
-  checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca
-  languageName: node
-  linkType: hard
-
 "gensync@npm:^1.0.0-beta.2":
   version: 1.0.0-beta.2
   resolution: "gensync@npm:1.0.0-beta.2"
@@ -3976,7 +4454,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0":
+"get-caller-file@npm:^2.0.5":
+  version: 2.0.5
+  resolution: "get-caller-file@npm:2.0.5"
+  checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde
+  languageName: node
+  linkType: hard
+
+"get-intrinsic@npm:^1.3.0":
   version: 1.3.0
   resolution: "get-intrinsic@npm:1.3.0"
   dependencies:
@@ -4001,7 +4486,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1":
+"get-proto@npm:^1.0.1":
   version: 1.0.1
   resolution: "get-proto@npm:1.0.1"
   dependencies:
@@ -4011,14 +4496,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"get-symbol-description@npm:^1.1.0":
-  version: 1.1.0
-  resolution: "get-symbol-description@npm:1.1.0"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-    es-errors: "npm:^1.3.0"
-    get-intrinsic: "npm:^1.2.6"
-  checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b
+"get-stream@npm:^6.0.0":
+  version: 6.0.1
+  resolution: "get-stream@npm:6.0.1"
+  checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341
   languageName: node
   linkType: hard
 
@@ -4065,7 +4546,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"glob@npm:^7.1.6, glob@npm:^7.2.0, glob@npm:^7.2.3":
+"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0":
   version: 7.2.3
   resolution: "glob@npm:7.2.3"
   dependencies:
@@ -4093,16 +4574,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"globalthis@npm:^1.0.4":
-  version: 1.0.4
-  resolution: "globalthis@npm:1.0.4"
-  dependencies:
-    define-properties: "npm:^1.2.1"
-    gopd: "npm:^1.0.1"
-  checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846
-  languageName: node
-  linkType: hard
-
 "globby@npm:^11.0.0, globby@npm:^11.1.0":
   version: 11.1.0
   resolution: "globby@npm:11.1.0"
@@ -4117,60 +4588,24 @@ __metadata:
   languageName: node
   linkType: hard
 
-"gopd@npm:^1.0.1, gopd@npm:^1.2.0":
+"gopd@npm:^1.2.0":
   version: 1.2.0
   resolution: "gopd@npm:1.2.0"
   checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead
   languageName: node
   linkType: hard
 
-"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6":
+"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9":
   version: 4.2.11
   resolution: "graceful-fs@npm:4.2.11"
   checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2
   languageName: node
   linkType: hard
 
-"has-bigints@npm:^1.0.2":
-  version: 1.1.0
-  resolution: "has-bigints@npm:1.1.0"
-  checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788
-  languageName: node
-  linkType: hard
-
-"has-dynamic-import@npm:^2.1.0":
-  version: 2.1.1
-  resolution: "has-dynamic-import@npm:2.1.1"
-  dependencies:
-    call-bind: "npm:^1.0.8"
-    call-bound: "npm:^1.0.3"
-    get-intrinsic: "npm:^1.2.6"
-  checksum: 10c0/30f3b5cb0daf82c432c52a37b29ddbcbb9a3b333cfce836f7b79e8efbb89ed4a5fb8dd72dde41b18c9b2485c9b390f4a59764790c0795c1edbfa6014fdb6a154
-  languageName: node
-  linkType: hard
-
-"has-flag@npm:^4.0.0":
-  version: 4.0.0
-  resolution: "has-flag@npm:4.0.0"
-  checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1
-  languageName: node
-  linkType: hard
-
-"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2":
-  version: 1.0.2
-  resolution: "has-property-descriptors@npm:1.0.2"
-  dependencies:
-    es-define-property: "npm:^1.0.0"
-  checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236
-  languageName: node
-  linkType: hard
-
-"has-proto@npm:^1.2.0":
-  version: 1.2.0
-  resolution: "has-proto@npm:1.2.0"
-  dependencies:
-    dunder-proto: "npm:^1.0.0"
-  checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95
+"has-flag@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "has-flag@npm:4.0.0"
+  checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1
   languageName: node
   linkType: hard
 
@@ -4226,6 +4661,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"html-escaper@npm:^2.0.0":
+  version: 2.0.2
+  resolution: "html-escaper@npm:2.0.2"
+  checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0
+  languageName: node
+  linkType: hard
+
 "http-cache-semantics@npm:^4.1.1":
   version: 4.2.0
   resolution: "http-cache-semantics@npm:4.2.0"
@@ -4262,6 +4704,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"human-signals@npm:^2.1.0":
+  version: 2.1.0
+  resolution: "human-signals@npm:2.1.0"
+  checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a
+  languageName: node
+  linkType: hard
+
 "iconv-lite@npm:^0.4.24":
   version: 0.4.24
   resolution: "iconv-lite@npm:0.4.24"
@@ -4297,6 +4746,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"import-local@npm:^3.0.2":
+  version: 3.2.0
+  resolution: "import-local@npm:3.2.0"
+  dependencies:
+    pkg-dir: "npm:^4.2.0"
+    resolve-cwd: "npm:^3.0.0"
+  bin:
+    import-local-fixture: fixtures/cli.js
+  checksum: 10c0/94cd6367a672b7e0cb026970c85b76902d2710a64896fa6de93bd5c571dd03b228c5759308959de205083e3b1c61e799f019c9e36ee8e9c523b993e1057f0433
+  languageName: node
+  linkType: hard
+
 "imurmurhash@npm:^0.1.4":
   version: 0.1.4
   resolution: "imurmurhash@npm:0.1.4"
@@ -4333,17 +4794,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"internal-slot@npm:^1.1.0":
-  version: 1.1.0
-  resolution: "internal-slot@npm:1.1.0"
-  dependencies:
-    es-errors: "npm:^1.3.0"
-    hasown: "npm:^2.0.2"
-    side-channel: "npm:^1.1.0"
-  checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7
-  languageName: node
-  linkType: hard
-
 "ip-address@npm:^9.0.5":
   version: 9.0.5
   resolution: "ip-address@npm:9.0.5"
@@ -4354,27 +4804,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-arguments@npm:^1.1.1":
-  version: 1.2.0
-  resolution: "is-arguments@npm:1.2.0"
-  dependencies:
-    call-bound: "npm:^1.0.2"
-    has-tostringtag: "npm:^1.0.2"
-  checksum: 10c0/6377344b31e9fcb707c6751ee89b11f132f32338e6a782ec2eac9393b0cbd32235dad93052998cda778ee058754860738341d8114910d50ada5615912bb929fc
-  languageName: node
-  linkType: hard
-
-"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5":
-  version: 3.0.5
-  resolution: "is-array-buffer@npm:3.0.5"
-  dependencies:
-    call-bind: "npm:^1.0.8"
-    call-bound: "npm:^1.0.3"
-    get-intrinsic: "npm:^1.2.6"
-  checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d
-  languageName: node
-  linkType: hard
-
 "is-arrayish@npm:^0.2.1":
   version: 0.2.1
   resolution: "is-arrayish@npm:0.2.1"
@@ -4382,28 +4811,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-async-function@npm:^2.0.0":
-  version: 2.1.1
-  resolution: "is-async-function@npm:2.1.1"
-  dependencies:
-    async-function: "npm:^1.0.0"
-    call-bound: "npm:^1.0.3"
-    get-proto: "npm:^1.0.1"
-    has-tostringtag: "npm:^1.0.2"
-    safe-regex-test: "npm:^1.1.0"
-  checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298
-  languageName: node
-  linkType: hard
-
-"is-bigint@npm:^1.1.0":
-  version: 1.1.0
-  resolution: "is-bigint@npm:1.1.0"
-  dependencies:
-    has-bigints: "npm:^1.0.2"
-  checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4
-  languageName: node
-  linkType: hard
-
 "is-binary-path@npm:~2.1.0":
   version: 2.1.0
   resolution: "is-binary-path@npm:2.1.0"
@@ -4413,16 +4820,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-boolean-object@npm:^1.2.1":
-  version: 1.2.2
-  resolution: "is-boolean-object@npm:1.2.2"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-    has-tostringtag: "npm:^1.0.2"
-  checksum: 10c0/36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e
-  languageName: node
-  linkType: hard
-
 "is-bun-module@npm:^2.0.0":
   version: 2.0.0
   resolution: "is-bun-module@npm:2.0.0"
@@ -4432,13 +4829,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-callable@npm:^1.2.7":
-  version: 1.2.7
-  resolution: "is-callable@npm:1.2.7"
-  checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f
-  languageName: node
-  linkType: hard
-
 "is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.0":
   version: 2.16.1
   resolution: "is-core-module@npm:2.16.1"
@@ -4448,27 +4838,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2":
-  version: 1.0.2
-  resolution: "is-data-view@npm:1.0.2"
-  dependencies:
-    call-bound: "npm:^1.0.2"
-    get-intrinsic: "npm:^1.2.6"
-    is-typed-array: "npm:^1.1.13"
-  checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153
-  languageName: node
-  linkType: hard
-
-"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0":
-  version: 1.1.0
-  resolution: "is-date-object@npm:1.1.0"
-  dependencies:
-    call-bound: "npm:^1.0.2"
-    has-tostringtag: "npm:^1.0.2"
-  checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f
-  languageName: node
-  linkType: hard
-
 "is-expression@npm:^4.0.0":
   version: 4.0.0
   resolution: "is-expression@npm:4.0.0"
@@ -4486,15 +4855,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-finalizationregistry@npm:^1.1.0":
-  version: 1.1.1
-  resolution: "is-finalizationregistry@npm:1.1.1"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-  checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97
-  languageName: node
-  linkType: hard
-
 "is-fullwidth-code-point@npm:^3.0.0":
   version: 3.0.0
   resolution: "is-fullwidth-code-point@npm:3.0.0"
@@ -4502,15 +4862,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-generator-function@npm:^1.0.10":
-  version: 1.1.0
-  resolution: "is-generator-function@npm:1.1.0"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-    get-proto: "npm:^1.0.0"
-    has-tostringtag: "npm:^1.0.2"
-    safe-regex-test: "npm:^1.1.0"
-  checksum: 10c0/fdfa96c8087bf36fc4cd514b474ba2ff404219a4dd4cfa6cf5426404a1eed259bdcdb98f082a71029a48d01f27733e3436ecc6690129a7ec09cb0434bee03a2a
+"is-generator-fn@npm:^2.0.0":
+  version: 2.1.0
+  resolution: "is-generator-fn@npm:2.1.0"
+  checksum: 10c0/2957cab387997a466cd0bf5c1b6047bd21ecb32bdcfd8996b15747aa01002c1c88731802f1b3d34ac99f4f6874b626418bd118658cf39380fe5fff32a3af9c4d
   languageName: node
   linkType: hard
 
@@ -4523,23 +4878,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-map@npm:^2.0.2, is-map@npm:^2.0.3":
-  version: 2.0.3
-  resolution: "is-map@npm:2.0.3"
-  checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc
-  languageName: node
-  linkType: hard
-
-"is-number-object@npm:^1.1.1":
-  version: 1.1.1
-  resolution: "is-number-object@npm:1.1.1"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-    has-tostringtag: "npm:^1.0.2"
-  checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53
-  languageName: node
-  linkType: hard
-
 "is-number@npm:^7.0.0":
   version: 7.0.0
   resolution: "is-number@npm:7.0.0"
@@ -4556,7 +4894,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-regex@npm:^1.0.3, is-regex@npm:^1.1.4, is-regex@npm:^1.2.1":
+"is-regex@npm:^1.0.3":
   version: 1.2.1
   resolution: "is-regex@npm:1.2.1"
   dependencies:
@@ -4568,29 +4906,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-set@npm:^2.0.2, is-set@npm:^2.0.3":
-  version: 2.0.3
-  resolution: "is-set@npm:2.0.3"
-  checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7
-  languageName: node
-  linkType: hard
-
-"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.4":
-  version: 1.0.4
-  resolution: "is-shared-array-buffer@npm:1.0.4"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-  checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db
-  languageName: node
-  linkType: hard
-
-"is-string@npm:^1.0.7, is-string@npm:^1.1.0, is-string@npm:^1.1.1":
-  version: 1.1.1
-  resolution: "is-string@npm:1.1.1"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-    has-tostringtag: "npm:^1.0.2"
-  checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d
+"is-stream@npm:^2.0.0":
+  version: 2.0.1
+  resolution: "is-stream@npm:2.0.1"
+  checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5
   languageName: node
   linkType: hard
 
@@ -4603,84 +4922,96 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1":
-  version: 1.1.1
-  resolution: "is-symbol@npm:1.1.1"
-  dependencies:
-    call-bound: "npm:^1.0.2"
-    has-symbols: "npm:^1.1.0"
-    safe-regex-test: "npm:^1.1.0"
-  checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e
+"is-windows@npm:^1.0.0":
+  version: 1.0.2
+  resolution: "is-windows@npm:1.0.2"
+  checksum: 10c0/b32f418ab3385604a66f1b7a3ce39d25e8881dee0bd30816dc8344ef6ff9df473a732bcc1ec4e84fe99b2f229ae474f7133e8e93f9241686cfcf7eebe53ba7a5
   languageName: node
   linkType: hard
 
-"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15":
-  version: 1.1.15
-  resolution: "is-typed-array@npm:1.1.15"
-  dependencies:
-    which-typed-array: "npm:^1.1.16"
-  checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4
+"isexe@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "isexe@npm:2.0.0"
+  checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d
   languageName: node
   linkType: hard
 
-"is-weakmap@npm:^2.0.2":
-  version: 2.0.2
-  resolution: "is-weakmap@npm:2.0.2"
-  checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299
+"isexe@npm:^3.1.1":
+  version: 3.1.1
+  resolution: "isexe@npm:3.1.1"
+  checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7
   languageName: node
   linkType: hard
 
-"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0":
-  version: 1.1.1
-  resolution: "is-weakref@npm:1.1.1"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-  checksum: 10c0/8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b
+"isobject@npm:^3.0.1":
+  version: 3.0.1
+  resolution: "isobject@npm:3.0.1"
+  checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db
   languageName: node
   linkType: hard
 
-"is-weakset@npm:^2.0.3":
-  version: 2.0.4
-  resolution: "is-weakset@npm:2.0.4"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-    get-intrinsic: "npm:^1.2.6"
-  checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647
+"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0":
+  version: 3.2.2
+  resolution: "istanbul-lib-coverage@npm:3.2.2"
+  checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b
   languageName: node
   linkType: hard
 
-"is-windows@npm:^1.0.0":
-  version: 1.0.2
-  resolution: "is-windows@npm:1.0.2"
-  checksum: 10c0/b32f418ab3385604a66f1b7a3ce39d25e8881dee0bd30816dc8344ef6ff9df473a732bcc1ec4e84fe99b2f229ae474f7133e8e93f9241686cfcf7eebe53ba7a5
+"istanbul-lib-instrument@npm:^5.0.4":
+  version: 5.2.1
+  resolution: "istanbul-lib-instrument@npm:5.2.1"
+  dependencies:
+    "@babel/core": "npm:^7.12.3"
+    "@babel/parser": "npm:^7.14.7"
+    "@istanbuljs/schema": "npm:^0.1.2"
+    istanbul-lib-coverage: "npm:^3.2.0"
+    semver: "npm:^6.3.0"
+  checksum: 10c0/8a1bdf3e377dcc0d33ec32fe2b6ecacdb1e4358fd0eb923d4326bb11c67622c0ceb99600a680f3dad5d29c66fc1991306081e339b4d43d0b8a2ab2e1d910a6ee
   languageName: node
   linkType: hard
 
-"isarray@npm:^2.0.5":
-  version: 2.0.5
-  resolution: "isarray@npm:2.0.5"
-  checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd
+"istanbul-lib-instrument@npm:^6.0.0":
+  version: 6.0.3
+  resolution: "istanbul-lib-instrument@npm:6.0.3"
+  dependencies:
+    "@babel/core": "npm:^7.23.9"
+    "@babel/parser": "npm:^7.23.9"
+    "@istanbuljs/schema": "npm:^0.1.3"
+    istanbul-lib-coverage: "npm:^3.2.0"
+    semver: "npm:^7.5.4"
+  checksum: 10c0/a1894e060dd2a3b9f046ffdc87b44c00a35516f5e6b7baf4910369acca79e506fc5323a816f811ae23d82334b38e3ddeb8b3b331bd2c860540793b59a8689128
   languageName: node
   linkType: hard
 
-"isexe@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "isexe@npm:2.0.0"
-  checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d
+"istanbul-lib-report@npm:^3.0.0":
+  version: 3.0.1
+  resolution: "istanbul-lib-report@npm:3.0.1"
+  dependencies:
+    istanbul-lib-coverage: "npm:^3.0.0"
+    make-dir: "npm:^4.0.0"
+    supports-color: "npm:^7.1.0"
+  checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7
   languageName: node
   linkType: hard
 
-"isexe@npm:^3.1.1":
-  version: 3.1.1
-  resolution: "isexe@npm:3.1.1"
-  checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7
+"istanbul-lib-source-maps@npm:^4.0.0":
+  version: 4.0.1
+  resolution: "istanbul-lib-source-maps@npm:4.0.1"
+  dependencies:
+    debug: "npm:^4.1.1"
+    istanbul-lib-coverage: "npm:^3.0.0"
+    source-map: "npm:^0.6.1"
+  checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66
   languageName: node
   linkType: hard
 
-"isobject@npm:^3.0.1":
-  version: 3.0.1
-  resolution: "isobject@npm:3.0.1"
-  checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db
+"istanbul-reports@npm:^3.1.3":
+  version: 3.1.7
+  resolution: "istanbul-reports@npm:3.1.7"
+  dependencies:
+    html-escaper: "npm:^2.0.0"
+    istanbul-lib-report: "npm:^3.0.0"
+  checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51
   languageName: node
   linkType: hard
 
@@ -4710,7 +5041,110 @@ __metadata:
   languageName: node
   linkType: hard
 
-"jest-diff@npm:^29.2.1":
+"jest-changed-files@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-changed-files@npm:29.7.0"
+  dependencies:
+    execa: "npm:^5.0.0"
+    jest-util: "npm:^29.7.0"
+    p-limit: "npm:^3.1.0"
+  checksum: 10c0/e071384d9e2f6bb462231ac53f29bff86f0e12394c1b49ccafbad225ce2ab7da226279a8a94f421949920bef9be7ef574fd86aee22e8adfa149be73554ab828b
+  languageName: node
+  linkType: hard
+
+"jest-circus@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-circus@npm:29.7.0"
+  dependencies:
+    "@jest/environment": "npm:^29.7.0"
+    "@jest/expect": "npm:^29.7.0"
+    "@jest/test-result": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    "@types/node": "npm:*"
+    chalk: "npm:^4.0.0"
+    co: "npm:^4.6.0"
+    dedent: "npm:^1.0.0"
+    is-generator-fn: "npm:^2.0.0"
+    jest-each: "npm:^29.7.0"
+    jest-matcher-utils: "npm:^29.7.0"
+    jest-message-util: "npm:^29.7.0"
+    jest-runtime: "npm:^29.7.0"
+    jest-snapshot: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+    p-limit: "npm:^3.1.0"
+    pretty-format: "npm:^29.7.0"
+    pure-rand: "npm:^6.0.0"
+    slash: "npm:^3.0.0"
+    stack-utils: "npm:^2.0.3"
+  checksum: 10c0/8d15344cf7a9f14e926f0deed64ed190c7a4fa1ed1acfcd81e4cc094d3cc5bf7902ebb7b874edc98ada4185688f90c91e1747e0dfd7ac12463b097968ae74b5e
+  languageName: node
+  linkType: hard
+
+"jest-cli@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-cli@npm:29.7.0"
+  dependencies:
+    "@jest/core": "npm:^29.7.0"
+    "@jest/test-result": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    chalk: "npm:^4.0.0"
+    create-jest: "npm:^29.7.0"
+    exit: "npm:^0.1.2"
+    import-local: "npm:^3.0.2"
+    jest-config: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+    jest-validate: "npm:^29.7.0"
+    yargs: "npm:^17.3.1"
+  peerDependencies:
+    node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+  peerDependenciesMeta:
+    node-notifier:
+      optional: true
+  bin:
+    jest: bin/jest.js
+  checksum: 10c0/a658fd55050d4075d65c1066364595962ead7661711495cfa1dfeecf3d6d0a8ffec532f3dbd8afbb3e172dd5fd2fb2e813c5e10256e7cf2fea766314942fb43a
+  languageName: node
+  linkType: hard
+
+"jest-config@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-config@npm:29.7.0"
+  dependencies:
+    "@babel/core": "npm:^7.11.6"
+    "@jest/test-sequencer": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    babel-jest: "npm:^29.7.0"
+    chalk: "npm:^4.0.0"
+    ci-info: "npm:^3.2.0"
+    deepmerge: "npm:^4.2.2"
+    glob: "npm:^7.1.3"
+    graceful-fs: "npm:^4.2.9"
+    jest-circus: "npm:^29.7.0"
+    jest-environment-node: "npm:^29.7.0"
+    jest-get-type: "npm:^29.6.3"
+    jest-regex-util: "npm:^29.6.3"
+    jest-resolve: "npm:^29.7.0"
+    jest-runner: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+    jest-validate: "npm:^29.7.0"
+    micromatch: "npm:^4.0.4"
+    parse-json: "npm:^5.2.0"
+    pretty-format: "npm:^29.7.0"
+    slash: "npm:^3.0.0"
+    strip-json-comments: "npm:^3.1.1"
+  peerDependencies:
+    "@types/node": "*"
+    ts-node: ">=9.0.0"
+  peerDependenciesMeta:
+    "@types/node":
+      optional: true
+    ts-node:
+      optional: true
+  checksum: 10c0/bab23c2eda1fff06e0d104b00d6adfb1d1aabb7128441899c9bff2247bd26710b050a5364281ce8d52b46b499153bf7e3ee88b19831a8f3451f1477a0246a0f1
+  languageName: node
+  linkType: hard
+
+"jest-diff@npm:^29.2.1, jest-diff@npm:^29.7.0":
   version: 29.7.0
   resolution: "jest-diff@npm:29.7.0"
   dependencies:
@@ -4722,6 +5156,42 @@ __metadata:
   languageName: node
   linkType: hard
 
+"jest-docblock@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-docblock@npm:29.7.0"
+  dependencies:
+    detect-newline: "npm:^3.0.0"
+  checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9
+  languageName: node
+  linkType: hard
+
+"jest-each@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-each@npm:29.7.0"
+  dependencies:
+    "@jest/types": "npm:^29.6.3"
+    chalk: "npm:^4.0.0"
+    jest-get-type: "npm:^29.6.3"
+    jest-util: "npm:^29.7.0"
+    pretty-format: "npm:^29.7.0"
+  checksum: 10c0/f7f9a90ebee80cc688e825feceb2613627826ac41ea76a366fa58e669c3b2403d364c7c0a74d862d469b103c843154f8456d3b1c02b487509a12afa8b59edbb4
+  languageName: node
+  linkType: hard
+
+"jest-environment-node@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-environment-node@npm:29.7.0"
+  dependencies:
+    "@jest/environment": "npm:^29.7.0"
+    "@jest/fake-timers": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    "@types/node": "npm:*"
+    jest-mock: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+  checksum: 10c0/61f04fec077f8b1b5c1a633e3612fc0c9aa79a0ab7b05600683428f1e01a4d35346c474bde6f439f9fcc1a4aa9a2861ff852d079a43ab64b02105d1004b2592b
+  languageName: node
+  linkType: hard
+
 "jest-get-type@npm:^29.6.3":
   version: 29.6.3
   resolution: "jest-get-type@npm:29.6.3"
@@ -4729,6 +5199,287 @@ __metadata:
   languageName: node
   linkType: hard
 
+"jest-haste-map@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-haste-map@npm:29.7.0"
+  dependencies:
+    "@jest/types": "npm:^29.6.3"
+    "@types/graceful-fs": "npm:^4.1.3"
+    "@types/node": "npm:*"
+    anymatch: "npm:^3.0.3"
+    fb-watchman: "npm:^2.0.0"
+    fsevents: "npm:^2.3.2"
+    graceful-fs: "npm:^4.2.9"
+    jest-regex-util: "npm:^29.6.3"
+    jest-util: "npm:^29.7.0"
+    jest-worker: "npm:^29.7.0"
+    micromatch: "npm:^4.0.4"
+    walker: "npm:^1.0.8"
+  dependenciesMeta:
+    fsevents:
+      optional: true
+  checksum: 10c0/2683a8f29793c75a4728787662972fedd9267704c8f7ef9d84f2beed9a977f1cf5e998c07b6f36ba5603f53cb010c911fe8cd0ac9886e073fe28ca66beefd30c
+  languageName: node
+  linkType: hard
+
+"jest-leak-detector@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-leak-detector@npm:29.7.0"
+  dependencies:
+    jest-get-type: "npm:^29.6.3"
+    pretty-format: "npm:^29.7.0"
+  checksum: 10c0/71bb9f77fc489acb842a5c7be030f2b9acb18574dc9fb98b3100fc57d422b1abc55f08040884bd6e6dbf455047a62f7eaff12aa4058f7cbdc11558718ca6a395
+  languageName: node
+  linkType: hard
+
+"jest-matcher-utils@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-matcher-utils@npm:29.7.0"
+  dependencies:
+    chalk: "npm:^4.0.0"
+    jest-diff: "npm:^29.7.0"
+    jest-get-type: "npm:^29.6.3"
+    pretty-format: "npm:^29.7.0"
+  checksum: 10c0/0d0e70b28fa5c7d4dce701dc1f46ae0922102aadc24ed45d594dd9b7ae0a8a6ef8b216718d1ab79e451291217e05d4d49a82666e1a3cc2b428b75cd9c933244e
+  languageName: node
+  linkType: hard
+
+"jest-message-util@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-message-util@npm:29.7.0"
+  dependencies:
+    "@babel/code-frame": "npm:^7.12.13"
+    "@jest/types": "npm:^29.6.3"
+    "@types/stack-utils": "npm:^2.0.0"
+    chalk: "npm:^4.0.0"
+    graceful-fs: "npm:^4.2.9"
+    micromatch: "npm:^4.0.4"
+    pretty-format: "npm:^29.7.0"
+    slash: "npm:^3.0.0"
+    stack-utils: "npm:^2.0.3"
+  checksum: 10c0/850ae35477f59f3e6f27efac5215f706296e2104af39232bb14e5403e067992afb5c015e87a9243ec4d9df38525ef1ca663af9f2f4766aa116f127247008bd22
+  languageName: node
+  linkType: hard
+
+"jest-mock@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-mock@npm:29.7.0"
+  dependencies:
+    "@jest/types": "npm:^29.6.3"
+    "@types/node": "npm:*"
+    jest-util: "npm:^29.7.0"
+  checksum: 10c0/7b9f8349ee87695a309fe15c46a74ab04c853369e5c40952d68061d9dc3159a0f0ed73e215f81b07ee97a9faaf10aebe5877a9d6255068a0977eae6a9ff1d5ac
+  languageName: node
+  linkType: hard
+
+"jest-pnp-resolver@npm:^1.2.2":
+  version: 1.2.3
+  resolution: "jest-pnp-resolver@npm:1.2.3"
+  peerDependencies:
+    jest-resolve: "*"
+  peerDependenciesMeta:
+    jest-resolve:
+      optional: true
+  checksum: 10c0/86eec0c78449a2de733a6d3e316d49461af6a858070e113c97f75fb742a48c2396ea94150cbca44159ffd4a959f743a47a8b37a792ef6fdad2cf0a5cba973fac
+  languageName: node
+  linkType: hard
+
+"jest-regex-util@npm:^29.6.3":
+  version: 29.6.3
+  resolution: "jest-regex-util@npm:29.6.3"
+  checksum: 10c0/4e33fb16c4f42111159cafe26397118dcfc4cf08bc178a67149fb05f45546a91928b820894572679d62559839d0992e21080a1527faad65daaae8743a5705a3b
+  languageName: node
+  linkType: hard
+
+"jest-resolve-dependencies@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-resolve-dependencies@npm:29.7.0"
+  dependencies:
+    jest-regex-util: "npm:^29.6.3"
+    jest-snapshot: "npm:^29.7.0"
+  checksum: 10c0/b6e9ad8ae5b6049474118ea6441dfddd385b6d1fc471db0136f7c8fbcfe97137a9665e4f837a9f49f15a29a1deb95a14439b7aec812f3f99d08f228464930f0d
+  languageName: node
+  linkType: hard
+
+"jest-resolve@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-resolve@npm:29.7.0"
+  dependencies:
+    chalk: "npm:^4.0.0"
+    graceful-fs: "npm:^4.2.9"
+    jest-haste-map: "npm:^29.7.0"
+    jest-pnp-resolver: "npm:^1.2.2"
+    jest-util: "npm:^29.7.0"
+    jest-validate: "npm:^29.7.0"
+    resolve: "npm:^1.20.0"
+    resolve.exports: "npm:^2.0.0"
+    slash: "npm:^3.0.0"
+  checksum: 10c0/59da5c9c5b50563e959a45e09e2eace783d7f9ac0b5dcc6375dea4c0db938d2ebda97124c8161310082760e8ebbeff9f6b177c15ca2f57fb424f637a5d2adb47
+  languageName: node
+  linkType: hard
+
+"jest-runner@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-runner@npm:29.7.0"
+  dependencies:
+    "@jest/console": "npm:^29.7.0"
+    "@jest/environment": "npm:^29.7.0"
+    "@jest/test-result": "npm:^29.7.0"
+    "@jest/transform": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    "@types/node": "npm:*"
+    chalk: "npm:^4.0.0"
+    emittery: "npm:^0.13.1"
+    graceful-fs: "npm:^4.2.9"
+    jest-docblock: "npm:^29.7.0"
+    jest-environment-node: "npm:^29.7.0"
+    jest-haste-map: "npm:^29.7.0"
+    jest-leak-detector: "npm:^29.7.0"
+    jest-message-util: "npm:^29.7.0"
+    jest-resolve: "npm:^29.7.0"
+    jest-runtime: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+    jest-watcher: "npm:^29.7.0"
+    jest-worker: "npm:^29.7.0"
+    p-limit: "npm:^3.1.0"
+    source-map-support: "npm:0.5.13"
+  checksum: 10c0/2194b4531068d939f14c8d3274fe5938b77fa73126aedf9c09ec9dec57d13f22c72a3b5af01ac04f5c1cf2e28d0ac0b4a54212a61b05f10b5d6b47f2a1097bb4
+  languageName: node
+  linkType: hard
+
+"jest-runtime@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-runtime@npm:29.7.0"
+  dependencies:
+    "@jest/environment": "npm:^29.7.0"
+    "@jest/fake-timers": "npm:^29.7.0"
+    "@jest/globals": "npm:^29.7.0"
+    "@jest/source-map": "npm:^29.6.3"
+    "@jest/test-result": "npm:^29.7.0"
+    "@jest/transform": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    "@types/node": "npm:*"
+    chalk: "npm:^4.0.0"
+    cjs-module-lexer: "npm:^1.0.0"
+    collect-v8-coverage: "npm:^1.0.0"
+    glob: "npm:^7.1.3"
+    graceful-fs: "npm:^4.2.9"
+    jest-haste-map: "npm:^29.7.0"
+    jest-message-util: "npm:^29.7.0"
+    jest-mock: "npm:^29.7.0"
+    jest-regex-util: "npm:^29.6.3"
+    jest-resolve: "npm:^29.7.0"
+    jest-snapshot: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+    slash: "npm:^3.0.0"
+    strip-bom: "npm:^4.0.0"
+  checksum: 10c0/7cd89a1deda0bda7d0941835434e44f9d6b7bd50b5c5d9b0fc9a6c990b2d4d2cab59685ab3cb2850ed4cc37059f6de903af5a50565d7f7f1192a77d3fd6dd2a6
+  languageName: node
+  linkType: hard
+
+"jest-snapshot@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-snapshot@npm:29.7.0"
+  dependencies:
+    "@babel/core": "npm:^7.11.6"
+    "@babel/generator": "npm:^7.7.2"
+    "@babel/plugin-syntax-jsx": "npm:^7.7.2"
+    "@babel/plugin-syntax-typescript": "npm:^7.7.2"
+    "@babel/types": "npm:^7.3.3"
+    "@jest/expect-utils": "npm:^29.7.0"
+    "@jest/transform": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    babel-preset-current-node-syntax: "npm:^1.0.0"
+    chalk: "npm:^4.0.0"
+    expect: "npm:^29.7.0"
+    graceful-fs: "npm:^4.2.9"
+    jest-diff: "npm:^29.7.0"
+    jest-get-type: "npm:^29.6.3"
+    jest-matcher-utils: "npm:^29.7.0"
+    jest-message-util: "npm:^29.7.0"
+    jest-util: "npm:^29.7.0"
+    natural-compare: "npm:^1.4.0"
+    pretty-format: "npm:^29.7.0"
+    semver: "npm:^7.5.3"
+  checksum: 10c0/6e9003c94ec58172b4a62864a91c0146513207bedf4e0a06e1e2ac70a4484088a2683e3a0538d8ea913bcfd53dc54a9b98a98cdfa562e7fe1d1339aeae1da570
+  languageName: node
+  linkType: hard
+
+"jest-util@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-util@npm:29.7.0"
+  dependencies:
+    "@jest/types": "npm:^29.6.3"
+    "@types/node": "npm:*"
+    chalk: "npm:^4.0.0"
+    ci-info: "npm:^3.2.0"
+    graceful-fs: "npm:^4.2.9"
+    picomatch: "npm:^2.2.3"
+  checksum: 10c0/bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150
+  languageName: node
+  linkType: hard
+
+"jest-validate@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-validate@npm:29.7.0"
+  dependencies:
+    "@jest/types": "npm:^29.6.3"
+    camelcase: "npm:^6.2.0"
+    chalk: "npm:^4.0.0"
+    jest-get-type: "npm:^29.6.3"
+    leven: "npm:^3.1.0"
+    pretty-format: "npm:^29.7.0"
+  checksum: 10c0/a20b930480c1ed68778c739f4739dce39423131bc070cd2505ddede762a5570a256212e9c2401b7ae9ba4d7b7c0803f03c5b8f1561c62348213aba18d9dbece2
+  languageName: node
+  linkType: hard
+
+"jest-watcher@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-watcher@npm:29.7.0"
+  dependencies:
+    "@jest/test-result": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    "@types/node": "npm:*"
+    ansi-escapes: "npm:^4.2.1"
+    chalk: "npm:^4.0.0"
+    emittery: "npm:^0.13.1"
+    jest-util: "npm:^29.7.0"
+    string-length: "npm:^4.0.1"
+  checksum: 10c0/ec6c75030562fc8f8c727cb8f3b94e75d831fc718785abfc196e1f2a2ebc9a2e38744a15147170039628a853d77a3b695561ce850375ede3a4ee6037a2574567
+  languageName: node
+  linkType: hard
+
+"jest-worker@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest-worker@npm:29.7.0"
+  dependencies:
+    "@types/node": "npm:*"
+    jest-util: "npm:^29.7.0"
+    merge-stream: "npm:^2.0.0"
+    supports-color: "npm:^8.0.0"
+  checksum: 10c0/5570a3a005b16f46c131968b8a5b56d291f9bbb85ff4217e31c80bd8a02e7de799e59a54b95ca28d5c302f248b54cbffde2d177c2f0f52ffcee7504c6eabf660
+  languageName: node
+  linkType: hard
+
+"jest@npm:^29.7.0":
+  version: 29.7.0
+  resolution: "jest@npm:29.7.0"
+  dependencies:
+    "@jest/core": "npm:^29.7.0"
+    "@jest/types": "npm:^29.6.3"
+    import-local: "npm:^3.0.2"
+    jest-cli: "npm:^29.7.0"
+  peerDependencies:
+    node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+  peerDependenciesMeta:
+    node-notifier:
+      optional: true
+  bin:
+    jest: bin/jest.js
+  checksum: 10c0/f40eb8171cf147c617cc6ada49d062fbb03b4da666cb8d39cdbfb739a7d75eea4c3ca150fb072d0d273dce0c753db4d0467d54906ad0293f59c54f9db4a09d8b
+  languageName: node
+  linkType: hard
+
 "js-tokens@npm:^4.0.0":
   version: 4.0.0
   resolution: "js-tokens@npm:4.0.0"
@@ -4766,7 +5517,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"jscodeshift@npm:^17.0.0":
+"jscodeshift@npm:^17.3.0":
   version: 17.3.0
   resolution: "jscodeshift@npm:17.3.0"
   dependencies:
@@ -4903,6 +5654,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"kleur@npm:^3.0.3":
+  version: 3.0.3
+  resolution: "kleur@npm:3.0.3"
+  checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b
+  languageName: node
+  linkType: hard
+
 "language-subtag-registry@npm:^0.3.20":
   version: 0.3.23
   resolution: "language-subtag-registry@npm:0.3.23"
@@ -4919,6 +5677,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"leven@npm:^3.1.0":
+  version: 3.1.0
+  resolution: "leven@npm:3.1.0"
+  checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df
+  languageName: node
+  linkType: hard
+
 "levn@npm:^0.4.1":
   version: 0.4.1
   resolution: "levn@npm:0.4.1"
@@ -5027,6 +5792,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"make-dir@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "make-dir@npm:4.0.0"
+  dependencies:
+    semver: "npm:^7.5.3"
+  checksum: 10c0/69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68
+  languageName: node
+  linkType: hard
+
 "make-fetch-happen@npm:^14.0.3":
   version: 14.0.3
   resolution: "make-fetch-happen@npm:14.0.3"
@@ -5046,6 +5820,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"makeerror@npm:1.0.12":
+  version: 1.0.12
+  resolution: "makeerror@npm:1.0.12"
+  dependencies:
+    tmpl: "npm:1.0.5"
+  checksum: 10c0/b0e6e599780ce6bab49cc413eba822f7d1f0dfebd1c103eaa3785c59e43e22c59018323cf9e1708f0ef5329e94a745d163fcbb6bff8e4c6742f9be9e86f3500c
+  languageName: node
+  linkType: hard
+
 "markdown-table@npm:^3.0.3":
   version: 3.0.4
   resolution: "markdown-table@npm:3.0.4"
@@ -5096,6 +5879,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"merge-stream@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "merge-stream@npm:2.0.0"
+  checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5
+  languageName: node
+  linkType: hard
+
 "merge2@npm:^1.3.0, merge2@npm:^1.4.1":
   version: 1.4.1
   resolution: "merge2@npm:1.4.1"
@@ -5339,7 +6129,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"micromatch@npm:^4.0.7, micromatch@npm:^4.0.8":
+"micromatch@npm:^4.0.4, micromatch@npm:^4.0.7, micromatch@npm:^4.0.8":
   version: 4.0.8
   resolution: "micromatch@npm:4.0.8"
   dependencies:
@@ -5349,6 +6139,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"mimic-fn@npm:^2.1.0":
+  version: 2.1.0
+  resolution: "mimic-fn@npm:2.1.0"
+  checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4
+  languageName: node
+  linkType: hard
+
 "minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2":
   version: 3.1.2
   resolution: "minimatch@npm:3.1.2"
@@ -5468,21 +6265,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"mock-property@npm:^1.1.0":
-  version: 1.1.0
-  resolution: "mock-property@npm:1.1.0"
-  dependencies:
-    define-data-property: "npm:^1.1.4"
-    functions-have-names: "npm:^1.2.3"
-    gopd: "npm:^1.0.1"
-    has-property-descriptors: "npm:^1.0.2"
-    hasown: "npm:^2.0.2"
-    isarray: "npm:^2.0.5"
-    object-inspect: "npm:^1.13.2"
-  checksum: 10c0/b2ae21d37a64d07caf7777ec1cccebfd4043b6e27c2095aa733e03be68c1a7ac32d33fe8be433d0ae39c41a06531cd569d22029be0f401f4ffe91beb495be8ee
-  languageName: node
-  linkType: hard
-
 "mri@npm:^1.2.0":
   version: 1.2.0
   resolution: "mri@npm:1.2.0"
@@ -5571,6 +6353,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"node-int64@npm:^0.4.0":
+  version: 0.4.0
+  resolution: "node-int64@npm:0.4.0"
+  checksum: 10c0/a6a4d8369e2f2720e9c645255ffde909c0fbd41c92ea92a5607fc17055955daac99c1ff589d421eee12a0d24e99f7bfc2aabfeb1a4c14742f6c099a51863f31a
+  languageName: node
+  linkType: hard
+
 "node-releases@npm:^2.0.19":
   version: 2.0.19
   resolution: "node-releases@npm:2.0.19"
@@ -5624,48 +6413,19 @@ __metadata:
   languageName: node
   linkType: hard
 
-"object-assign@npm:^4.1.1":
-  version: 4.1.1
-  resolution: "object-assign@npm:4.1.1"
-  checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414
-  languageName: node
-  linkType: hard
-
-"object-inspect@npm:^1.13.2, object-inspect@npm:^1.13.3":
-  version: 1.13.4
-  resolution: "object-inspect@npm:1.13.4"
-  checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692
-  languageName: node
-  linkType: hard
-
-"object-is@npm:^1.1.5, object-is@npm:^1.1.6":
-  version: 1.1.6
-  resolution: "object-is@npm:1.1.6"
+"npm-run-path@npm:^4.0.1":
+  version: 4.0.1
+  resolution: "npm-run-path@npm:4.0.1"
   dependencies:
-    call-bind: "npm:^1.0.7"
-    define-properties: "npm:^1.2.1"
-  checksum: 10c0/506af444c4dce7f8e31f34fc549e2fb8152d6b9c4a30c6e62852badd7f520b579c679af433e7a072f9d78eb7808d230dc12e1cf58da9154dfbf8813099ea0fe0
-  languageName: node
-  linkType: hard
-
-"object-keys@npm:^1.1.1":
-  version: 1.1.1
-  resolution: "object-keys@npm:1.1.1"
-  checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d
+    path-key: "npm:^3.0.0"
+  checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac
   languageName: node
   linkType: hard
 
-"object.assign@npm:^4.1.4, object.assign@npm:^4.1.5, object.assign@npm:^4.1.7":
-  version: 4.1.7
-  resolution: "object.assign@npm:4.1.7"
-  dependencies:
-    call-bind: "npm:^1.0.8"
-    call-bound: "npm:^1.0.3"
-    define-properties: "npm:^1.2.1"
-    es-object-atoms: "npm:^1.0.0"
-    has-symbols: "npm:^1.1.0"
-    object-keys: "npm:^1.1.1"
-  checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc
+"object-assign@npm:^4.1.1":
+  version: 4.1.1
+  resolution: "object-assign@npm:4.1.1"
+  checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414
   languageName: node
   linkType: hard
 
@@ -5678,6 +6438,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"onetime@npm:^5.1.2":
+  version: 5.1.2
+  resolution: "onetime@npm:5.1.2"
+  dependencies:
+    mimic-fn: "npm:^2.1.0"
+  checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f
+  languageName: node
+  linkType: hard
+
 "optionator@npm:^0.9.3":
   version: 0.9.4
   resolution: "optionator@npm:0.9.4"
@@ -5706,17 +6475,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"own-keys@npm:^1.0.1":
-  version: 1.0.1
-  resolution: "own-keys@npm:1.0.1"
-  dependencies:
-    get-intrinsic: "npm:^1.2.6"
-    object-keys: "npm:^1.1.1"
-    safe-push-apply: "npm:^1.0.0"
-  checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a
-  languageName: node
-  linkType: hard
-
 "p-filter@npm:^2.1.0":
   version: 2.1.0
   resolution: "p-filter@npm:2.1.0"
@@ -5735,7 +6493,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"p-limit@npm:^3.0.2":
+"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0":
   version: 3.1.0
   resolution: "p-limit@npm:3.1.0"
   dependencies:
@@ -5850,7 +6608,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"path-key@npm:^3.1.0":
+"path-key@npm:^3.0.0, path-key@npm:^3.1.0":
   version: 3.1.1
   resolution: "path-key@npm:3.1.1"
   checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c
@@ -5888,7 +6646,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1":
+"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1":
   version: 2.3.1
   resolution: "picomatch@npm:2.3.1"
   checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be
@@ -5918,7 +6676,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"pirates@npm:^4.0.6":
+"pirates@npm:^4.0.4, pirates@npm:^4.0.6":
   version: 4.0.7
   resolution: "pirates@npm:4.0.7"
   checksum: 10c0/a51f108dd811beb779d58a76864bbd49e239fa40c7984cd11596c75a121a8cc789f1c8971d8bb15f0dbf9d48b76c05bb62fcbce840f89b688c0fa64b37e8478a
@@ -5934,10 +6692,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"possible-typed-array-names@npm:^1.0.0":
-  version: 1.1.0
-  resolution: "possible-typed-array-names@npm:1.1.0"
-  checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196
+"pkg-dir@npm:^4.2.0":
+  version: 4.2.0
+  resolution: "pkg-dir@npm:4.2.0"
+  dependencies:
+    find-up: "npm:^4.0.0"
+  checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728
   languageName: node
   linkType: hard
 
@@ -6074,7 +6834,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"pretty-format@npm:^29.7.0":
+"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0":
   version: 29.7.0
   resolution: "pretty-format@npm:29.7.0"
   dependencies:
@@ -6102,6 +6862,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"prompts@npm:^2.0.1":
+  version: 2.4.2
+  resolution: "prompts@npm:2.4.2"
+  dependencies:
+    kleur: "npm:^3.0.3"
+    sisteransi: "npm:^1.0.5"
+  checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4
+  languageName: node
+  linkType: hard
+
 "pug-error@npm:^2.0.0":
   version: 2.1.0
   resolution: "pug-error@npm:2.1.0"
@@ -6127,6 +6897,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"pure-rand@npm:^6.0.0":
+  version: 6.1.0
+  resolution: "pure-rand@npm:6.1.0"
+  checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65
+  languageName: node
+  linkType: hard
+
 "quansync@npm:^0.2.7":
   version: 0.2.10
   resolution: "quansync@npm:0.2.10"
@@ -6192,22 +6969,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9":
-  version: 1.0.10
-  resolution: "reflect.getprototypeof@npm:1.0.10"
-  dependencies:
-    call-bind: "npm:^1.0.8"
-    define-properties: "npm:^1.2.1"
-    es-abstract: "npm:^1.23.9"
-    es-errors: "npm:^1.3.0"
-    es-object-atoms: "npm:^1.0.0"
-    get-intrinsic: "npm:^1.2.7"
-    get-proto: "npm:^1.0.1"
-    which-builtin-type: "npm:^1.2.1"
-  checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac
-  languageName: node
-  linkType: hard
-
 "regenerate-unicode-properties@npm:^10.2.0":
   version: 10.2.0
   resolution: "regenerate-unicode-properties@npm:10.2.0"
@@ -6231,20 +6992,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.3":
-  version: 1.5.4
-  resolution: "regexp.prototype.flags@npm:1.5.4"
-  dependencies:
-    call-bind: "npm:^1.0.8"
-    define-properties: "npm:^1.2.1"
-    es-errors: "npm:^1.3.0"
-    get-proto: "npm:^1.0.1"
-    gopd: "npm:^1.2.0"
-    set-function-name: "npm:^2.0.2"
-  checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77
-  languageName: node
-  linkType: hard
-
 "regexpu-core@npm:^6.2.0":
   version: 6.2.0
   resolution: "regexpu-core@npm:6.2.0"
@@ -6277,6 +7024,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"require-directory@npm:^2.1.1":
+  version: 2.1.1
+  resolution: "require-directory@npm:2.1.1"
+  checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99
+  languageName: node
+  linkType: hard
+
 "require-from-string@npm:^2.0.2":
   version: 2.0.2
   resolution: "require-from-string@npm:2.0.2"
@@ -6284,6 +7038,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"resolve-cwd@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "resolve-cwd@npm:3.0.0"
+  dependencies:
+    resolve-from: "npm:^5.0.0"
+  checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4
+  languageName: node
+  linkType: hard
+
 "resolve-from@npm:^4.0.0":
   version: 4.0.0
   resolution: "resolve-from@npm:4.0.0"
@@ -6305,7 +7068,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"resolve@npm:^1.14.2, resolve@npm:^1.22.4":
+"resolve.exports@npm:^2.0.0":
+  version: 2.0.3
+  resolution: "resolve.exports@npm:2.0.3"
+  checksum: 10c0/1ade1493f4642a6267d0a5e68faeac20b3d220f18c28b140343feb83694d8fed7a286852aef43689d16042c61e2ddb270be6578ad4a13990769e12065191200d
+  languageName: node
+  linkType: hard
+
+"resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.4":
   version: 1.22.10
   resolution: "resolve@npm:1.22.10"
   dependencies:
@@ -6318,20 +7088,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"resolve@npm:^2.0.0-next.5":
-  version: 2.0.0-next.5
-  resolution: "resolve@npm:2.0.0-next.5"
-  dependencies:
-    is-core-module: "npm:^2.13.0"
-    path-parse: "npm:^1.0.7"
-    supports-preserve-symlinks-flag: "npm:^1.0.0"
-  bin:
-    resolve: bin/resolve
-  checksum: 10c0/a6c33555e3482ea2ec4c6e3d3bf0d78128abf69dca99ae468e64f1e30acaa318fd267fb66c8836b04d558d3e2d6ed875fe388067e7d8e0de647d3c21af21c43a
-  languageName: node
-  linkType: hard
-
-"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin":
+"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin":
   version: 1.22.10
   resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d"
   dependencies:
@@ -6344,19 +7101,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin":
-  version: 2.0.0-next.5
-  resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d"
-  dependencies:
-    is-core-module: "npm:^2.13.0"
-    path-parse: "npm:^1.0.7"
-    supports-preserve-symlinks-flag: "npm:^1.0.0"
-  bin:
-    resolve: bin/resolve
-  checksum: 10c0/78ad6edb8309a2bfb720c2c1898f7907a37f858866ce11a5974643af1203a6a6e05b2fa9c53d8064a673a447b83d42569260c306d43628bff5bb101969708355
-  languageName: node
-  linkType: hard
-
 "retry@npm:^0.12.0":
   version: 0.12.0
   resolution: "retry@npm:0.12.0"
@@ -6380,40 +7124,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"safe-array-concat@npm:^1.1.3":
-  version: 1.1.3
-  resolution: "safe-array-concat@npm:1.1.3"
-  dependencies:
-    call-bind: "npm:^1.0.8"
-    call-bound: "npm:^1.0.2"
-    get-intrinsic: "npm:^1.2.6"
-    has-symbols: "npm:^1.1.0"
-    isarray: "npm:^2.0.5"
-  checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d
-  languageName: node
-  linkType: hard
-
-"safe-push-apply@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "safe-push-apply@npm:1.0.0"
-  dependencies:
-    es-errors: "npm:^1.3.0"
-    isarray: "npm:^2.0.5"
-  checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750
-  languageName: node
-  linkType: hard
-
-"safe-regex-test@npm:^1.1.0":
-  version: 1.1.0
-  resolution: "safe-regex-test@npm:1.1.0"
-  dependencies:
-    call-bound: "npm:^1.0.2"
-    es-errors: "npm:^1.3.0"
-    is-regex: "npm:^1.2.1"
-  checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665
-  languageName: node
-  linkType: hard
-
 "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.2":
   version: 2.1.2
   resolution: "safer-buffer@npm:2.1.2"
@@ -6437,7 +7147,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"semver@npm:^6.3.1":
+"semver@npm:^6.3.0, semver@npm:^6.3.1":
   version: 6.3.1
   resolution: "semver@npm:6.3.1"
   bin:
@@ -6446,7 +7156,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.6.0, semver@npm:^7.7.1":
+"semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.1":
   version: 7.7.2
   resolution: "semver@npm:7.7.2"
   bin:
@@ -6455,43 +7165,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"set-function-length@npm:^1.2.2":
-  version: 1.2.2
-  resolution: "set-function-length@npm:1.2.2"
-  dependencies:
-    define-data-property: "npm:^1.1.4"
-    es-errors: "npm:^1.3.0"
-    function-bind: "npm:^1.1.2"
-    get-intrinsic: "npm:^1.2.4"
-    gopd: "npm:^1.0.1"
-    has-property-descriptors: "npm:^1.0.2"
-  checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c
-  languageName: node
-  linkType: hard
-
-"set-function-name@npm:^2.0.2":
-  version: 2.0.2
-  resolution: "set-function-name@npm:2.0.2"
-  dependencies:
-    define-data-property: "npm:^1.1.4"
-    es-errors: "npm:^1.3.0"
-    functions-have-names: "npm:^1.2.3"
-    has-property-descriptors: "npm:^1.0.2"
-  checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316
-  languageName: node
-  linkType: hard
-
-"set-proto@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "set-proto@npm:1.0.0"
-  dependencies:
-    dunder-proto: "npm:^1.0.1"
-    es-errors: "npm:^1.3.0"
-    es-object-atoms: "npm:^1.0.0"
-  checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a
-  languageName: node
-  linkType: hard
-
 "sh-syntax@npm:^0.5.6":
   version: 0.5.7
   resolution: "sh-syntax@npm:0.5.7"
@@ -6533,51 +7206,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"side-channel-list@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "side-channel-list@npm:1.0.0"
-  dependencies:
-    es-errors: "npm:^1.3.0"
-    object-inspect: "npm:^1.13.3"
-  checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d
-  languageName: node
-  linkType: hard
-
-"side-channel-map@npm:^1.0.1":
-  version: 1.0.1
-  resolution: "side-channel-map@npm:1.0.1"
-  dependencies:
-    call-bound: "npm:^1.0.2"
-    es-errors: "npm:^1.3.0"
-    get-intrinsic: "npm:^1.2.5"
-    object-inspect: "npm:^1.13.3"
-  checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672
-  languageName: node
-  linkType: hard
-
-"side-channel-weakmap@npm:^1.0.2":
-  version: 1.0.2
-  resolution: "side-channel-weakmap@npm:1.0.2"
-  dependencies:
-    call-bound: "npm:^1.0.2"
-    es-errors: "npm:^1.3.0"
-    get-intrinsic: "npm:^1.2.5"
-    object-inspect: "npm:^1.13.3"
-    side-channel-map: "npm:^1.0.1"
-  checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185
-  languageName: node
-  linkType: hard
-
-"side-channel@npm:^1.0.4, side-channel@npm:^1.1.0":
-  version: 1.1.0
-  resolution: "side-channel@npm:1.1.0"
-  dependencies:
-    es-errors: "npm:^1.3.0"
-    object-inspect: "npm:^1.13.3"
-    side-channel-list: "npm:^1.0.0"
-    side-channel-map: "npm:^1.0.1"
-    side-channel-weakmap: "npm:^1.0.2"
-  checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6
+"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7":
+  version: 3.0.7
+  resolution: "signal-exit@npm:3.0.7"
+  checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912
   languageName: node
   linkType: hard
 
@@ -6588,6 +7220,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"sisteransi@npm:^1.0.5":
+  version: 1.0.5
+  resolution: "sisteransi@npm:1.0.5"
+  checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46
+  languageName: node
+  linkType: hard
+
 "slash@npm:^2.0.0":
   version: 2.0.0
   resolution: "slash@npm:2.0.0"
@@ -6640,6 +7279,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"source-map-support@npm:0.5.13":
+  version: 0.5.13
+  resolution: "source-map-support@npm:0.5.13"
+  dependencies:
+    buffer-from: "npm:^1.0.0"
+    source-map: "npm:^0.6.0"
+  checksum: 10c0/137539f8c453fa0f496ea42049ab5da4569f96781f6ac8e5bfda26937be9494f4e8891f523c5f98f0e85f71b35d74127a00c46f83f6a4f54672b58d53202565e
+  languageName: node
+  linkType: hard
+
 "source-map-support@npm:^0.5.16":
   version: 0.5.21
   resolution: "source-map-support@npm:0.5.21"
@@ -6704,13 +7353,22 @@ __metadata:
   languageName: node
   linkType: hard
 
-"stop-iteration-iterator@npm:^1.0.0":
-  version: 1.1.0
-  resolution: "stop-iteration-iterator@npm:1.1.0"
+"stack-utils@npm:^2.0.3":
+  version: 2.0.6
+  resolution: "stack-utils@npm:2.0.6"
   dependencies:
-    es-errors: "npm:^1.3.0"
-    internal-slot: "npm:^1.1.0"
-  checksum: 10c0/de4e45706bb4c0354a4b1122a2b8cc45a639e86206807ce0baf390ee9218d3ef181923fa4d2b67443367c491aa255c5fbaa64bb74648e3c5b48299928af86c09
+    escape-string-regexp: "npm:^2.0.0"
+  checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a
+  languageName: node
+  linkType: hard
+
+"string-length@npm:^4.0.1":
+  version: 4.0.2
+  resolution: "string-length@npm:4.0.2"
+  dependencies:
+    char-regex: "npm:^1.0.2"
+    strip-ansi: "npm:^6.0.0"
+  checksum: 10c0/1cd77409c3d7db7bc59406f6bcc9ef0783671dcbabb23597a1177c166906ef2ee7c8290f78cae73a8aec858768f189d2cb417797df5e15ec4eb5e16b3346340c
   languageName: node
   linkType: hard
 
@@ -6721,7 +7379,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0":
+"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3":
   version: 4.2.3
   resolution: "string-width@npm:4.2.3"
   dependencies:
@@ -6743,44 +7401,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"string.prototype.trim@npm:^1.2.10, string.prototype.trim@npm:^1.2.9":
-  version: 1.2.10
-  resolution: "string.prototype.trim@npm:1.2.10"
-  dependencies:
-    call-bind: "npm:^1.0.8"
-    call-bound: "npm:^1.0.2"
-    define-data-property: "npm:^1.1.4"
-    define-properties: "npm:^1.2.1"
-    es-abstract: "npm:^1.23.5"
-    es-object-atoms: "npm:^1.0.0"
-    has-property-descriptors: "npm:^1.0.2"
-  checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8
-  languageName: node
-  linkType: hard
-
-"string.prototype.trimend@npm:^1.0.9":
-  version: 1.0.9
-  resolution: "string.prototype.trimend@npm:1.0.9"
-  dependencies:
-    call-bind: "npm:^1.0.8"
-    call-bound: "npm:^1.0.2"
-    define-properties: "npm:^1.2.1"
-    es-object-atoms: "npm:^1.0.0"
-  checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6
-  languageName: node
-  linkType: hard
-
-"string.prototype.trimstart@npm:^1.0.8":
-  version: 1.0.8
-  resolution: "string.prototype.trimstart@npm:1.0.8"
-  dependencies:
-    call-bind: "npm:^1.0.7"
-    define-properties: "npm:^1.2.1"
-    es-object-atoms: "npm:^1.0.0"
-  checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366
-  languageName: node
-  linkType: hard
-
 "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1":
   version: 6.0.1
   resolution: "strip-ansi@npm:6.0.1"
@@ -6806,6 +7426,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"strip-bom@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "strip-bom@npm:4.0.0"
+  checksum: 10c0/26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef
+  languageName: node
+  linkType: hard
+
+"strip-final-newline@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "strip-final-newline@npm:2.0.0"
+  checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f
+  languageName: node
+  linkType: hard
+
 "strip-json-comments@npm:^3.1.1":
   version: 3.1.1
   resolution: "strip-json-comments@npm:3.1.1"
@@ -6838,6 +7472,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"supports-color@npm:^8.0.0":
+  version: 8.1.1
+  resolution: "supports-color@npm:8.1.1"
+  dependencies:
+    has-flag: "npm:^4.0.0"
+  checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89
+  languageName: node
+  linkType: hard
+
 "supports-preserve-symlinks-flag@npm:^1.0.0":
   version: 1.0.0
   resolution: "supports-preserve-symlinks-flag@npm:1.0.0"
@@ -6845,38 +7488,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"tape@npm:^5.9.0":
-  version: 5.9.0
-  resolution: "tape@npm:5.9.0"
-  dependencies:
-    "@ljharb/resumer": "npm:^0.1.3"
-    "@ljharb/through": "npm:^2.3.13"
-    array.prototype.every: "npm:^1.1.6"
-    call-bind: "npm:^1.0.7"
-    deep-equal: "npm:^2.2.3"
-    defined: "npm:^1.0.1"
-    dotignore: "npm:^0.1.2"
-    for-each: "npm:^0.3.3"
-    get-package-type: "npm:^0.1.0"
-    glob: "npm:^7.2.3"
-    has-dynamic-import: "npm:^2.1.0"
-    hasown: "npm:^2.0.2"
-    inherits: "npm:^2.0.4"
-    is-regex: "npm:^1.1.4"
-    minimist: "npm:^1.2.8"
-    mock-property: "npm:^1.1.0"
-    object-inspect: "npm:^1.13.2"
-    object-is: "npm:^1.1.6"
-    object-keys: "npm:^1.1.1"
-    object.assign: "npm:^4.1.5"
-    resolve: "npm:^2.0.0-next.5"
-    string.prototype.trim: "npm:^1.2.9"
-  bin:
-    tape: bin/tape
-  checksum: 10c0/06c20103eb1971be901fc230a635d079db2d5ef16a2743d3340991f7754ff8380d24a0cb23774e9e5b15f254faeed536e1e0624a0cf80d2142d09f35a61df189
-  languageName: node
-  linkType: hard
-
 "tar@npm:^7.4.3":
   version: 7.4.3
   resolution: "tar@npm:7.4.3"
@@ -6898,6 +7509,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"test-exclude@npm:^6.0.0":
+  version: 6.0.0
+  resolution: "test-exclude@npm:6.0.0"
+  dependencies:
+    "@istanbuljs/schema": "npm:^0.1.2"
+    glob: "npm:^7.1.4"
+    minimatch: "npm:^3.0.4"
+  checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57
+  languageName: node
+  linkType: hard
+
 "tiny-invariant@npm:^1.3.3":
   version: 1.3.3
   resolution: "tiny-invariant@npm:1.3.3"
@@ -6931,6 +7553,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"tmpl@npm:1.0.5":
+  version: 1.0.5
+  resolution: "tmpl@npm:1.0.5"
+  checksum: 10c0/f935537799c2d1922cb5d6d3805f594388f75338fe7a4a9dac41504dd539704ca4db45b883b52e7b0aa5b2fd5ddadb1452bf95cd23a69da2f793a843f9451cc9
+  languageName: node
+  linkType: hard
+
 "to-ast@npm:^1.0.0":
   version: 1.0.0
   resolution: "to-ast@npm:1.0.0"
@@ -7000,6 +7629,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"type-detect@npm:4.0.8":
+  version: 4.0.8
+  resolution: "type-detect@npm:4.0.8"
+  checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd
+  languageName: node
+  linkType: hard
+
+"type-fest@npm:^0.21.3":
+  version: 0.21.3
+  resolution: "type-fest@npm:0.21.3"
+  checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8
+  languageName: node
+  linkType: hard
+
 "type-fest@npm:^2.11.2":
   version: 2.19.0
   resolution: "type-fest@npm:2.19.0"
@@ -7014,59 +7657,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"typed-array-buffer@npm:^1.0.3":
-  version: 1.0.3
-  resolution: "typed-array-buffer@npm:1.0.3"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-    es-errors: "npm:^1.3.0"
-    is-typed-array: "npm:^1.1.14"
-  checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079
-  languageName: node
-  linkType: hard
-
-"typed-array-byte-length@npm:^1.0.3":
-  version: 1.0.3
-  resolution: "typed-array-byte-length@npm:1.0.3"
-  dependencies:
-    call-bind: "npm:^1.0.8"
-    for-each: "npm:^0.3.3"
-    gopd: "npm:^1.2.0"
-    has-proto: "npm:^1.2.0"
-    is-typed-array: "npm:^1.1.14"
-  checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e
-  languageName: node
-  linkType: hard
-
-"typed-array-byte-offset@npm:^1.0.4":
-  version: 1.0.4
-  resolution: "typed-array-byte-offset@npm:1.0.4"
-  dependencies:
-    available-typed-arrays: "npm:^1.0.7"
-    call-bind: "npm:^1.0.8"
-    for-each: "npm:^0.3.3"
-    gopd: "npm:^1.2.0"
-    has-proto: "npm:^1.2.0"
-    is-typed-array: "npm:^1.1.15"
-    reflect.getprototypeof: "npm:^1.0.9"
-  checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53
-  languageName: node
-  linkType: hard
-
-"typed-array-length@npm:^1.0.7":
-  version: 1.0.7
-  resolution: "typed-array-length@npm:1.0.7"
-  dependencies:
-    call-bind: "npm:^1.0.7"
-    for-each: "npm:^0.3.3"
-    gopd: "npm:^1.0.1"
-    is-typed-array: "npm:^1.1.13"
-    possible-typed-array-names: "npm:^1.0.0"
-    reflect.getprototypeof: "npm:^1.0.6"
-  checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295
-  languageName: node
-  linkType: hard
-
 "ulid@npm:^2.3.0":
   version: 2.4.0
   resolution: "ulid@npm:2.4.0"
@@ -7076,15 +7666,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"unbox-primitive@npm:^1.1.0":
-  version: 1.1.0
-  resolution: "unbox-primitive@npm:1.1.0"
-  dependencies:
-    call-bound: "npm:^1.0.3"
-    has-bigints: "npm:^1.0.2"
-    has-symbols: "npm:^1.1.0"
-    which-boxed-primitive: "npm:^1.1.1"
-  checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982
+"undici-types@npm:~6.21.0":
+  version: 6.21.0
+  resolution: "undici-types@npm:6.21.0"
+  checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04
   languageName: node
   linkType: hard
 
@@ -7237,6 +7822,26 @@ __metadata:
   languageName: node
   linkType: hard
 
+"v8-to-istanbul@npm:^9.0.1":
+  version: 9.3.0
+  resolution: "v8-to-istanbul@npm:9.3.0"
+  dependencies:
+    "@jridgewell/trace-mapping": "npm:^0.3.12"
+    "@types/istanbul-lib-coverage": "npm:^2.0.1"
+    convert-source-map: "npm:^2.0.0"
+  checksum: 10c0/968bcf1c7c88c04df1ffb463c179558a2ec17aa49e49376120504958239d9e9dad5281aa05f2a78542b8557f2be0b0b4c325710262f3b838b40d703d5ed30c23
+  languageName: node
+  linkType: hard
+
+"walker@npm:^1.0.8":
+  version: 1.0.8
+  resolution: "walker@npm:1.0.8"
+  dependencies:
+    makeerror: "npm:1.0.12"
+  checksum: 10c0/a17e037bccd3ca8a25a80cb850903facdfed0de4864bd8728f1782370715d679fa72e0a0f5da7c1c1379365159901e5935f35be531229da53bbfc0efdabdb48e
+  languageName: node
+  linkType: hard
+
 "webidl-conversions@npm:^3.0.0":
   version: 3.0.1
   resolution: "webidl-conversions@npm:3.0.1"
@@ -7254,67 +7859,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"which-boxed-primitive@npm:^1.0.2, which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1":
-  version: 1.1.1
-  resolution: "which-boxed-primitive@npm:1.1.1"
-  dependencies:
-    is-bigint: "npm:^1.1.0"
-    is-boolean-object: "npm:^1.2.1"
-    is-number-object: "npm:^1.1.1"
-    is-string: "npm:^1.1.1"
-    is-symbol: "npm:^1.1.1"
-  checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe
-  languageName: node
-  linkType: hard
-
-"which-builtin-type@npm:^1.2.1":
-  version: 1.2.1
-  resolution: "which-builtin-type@npm:1.2.1"
-  dependencies:
-    call-bound: "npm:^1.0.2"
-    function.prototype.name: "npm:^1.1.6"
-    has-tostringtag: "npm:^1.0.2"
-    is-async-function: "npm:^2.0.0"
-    is-date-object: "npm:^1.1.0"
-    is-finalizationregistry: "npm:^1.1.0"
-    is-generator-function: "npm:^1.0.10"
-    is-regex: "npm:^1.2.1"
-    is-weakref: "npm:^1.0.2"
-    isarray: "npm:^2.0.5"
-    which-boxed-primitive: "npm:^1.1.0"
-    which-collection: "npm:^1.0.2"
-    which-typed-array: "npm:^1.1.16"
-  checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471
-  languageName: node
-  linkType: hard
-
-"which-collection@npm:^1.0.1, which-collection@npm:^1.0.2":
-  version: 1.0.2
-  resolution: "which-collection@npm:1.0.2"
-  dependencies:
-    is-map: "npm:^2.0.3"
-    is-set: "npm:^2.0.3"
-    is-weakmap: "npm:^2.0.2"
-    is-weakset: "npm:^2.0.3"
-  checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2
-  languageName: node
-  linkType: hard
-
-"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18":
-  version: 1.1.19
-  resolution: "which-typed-array@npm:1.1.19"
-  dependencies:
-    available-typed-arrays: "npm:^1.0.7"
-    call-bind: "npm:^1.0.8"
-    call-bound: "npm:^1.0.4"
-    for-each: "npm:^0.3.5"
-    get-proto: "npm:^1.0.1"
-    gopd: "npm:^1.2.0"
-    has-tostringtag: "npm:^1.0.2"
-  checksum: 10c0/702b5dc878addafe6c6300c3d0af5983b175c75fcb4f2a72dfc3dd38d93cf9e89581e4b29c854b16ea37e50a7d7fca5ae42ece5c273d8060dcd603b2404bbb3f
-  languageName: node
-  linkType: hard
-
 "which@npm:^2.0.1":
   version: 2.0.2
   resolution: "which@npm:2.0.2"
@@ -7373,6 +7917,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"write-file-atomic@npm:^4.0.2":
+  version: 4.0.2
+  resolution: "write-file-atomic@npm:4.0.2"
+  dependencies:
+    imurmurhash: "npm:^0.1.4"
+    signal-exit: "npm:^3.0.7"
+  checksum: 10c0/a2c282c95ef5d8e1c27b335ae897b5eca00e85590d92a3fd69a437919b7b93ff36a69ea04145da55829d2164e724bc62202cdb5f4b208b425aba0807889375c7
+  languageName: node
+  linkType: hard
+
 "write-file-atomic@npm:^5.0.1":
   version: 5.0.1
   resolution: "write-file-atomic@npm:5.0.1"
@@ -7383,6 +7937,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"y18n@npm:^5.0.5":
+  version: 5.0.8
+  resolution: "y18n@npm:5.0.8"
+  checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249
+  languageName: node
+  linkType: hard
+
 "yallist@npm:^3.0.2":
   version: 3.1.1
   resolution: "yallist@npm:3.1.1"
@@ -7404,6 +7965,28 @@ __metadata:
   languageName: node
   linkType: hard
 
+"yargs-parser@npm:^21.1.1":
+  version: 21.1.1
+  resolution: "yargs-parser@npm:21.1.1"
+  checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2
+  languageName: node
+  linkType: hard
+
+"yargs@npm:^17.3.1":
+  version: 17.7.2
+  resolution: "yargs@npm:17.7.2"
+  dependencies:
+    cliui: "npm:^8.0.1"
+    escalade: "npm:^3.1.1"
+    get-caller-file: "npm:^2.0.5"
+    require-directory: "npm:^2.1.1"
+    string-width: "npm:^4.2.3"
+    y18n: "npm:^5.0.5"
+    yargs-parser: "npm:^21.1.1"
+  checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05
+  languageName: node
+  linkType: hard
+
 "yocto-queue@npm:^0.1.0":
   version: 0.1.0
   resolution: "yocto-queue@npm:0.1.0"