Repository: Accenture/sfmc-devtools
Pull request #1396 (2024-06-29 08:37:48)

Bump eslint from 8.57.0 to 9.6.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.57.0 to 9.6.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/eslint/eslint/releases">eslint's releases</a>.</em></p>
<blockquote>
<h2>v9.6.0</h2>
<h2>Features</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/e2b16e2b72606162dce3d804bc80186b6c5ec0f9"><code>e2b16e2</code></a> feat: Implement feature flags (<a href="https://redirect.github.com/eslint/eslint/issues/18516">#18516</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/8824aa1469ffc572c5e5c1765d1b6da113dfba19"><code>8824aa1</code></a> feat: add <code>ecmaVersion: 2025</code>, parsing duplicate named capturing groups (<a href="https://redirect.github.com/eslint/eslint/issues/18596">#18596</a>) (Milos Djermanovic)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/1613e2e586423ec7871617aec4dce5c433f0e9f0"><code>1613e2e</code></a> fix: Allow escaping characters in config patterns on Windows (<a href="https://redirect.github.com/eslint/eslint/issues/18628">#18628</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/21d3766c3f4efd981d3cc294c2c82c8014815e6e"><code>21d3766</code></a> fix: <code>no-unused-vars</code> include caught errors pattern in report message (<a href="https://redirect.github.com/eslint/eslint/issues/18609">#18609</a>) (Kirk Waiblinger)</li>
<li><a href="https://github.com/eslint/eslint/commit/d7a7736937981befc5dfd68ce512f1a6ebf93e68"><code>d7a7736</code></a> fix: improve <code>no-unused-vars</code> message on unused caught errors (<a href="https://redirect.github.com/eslint/eslint/issues/18608">#18608</a>) (Kirk Waiblinger)</li>
<li><a href="https://github.com/eslint/eslint/commit/f9e95d2d06c0a7017417a3de4929b14d1008c63c"><code>f9e95d2</code></a> fix: correct locations of invalid <code>/* eslint */</code> comments (<a href="https://redirect.github.com/eslint/eslint/issues/18593">#18593</a>) (Milos Djermanovic)</li>
</ul>
<h2>Documentation</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/13dbecdea749abf51951ce61662eec2621a4b9af"><code>13dbecd</code></a> docs: Limit search to just docs (<a href="https://redirect.github.com/eslint/eslint/issues/18627">#18627</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/375227f94da3c1c4ff6c61a29b272889fa48ca79"><code>375227f</code></a> docs: Update getting-started.md - add pnpm to init eslint config (<a href="https://redirect.github.com/eslint/eslint/issues/18599">#18599</a>) (Kostiantyn Ochenash)</li>
<li><a href="https://github.com/eslint/eslint/commit/44915bb95dfa21f946021d77b3b361e7e9b140e0"><code>44915bb</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/d50db7bcb4c19c0631ab80b120249ecf155824ce"><code>d50db7b</code></a> docs: Update vscode-eslint info (<a href="https://redirect.github.com/eslint/eslint/issues/18595">#18595</a>) (Nicholas C. Zakas)</li>
</ul>
<h2>Chores</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/b15ee302742e280e8cd019b49e7b50a4f3b88bc0"><code>b15ee30</code></a> chore: upgrade <code>@​eslint/js</code><a href="https://github.com/9"><code>@​9</code></a>.6.0 (<a href="https://redirect.github.com/eslint/eslint/issues/18632">#18632</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/d655503b1fc97acfb4e7c61b3d9b557733c189b7"><code>d655503</code></a> chore: package.json update for <code>@​eslint/js</code> release (Jenkins)</li>
<li><a href="https://github.com/eslint/eslint/commit/7c78ad9d9f896354d557f24e2d37710cf79a27bf"><code>7c78ad9</code></a> refactor: Use language.visitorKeys and check for non-JS SourceCode (<a href="https://redirect.github.com/eslint/eslint/issues/18625">#18625</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/69ff64e638c0a56628afbc271dda5c963724aca4"><code>69ff64e</code></a> refactor: Return value of applyInlineConfig() (<a href="https://redirect.github.com/eslint/eslint/issues/18623">#18623</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/d2d06f7a70d9b96b125ecf2de8951bea549db4da"><code>d2d06f7</code></a> refactor: use <code>/</code> separator when adjusting <code>ignorePatterns</code> on Windows (<a href="https://redirect.github.com/eslint/eslint/issues/18613">#18613</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/642197346bf02d277c2014144537aa21ab57dc59"><code>6421973</code></a> refactor: fix disable directives for languages with 0-based lines (<a href="https://redirect.github.com/eslint/eslint/issues/18605">#18605</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/0a135395aca72461eb8b4c6f0866290bcf59916e"><code>0a13539</code></a> refactor: Allow optional methods for languages (<a href="https://redirect.github.com/eslint/eslint/issues/18604">#18604</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/c7ddee0d089e4db7be3f1a09f1a5731dd90b81b1"><code>c7ddee0</code></a> chore: make internal-rules not being a package (<a href="https://redirect.github.com/eslint/eslint/issues/18601">#18601</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/3379164e8b0cee57caf7da34226982075ebef51a"><code>3379164</code></a> chore: remove <code>.eslintrc.js</code> (<a href="https://redirect.github.com/eslint/eslint/issues/18011">#18011</a>) (唯然)</li>
<li><a href="https://github.com/eslint/eslint/commit/d0c3a322fbcc2f70cfcd9d5010efef721245c382"><code>d0c3a32</code></a> chore: update knip (with webdriver-io plugin) (<a href="https://redirect.github.com/eslint/eslint/issues/18594">#18594</a>) (Lars Kappert)</li>
</ul>
<h2>v9.5.0</h2>
<h2>Features</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/b2d256c7356838f908c4a5762d6dc64b41bbce5d"><code>b2d256c</code></a> feat: <code>no-sparse-arrays</code> report on &quot;comma&quot; instead of the whole array (<a href="https://redirect.github.com/eslint/eslint/issues/18579">#18579</a>) (fisker Cheung)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/6880286e17375b08323512f38ea59fed440a4fb5"><code>6880286</code></a> fix: treat <code>*</code> as a universal pattern (<a href="https://redirect.github.com/eslint/eslint/issues/18586">#18586</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/7fbe211427432aba5fa972252b9b6b5cf9866624"><code>7fbe211</code></a> fix: message template for all files ignored (<a href="https://redirect.github.com/eslint/eslint/issues/18564">#18564</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/469cb363f87564bafb8e628e738e01b53f4d6911"><code>469cb36</code></a> fix: Don't lint the same file multiple times (<a href="https://redirect.github.com/eslint/eslint/issues/18552">#18552</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/5cff638c03183204d09eb0a7a8bd2e032630db17"><code>5cff638</code></a> fix: improve message for ignored files without a matching config (<a href="https://redirect.github.com/eslint/eslint/issues/18404">#18404</a>) (Francesco Trotta)</li>
</ul>
<h2>Documentation</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/455f7fd1662069e9e0f4dc912ecda72962679fbe"><code>455f7fd</code></a> docs: add section about including <code>.gitignore</code> files (<a href="https://redirect.github.com/eslint/eslint/issues/18590">#18590</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/721eafeae45b33b95addf385c23eca1e2f8017d0"><code>721eafe</code></a> docs: update info about universal <code>files</code> patterns (<a href="https://redirect.github.com/eslint/eslint/issues/18587">#18587</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/8127127386180a2882bb1b75a8fbc7ffda78dce1"><code>8127127</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/55c2a6621cc403f2fc11eb4ad762eadc70a54874"><code>55c2a66</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/eb76282e0a2db8aa10a3d5659f5f9237d9729121"><code>eb76282</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/ff6e96ec30862a4eb77a201551ec8c618335bfc2"><code>ff6e96e</code></a> docs: <code>baseConfig</code> and <code>overrideConfig</code> can be arrays (<a href="https://redirect.github.com/eslint/eslint/issues/18571">#18571</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/d2d83e045ad03f024d1679275708054d789ebe20"><code>d2d83e0</code></a> docs: Add mention of eslint-transforms to v9 migration guide (<a href="https://redirect.github.com/eslint/eslint/issues/18566">#18566</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/9ce6832578d5798b591f490a8609c87235e881c7"><code>9ce6832</code></a> docs: add callout box for unintuitive behavior (<a href="https://redirect.github.com/eslint/eslint/issues/18567">#18567</a>) (Ben McCann)</li>
<li><a href="https://github.com/eslint/eslint/commit/b8db99c575c75edc9b42e6333e1b0aa7d26d9a01"><code>b8db99c</code></a> docs: Add VS Code info to config migration guide (<a href="https://redirect.github.com/eslint/eslint/issues/18555">#18555</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/518a35c8fa9161522cbe9066d48e6c6fcd8aadf3"><code>518a35c</code></a> docs: Mention config migrator (<a href="https://redirect.github.com/eslint/eslint/issues/18561">#18561</a>) (Nicholas C. Zakas)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/eslint/eslint/blob/main/CHANGELOG.md">eslint's changelog</a>.</em></p>
<blockquote>
<p>v9.6.0 - June 28, 2024</p>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/b15ee302742e280e8cd019b49e7b50a4f3b88bc0"><code>b15ee30</code></a> chore: upgrade <code>@​eslint/js</code><a href="https://github.com/9"><code>@​9</code></a>.6.0 (<a href="https://redirect.github.com/eslint/eslint/issues/18632">#18632</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/d655503b1fc97acfb4e7c61b3d9b557733c189b7"><code>d655503</code></a> chore: package.json update for <code>@​eslint/js</code> release (Jenkins)</li>
<li><a href="https://github.com/eslint/eslint/commit/1613e2e586423ec7871617aec4dce5c433f0e9f0"><code>1613e2e</code></a> fix: Allow escaping characters in config patterns on Windows (<a href="https://redirect.github.com/eslint/eslint/issues/18628">#18628</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/13dbecdea749abf51951ce61662eec2621a4b9af"><code>13dbecd</code></a> docs: Limit search to just docs (<a href="https://redirect.github.com/eslint/eslint/issues/18627">#18627</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/7c78ad9d9f896354d557f24e2d37710cf79a27bf"><code>7c78ad9</code></a> refactor: Use language.visitorKeys and check for non-JS SourceCode (<a href="https://redirect.github.com/eslint/eslint/issues/18625">#18625</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/e2b16e2b72606162dce3d804bc80186b6c5ec0f9"><code>e2b16e2</code></a> feat: Implement feature flags (<a href="https://redirect.github.com/eslint/eslint/issues/18516">#18516</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/69ff64e638c0a56628afbc271dda5c963724aca4"><code>69ff64e</code></a> refactor: Return value of applyInlineConfig() (<a href="https://redirect.github.com/eslint/eslint/issues/18623">#18623</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/375227f94da3c1c4ff6c61a29b272889fa48ca79"><code>375227f</code></a> docs: Update getting-started.md - add pnpm to init eslint config (<a href="https://redirect.github.com/eslint/eslint/issues/18599">#18599</a>) (Kostiantyn Ochenash)</li>
<li><a href="https://github.com/eslint/eslint/commit/44915bb95dfa21f946021d77b3b361e7e9b140e0"><code>44915bb</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/d2d06f7a70d9b96b125ecf2de8951bea549db4da"><code>d2d06f7</code></a> refactor: use <code>/</code> separator when adjusting <code>ignorePatterns</code> on Windows (<a href="https://redirect.github.com/eslint/eslint/issues/18613">#18613</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/21d3766c3f4efd981d3cc294c2c82c8014815e6e"><code>21d3766</code></a> fix: <code>no-unused-vars</code> include caught errors pattern in report message (<a href="https://redirect.github.com/eslint/eslint/issues/18609">#18609</a>) (Kirk Waiblinger)</li>
<li><a href="https://github.com/eslint/eslint/commit/642197346bf02d277c2014144537aa21ab57dc59"><code>6421973</code></a> refactor: fix disable directives for languages with 0-based lines (<a href="https://redirect.github.com/eslint/eslint/issues/18605">#18605</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/d7a7736937981befc5dfd68ce512f1a6ebf93e68"><code>d7a7736</code></a> fix: improve <code>no-unused-vars</code> message on unused caught errors (<a href="https://redirect.github.com/eslint/eslint/issues/18608">#18608</a>) (Kirk Waiblinger)</li>
<li><a href="https://github.com/eslint/eslint/commit/0a135395aca72461eb8b4c6f0866290bcf59916e"><code>0a13539</code></a> refactor: Allow optional methods for languages (<a href="https://redirect.github.com/eslint/eslint/issues/18604">#18604</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/f9e95d2d06c0a7017417a3de4929b14d1008c63c"><code>f9e95d2</code></a> fix: correct locations of invalid <code>/* eslint */</code> comments (<a href="https://redirect.github.com/eslint/eslint/issues/18593">#18593</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/8824aa1469ffc572c5e5c1765d1b6da113dfba19"><code>8824aa1</code></a> feat: add <code>ecmaVersion: 2025</code>, parsing duplicate named capturing groups (<a href="https://redirect.github.com/eslint/eslint/issues/18596">#18596</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/c7ddee0d089e4db7be3f1a09f1a5731dd90b81b1"><code>c7ddee0</code></a> chore: make internal-rules not being a package (<a href="https://redirect.github.com/eslint/eslint/issues/18601">#18601</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/3379164e8b0cee57caf7da34226982075ebef51a"><code>3379164</code></a> chore: remove <code>.eslintrc.js</code> (<a href="https://redirect.github.com/eslint/eslint/issues/18011">#18011</a>) (唯然)</li>
<li><a href="https://github.com/eslint/eslint/commit/d0c3a322fbcc2f70cfcd9d5010efef721245c382"><code>d0c3a32</code></a> chore: update knip (with webdriver-io plugin) (<a href="https://redirect.github.com/eslint/eslint/issues/18594">#18594</a>) (Lars Kappert)</li>
<li><a href="https://github.com/eslint/eslint/commit/d50db7bcb4c19c0631ab80b120249ecf155824ce"><code>d50db7b</code></a> docs: Update vscode-eslint info (<a href="https://redirect.github.com/eslint/eslint/issues/18595">#18595</a>) (Nicholas C. Zakas)</li>
</ul>
<p>v9.5.0 - June 14, 2024</p>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/f588160c2f9996c9c62b787f1fe678f71740ec43"><code>f588160</code></a> chore: upgrade <code>@​eslint/js</code><a href="https://github.com/9"><code>@​9</code></a>.5.0 (<a href="https://redirect.github.com/eslint/eslint/issues/18591">#18591</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/58908415c3e9e7924d39a2ff96573f7677ddb806"><code>5890841</code></a> chore: package.json update for <code>@​eslint/js</code> release (Jenkins)</li>
<li><a href="https://github.com/eslint/eslint/commit/455f7fd1662069e9e0f4dc912ecda72962679fbe"><code>455f7fd</code></a> docs: add section about including <code>.gitignore</code> files (<a href="https://redirect.github.com/eslint/eslint/issues/18590">#18590</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/e9f4ccd8a182801e08d96d4246df10246ea82a58"><code>e9f4ccd</code></a> chore: remove unused eslint-disable directive (<a href="https://redirect.github.com/eslint/eslint/issues/18589">#18589</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/721eafeae45b33b95addf385c23eca1e2f8017d0"><code>721eafe</code></a> docs: update info about universal <code>files</code> patterns (<a href="https://redirect.github.com/eslint/eslint/issues/18587">#18587</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/4b23ffd6454cfb1a269430f5fe28e7d1c37b9d3e"><code>4b23ffd</code></a> refactor: Move JS parsing logic into JS language (<a href="https://redirect.github.com/eslint/eslint/issues/18448">#18448</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/6880286e17375b08323512f38ea59fed440a4fb5"><code>6880286</code></a> fix: treat <code>*</code> as a universal pattern (<a href="https://redirect.github.com/eslint/eslint/issues/18586">#18586</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/8127127386180a2882bb1b75a8fbc7ffda78dce1"><code>8127127</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/b2d256c7356838f908c4a5762d6dc64b41bbce5d"><code>b2d256c</code></a> feat: <code>no-sparse-arrays</code> report on &quot;comma&quot; instead of the whole array (<a href="https://redirect.github.com/eslint/eslint/issues/18579">#18579</a>) (fisker Cheung)</li>
<li><a href="https://github.com/eslint/eslint/commit/1495b93d6fac4d7b6c9efa24c46b613f47feb1d4"><code>1495b93</code></a> chore: update WebdriverIO packages (<a href="https://redirect.github.com/eslint/eslint/issues/18558">#18558</a>) (Christian Bromann)</li>
<li><a href="https://github.com/eslint/eslint/commit/cea7ede4618d789180d37ee12a57939b30a5c4ee"><code>cea7ede</code></a> chore: add website donate link instead of opencollective (<a href="https://redirect.github.com/eslint/eslint/issues/18582">#18582</a>) (Strek)</li>
<li><a href="https://github.com/eslint/eslint/commit/55c2a6621cc403f2fc11eb4ad762eadc70a54874"><code>55c2a66</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/eb76282e0a2db8aa10a3d5659f5f9237d9729121"><code>eb76282</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/ff6e96ec30862a4eb77a201551ec8c618335bfc2"><code>ff6e96e</code></a> docs: <code>baseConfig</code> and <code>overrideConfig</code> can be arrays (<a href="https://redirect.github.com/eslint/eslint/issues/18571">#18571</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/7fbe211427432aba5fa972252b9b6b5cf9866624"><code>7fbe211</code></a> fix: message template for all files ignored (<a href="https://redirect.github.com/eslint/eslint/issues/18564">#18564</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/ec948803c99ab1b001f093c7a2c412945fbb385f"><code>ec94880</code></a> chore: package.json update for eslint-config-eslint release (Jenkins)</li>
<li><a href="https://github.com/eslint/eslint/commit/d2d83e045ad03f024d1679275708054d789ebe20"><code>d2d83e0</code></a> docs: Add mention of eslint-transforms to v9 migration guide (<a href="https://redirect.github.com/eslint/eslint/issues/18566">#18566</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/69125865b058c08ded162d4395d606dd22acb77d"><code>6912586</code></a> chore: extract formatting rules into separate config (<a href="https://redirect.github.com/eslint/eslint/issues/18560">#18560</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/9ce6832578d5798b591f490a8609c87235e881c7"><code>9ce6832</code></a> docs: add callout box for unintuitive behavior (<a href="https://redirect.github.com/eslint/eslint/issues/18567">#18567</a>) (Ben McCann)</li>
<li><a href="https://github.com/eslint/eslint/commit/b8db99c575c75edc9b42e6333e1b0aa7d26d9a01"><code>b8db99c</code></a> docs: Add VS Code info to config migration guide (<a href="https://redirect.github.com/eslint/eslint/issues/18555">#18555</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/518a35c8fa9161522cbe9066d48e6c6fcd8aadf3"><code>518a35c</code></a> docs: Mention config migrator (<a href="https://redirect.github.com/eslint/eslint/issues/18561">#18561</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/469cb363f87564bafb8e628e738e01b53f4d6911"><code>469cb36</code></a> fix: Don't lint the same file multiple times (<a href="https://redirect.github.com/eslint/eslint/issues/18552">#18552</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/9738f7e9dee49a9a3a7b8bfce87eb236ede6f572"><code>9738f7e</code></a> ci: fix CLI flags for c8, raise thresholds (<a href="https://redirect.github.com/eslint/eslint/issues/18554">#18554</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/eb440fcf16bd2f62d58b7aa9bbaf546cd94e9918"><code>eb440fc</code></a> docs: specifying files with arbitrary or no extension (<a href="https://redirect.github.com/eslint/eslint/issues/18539">#18539</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/38c159e7dda812ce6dfdbf8c5b78db7cdd676c62"><code>38c159e</code></a> docs: Provide example of reading package.json for plugins meta (<a href="https://redirect.github.com/eslint/eslint/issues/18530">#18530</a>) (Nicholas C. Zakas)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/473d1bb7c3dfcf629ac048ca811f4b5eef04a692"><code>473d1bb</code></a> 9.6.0</li>
<li><a href="https://github.com/eslint/eslint/commit/f435566baf7b3eaddb7955cb1aff7648dd308a7e"><code>f435566</code></a> Build: changelog update for 9.6.0</li>
<li><a href="https://github.com/eslint/eslint/commit/b15ee302742e280e8cd019b49e7b50a4f3b88bc0"><code>b15ee30</code></a> chore: upgrade <code>@​eslint/js</code><a href="https://github.com/9"><code>@​9</code></a>.6.0 (<a href="https://redirect.github.com/eslint/eslint/issues/18632">#18632</a>)</li>
<li><a href="https://github.com/eslint/eslint/commit/d655503b1fc97acfb4e7c61b3d9b557733c189b7"><code>d655503</code></a> chore: package.json update for <code>@​eslint/js</code> release</li>
<li><a href="https://github.com/eslint/eslint/commit/1613e2e586423ec7871617aec4dce5c433f0e9f0"><code>1613e2e</code></a> fix: Allow escaping characters in config patterns on Windows (<a href="https://redirect.github.com/eslint/eslint/issues/18628">#18628</a>)</li>
<li><a href="https://github.com/eslint/eslint/commit/13dbecdea749abf51951ce61662eec2621a4b9af"><code>13dbecd</code></a> docs: Limit search to just docs (<a href="https://redirect.github.com/eslint/eslint/issues/18627">#18627</a>)</li>
<li><a href="https://github.com/eslint/eslint/commit/7c78ad9d9f896354d557f24e2d37710cf79a27bf"><code>7c78ad9</code></a> refactor: Use language.visitorKeys and check for non-JS SourceCode (<a href="https://redirect.github.com/eslint/eslint/issues/18625">#18625</a>)</li>
<li><a href="https://github.com/eslint/eslint/commit/e2b16e2b72606162dce3d804bc80186b6c5ec0f9"><code>e2b16e2</code></a> feat: Implement feature flags (<a href="https://redirect.github.com/eslint/eslint/issues/18516">#18516</a>)</li>
<li><a href="https://github.com/eslint/eslint/commit/69ff64e638c0a56628afbc271dda5c963724aca4"><code>69ff64e</code></a> refactor: Return value of applyInlineConfig() (<a href="https://redirect.github.com/eslint/eslint/issues/18623">#18623</a>)</li>
<li><a href="https://github.com/eslint/eslint/commit/375227f94da3c1c4ff6c61a29b272889fa48ca79"><code>375227f</code></a> docs: Update getting-started.md - add pnpm to init eslint config (<a href="https://redirect.github.com/eslint/eslint/issues/18599">#18599</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/eslint/eslint/compare/v8.57.0...v9.6.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=eslint&package-manager=npm_and_yarn&previous-version=8.57.0&new-version=9.6.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 92e33c29..00000000
--- a/.eslintignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/docs/**
-/node_modules/**
-/retrieve/**
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index f5cdfe6a..00000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,116 +0,0 @@
-{
-    "env": {
-        "es6": true,
-        "node": true
-    },
-    "extends": [
-        "eslint:recommended",
-        "ssjs",
-        "plugin:jsdoc/recommended",
-        "plugin:prettier/recommended",
-        "plugin:unicorn/recommended"
-    ],
-    "plugins": ["prettier"],
-    "globals": {
-        "Atomics": "readonly",
-        "SharedArrayBuffer": "readonly"
-    },
-    "parserOptions": {
-        "ecmaVersion": 2022,
-        "sourceType": "module"
-    },
-    "root": true,
-    "settings": {
-        "jsdoc": {
-            "mode": "typescript",
-            "preferredTypes": {
-                "array": "Array",
-                "array.<>": "[]",
-                "Array.<>": "[]",
-                "array<>": "[]",
-                "Array<>": "[]",
-                "Object": "object",
-                "object.<>": "Object.<>",
-                "object<>": "Object.<>",
-                "Object<>": "Object.<>",
-                "set": "Set",
-                "set.<>": "Set.<>",
-                "set<>": "Set.<>",
-                "Set<>": "Set.<>",
-                "promise": "Promise",
-                "promise.<>": "Promise.<>",
-                "promise<>": "Promise.<>",
-                "Promise<>": "Promise.<>"
-            }
-        }
-    },
-    "rules": {
-        "logical-assignment-operators": ["error", "always"],
-        "unicorn/better-regex": "off",
-        "unicorn/catch-error-name": [
-            "error",
-            {
-                "name": "ex"
-            }
-        ],
-        "unicorn/explicit-length-check": "off",
-        "unicorn/no-null": "off",
-        "unicorn/prefer-module": "off",
-        "unicorn/prevent-abbreviations": "off",
-        "unicorn/filename-case": "off",
-        "unicorn/no-array-callback-reference": "off",
-        "unicorn/no-array-reduce": "off",
-        "unicorn/no-await-expression-member": "off",
-        "unicorn/no-hex-escape": "off",
-        "unicorn/no-nested-ternary": "off",
-        "unicorn/no-static-only-class": "off",
-        "unicorn/no-unused-properties": "warn",
-        "unicorn/numeric-separators-style": "off",
-        "unicorn/prefer-array-some": "off",
-        "unicorn/prefer-set-has": "off",
-        "unicorn/prefer-spread": "off",
-        "unicorn/prefer-string-replace-all": "error",
-        "arrow-body-style": ["error", "as-needed"],
-        "curly": "error",
-        "no-console": "error",
-        "jsdoc/check-line-alignment": 2,
-        "jsdoc/require-jsdoc": [
-            "warn",
-            {
-                "require": {
-                    "FunctionDeclaration": true,
-                    "MethodDefinition": true,
-                    "ClassDeclaration": true,
-                    "ArrowFunctionExpression": false,
-                    "FunctionExpression": true
-                }
-            }
-        ],
-        "jsdoc/require-param-type": "error",
-        "jsdoc/tag-lines": ["warn", "any", { "startLines": 1 }],
-        "jsdoc/no-undefined-types": "error",
-        "valid-jsdoc": "off",
-        "spaced-comment": ["warn", "always", { "block": { "exceptions": ["*"], "balanced": true } }]
-    },
-    "overrides": [
-        {
-            "files": ["*.js"],
-            "rules": {
-                "no-var": "error",
-                "prefer-const": "error",
-                "prettier/prettier": "warn",
-                "prefer-arrow-callback": "warn"
-            }
-        },
-        {
-            "files": ["test/*.js"],
-
-            "extends": ["plugin:mocha/recommended"],
-            "plugins": ["mocha"],
-            "rules": {
-                "mocha/no-mocha-arrows": "off",
-                "mocha/no-pending-tests": "off"
-            }
-        }
-    ]
-}
diff --git a/@types/lib/metadataTypes/Journey.d.ts b/@types/lib/metadataTypes/Journey.d.ts
index e93038a1..1482861c 100644
--- a/@types/lib/metadataTypes/Journey.d.ts
+++ b/@types/lib/metadataTypes/Journey.d.ts
@@ -363,12 +363,7 @@ declare namespace Journey {
                 isUpdateable: boolean;
                 retrieving: boolean;
                 template: boolean;
-            }; /**
-             * Delete a metadata item from the specified business unit
-             *
-             * @param {string} key Identifier of item
-             * @returns {Promise.<boolean>} deletion success status
-             */
+            };
             'triggers[].configurationArguments.relatedObjectFilterCriteria': {
                 isCreateable: boolean;
                 isUpdateable: boolean;
@@ -458,7 +453,14 @@ declare namespace Journey {
                 isUpdateable: boolean;
                 retrieving: boolean;
                 template: boolean;
-            };
+            }; /**
+             * Deploys metadata - merely kept here to be able to print {@link Util.logBeta} once per deploy
+             *
+             * @param {MetadataTypeMap} metadata metadata mapped by their keyField
+             * @param {string} deployDir directory where deploy metadata are saved
+             * @param {string} retrieveDir directory where metadata after deploy should be saved
+             * @returns {Promise.<MetadataTypeMap>} Promise of keyField => metadata map
+             */
             'triggers[].metaData': {
                 isCreateable: boolean;
                 isUpdateable: boolean;
@@ -531,7 +533,11 @@ declare namespace Journey {
             r__folder_Path: {
                 isCreateable: boolean;
                 isUpdateable: boolean;
-                retrieving: boolean;
+                retrieving: boolean; /**
+                 * helper for Journey's {@link Journey.saveResults}. Gets executed after retreive of metadata type and
+                 *
+                 * @param {MetadataTypeMap} metadataMap key=customer key, value=metadata
+                 */
                 template: boolean;
             };
         };
diff --git a/@types/lib/metadataTypes/Journey.d.ts.map b/@types/lib/metadataTypes/Journey.d.ts.map
index ab961a9d..86a926ef 100644
--- a/@types/lib/metadataTypes/Journey.d.ts.map
+++ b/@types/lib/metadataTypes/Journey.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"Journey.d.ts","sourceRoot":"","sources":["../../../lib/metadataTypes/Journey.js"],"names":[],"mappings":";uBAUa,OAAO,wBAAwB,EAAE,QAAQ;0BACzC,OAAO,wBAAwB,EAAE,WAAW;8BAC5C,OAAO,wBAAwB,EAAE,eAAe;+BAChD,OAAO,wBAAwB,EAAE,gBAAgB;mCACjD,OAAO,wBAAwB,EAAE,oBAAoB;kCACrD,OAAO,wBAAwB,EAAE,mBAAmB;8BACpD,OAAO,wBAAwB,EAAE,eAAe;iCAChD,OAAO,wBAAwB,EAAE,kBAAkB;gCACnD,OAAO,wBAAwB,EAAE,iBAAiB;0BAClD,OAAO,wBAAwB,EAAE,WAAW;AAVzD;;;;;;;;;;;GAWG;AAEH;;;;;;;;GAQG;AACH;IACI;;;;;;;;OAQG;IACH,6BANW,MAAM,MACN,IAAI,GAAG,MAAM,EAAE,OACf,IAAI,GAAG,MAAM,EAAE,QACf,MAAM,GACJ,QAAS,kBAAkB,CAAC,CAiIxC;IA6ED;;;;;OAKG;IACH,wBAHW,gBAAgB,gBAS1B;IAED;;;;;OAKG;IACH,wBAHW,gBAAgB,gBAK1B;IAkBD;;;;OAIG;IACH,2CAFW,eAAe,iBAmBzB;IAED;;;;;;OAMG;IACH,mCAHW,gBAAgB,GACd,gBAAgB,CA2J5B;IACD;;;;;OAKG;IACH,6CAiVC;IAED;;;;;;OAMG;IACH,gCAHW,gBAAgB,GACd,QAAS,gBAAgB,CAAC,CAiHtC;IAED;;;;;OAKG;IACH,0CAkLC;IAoDD;;;;OAIG;IACH,gCAHW,gBAAgB,GACd,QAAS,gBAAgB,CAAC,CAqHtC;CACJ;;;;;;;;;;;;;;;;;;sBA5uCG;;;;;;;;WAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAiIH;;;;;eAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA5KkB,mBAAmB"}
\ No newline at end of file
+{"version":3,"file":"Journey.d.ts","sourceRoot":"","sources":["../../../lib/metadataTypes/Journey.js"],"names":[],"mappings":";uBAUa,OAAO,wBAAwB,EAAE,QAAQ;0BACzC,OAAO,wBAAwB,EAAE,WAAW;8BAC5C,OAAO,wBAAwB,EAAE,eAAe;+BAChD,OAAO,wBAAwB,EAAE,gBAAgB;mCACjD,OAAO,wBAAwB,EAAE,oBAAoB;kCACrD,OAAO,wBAAwB,EAAE,mBAAmB;8BACpD,OAAO,wBAAwB,EAAE,eAAe;iCAChD,OAAO,wBAAwB,EAAE,kBAAkB;gCACnD,OAAO,wBAAwB,EAAE,iBAAiB;0BAClD,OAAO,wBAAwB,EAAE,WAAW;AAVzD;;;;;;;;;;;GAWG;AAEH;;;;;;;;GAQG;AACH;IACI;;;;;;;;OAQG;IACH,6BANW,MAAM,MACN,IAAI,GAAG,MAAM,EAAE,OACf,IAAI,GAAG,MAAM,EAAE,QACf,MAAM,GACJ,QAAS,kBAAkB,CAAC,CA8HxC;IA6ED;;;;;OAKG;IACH,wBAHW,gBAAgB,gBAS1B;IAED;;;;;OAKG;IACH,wBAHW,gBAAgB,gBAK1B;IAkBD;;;;OAIG;IACH,2CAFW,eAAe,iBAmBzB;IAED;;;;;;OAMG;IACH,mCAHW,gBAAgB,GACd,gBAAgB,CA2J5B;IACD;;;;;OAKG;IACH,6CAiVC;IAED;;;;;;OAMG;IACH,gCAHW,gBAAgB,GACd,QAAS,gBAAgB,CAAC,CAiHtC;IAED;;;;;OAKG;IACH,0CAkLC;IAoDD;;;;OAIG;IACH,gCAHW,gBAAgB,GACd,QAAS,gBAAgB,CAAC,CAqHtC;CACJ;;;;;;;;;;;;;;;;;;sBAzuCG;;;;;;;;WAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA6LH;;;;;;;eAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCA8CH;;;;mBAIG;;;;;;yBA5RkB,mBAAmB"}
\ No newline at end of file
diff --git a/@types/lib/util/init.config.d.ts b/@types/lib/util/init.config.d.ts
index 7f3fb8bf..91d35b78 100644
--- a/@types/lib/util/init.config.d.ts
+++ b/@types/lib/util/init.config.d.ts
@@ -44,18 +44,34 @@ declare namespace Init {
      * returns list of files that need to be updated
      *
      * @param {string} projectVersion version found in config file of the current project
-     * @returns {Promise.<string[]>} relevant files with path that need to be updated
+     * @returns {Promise.<{updates:string[],deletes:string[]}>} relevant files with path that need to be updated
      */
-    function _getForcedUpdateList(projectVersion: string): Promise<string[]>;
+    function _getForcedUpdateList(projectVersion: string): Promise<{
+        updates: string[];
+        deletes: string[];
+    }>;
     /**
      * handles creation/update of one config file from the boilerplate at a time
      *
      * @param {string[]} fileNameArr 0: path, 1: filename, 2: extension with dot
-     * @param {string[]} relevantForcedUpdates if fileNameArr is in this list we require an override
+     * @param {{updates:string[],deletes:string[]}} relevantForced if fileNameArr is in this list we require an override
      * @param {string} [boilerplateFileContent] in case we cannot copy files 1:1 this can be used to pass in content
      * @returns {Promise.<boolean>} install successful or error occured
      */
-    function _createIdeConfigFile(fileNameArr: string[], relevantForcedUpdates: string[], boilerplateFileContent?: string): Promise<boolean>;
+    function _createIdeConfigFile(fileNameArr: string[], relevantForced: {
+        updates: string[];
+        deletes: string[];
+    }, boilerplateFileContent?: string): Promise<boolean>;
+    /**
+     * handles deletion of no longer needed config files
+     *
+     * @param {{updates:string[],deletes:string[]}} relevantForced if file is in .deletes, we require deleting/renaming it
+     * @returns {Promise.<boolean>} deletion successful or error occured
+     */
+    function _removeIdeConfigFiles(relevantForced: {
+        updates: string[];
+        deletes: string[];
+    }): Promise<boolean>;
     /**
      * helper method for this.upgradeProject that upgrades project config if needed
      *
diff --git a/@types/lib/util/init.config.d.ts.map b/@types/lib/util/init.config.d.ts.map
index 56ffad97..9d8e6ce2 100644
--- a/@types/lib/util/init.config.d.ts.map
+++ b/@types/lib/util/init.config.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"init.config.d.ts","sourceRoot":"","sources":["../../../lib/util/init.config.js"],"names":[],"mappings":";yBAaa,OAAO,wBAAwB,EAAE,UAAU;uBAC3C,OAAO,wBAAwB,EAAE,QAAQ;oBACzC,OAAO,wBAAwB,EAAE,KAAK;0BACtC,OAAO,wBAAwB,EAAE,WAAW;8BAC5C,OAAO,wBAAwB,EAAE,eAAe;2BAChD,OAAO,wBAAwB,EAAE,YAAY;sBAC7C,OAAO,wBAAwB,EAAE,OAAO;+BACxC,OAAO,wBAAwB,EAAE,gBAAgB;mCACjD,OAAO,wBAAwB,EAAE,oBAAoB;kCACrD,OAAO,wBAAwB,EAAE,mBAAmB;8BACpD,OAAO,wBAAwB,EAAE,eAAe;iCAChD,OAAO,wBAAwB,EAAE,kBAAkB;oCACnD,OAAO,wBAAwB,EAAE,qBAAqB;mCACtD,OAAO,wBAAwB,EAAE,oBAAoB;gCACrD,OAAO,wBAAwB,EAAE,iBAAiB;0BAClD,OAAO,wBAAwB,EAAE,WAAW;2BAC5C,OAAO,wBAAwB,EAAE,YAAY;;IAQtD;;;;;OAKG;IACH,gGA0LC;IAED;;;;;OAKG;IACH,8EA+DC;IACD;;;;;;;OAOG;IACH,yFAgBC;IACD;;;;;OAKG;IACH,yEAsBC;IACD;;;;;;;OAOG;IACH,yIAiEC;IACD;;;;OAIG;IACH,6CAuBC"}
\ No newline at end of file
+{"version":3,"file":"init.config.d.ts","sourceRoot":"","sources":["../../../lib/util/init.config.js"],"names":[],"mappings":";yBAaa,OAAO,wBAAwB,EAAE,UAAU;uBAC3C,OAAO,wBAAwB,EAAE,QAAQ;oBACzC,OAAO,wBAAwB,EAAE,KAAK;0BACtC,OAAO,wBAAwB,EAAE,WAAW;8BAC5C,OAAO,wBAAwB,EAAE,eAAe;2BAChD,OAAO,wBAAwB,EAAE,YAAY;sBAC7C,OAAO,wBAAwB,EAAE,OAAO;+BACxC,OAAO,wBAAwB,EAAE,gBAAgB;mCACjD,OAAO,wBAAwB,EAAE,oBAAoB;kCACrD,OAAO,wBAAwB,EAAE,mBAAmB;8BACpD,OAAO,wBAAwB,EAAE,eAAe;iCAChD,OAAO,wBAAwB,EAAE,kBAAkB;oCACnD,OAAO,wBAAwB,EAAE,qBAAqB;mCACtD,OAAO,wBAAwB,EAAE,oBAAoB;gCACrD,OAAO,wBAAwB,EAAE,iBAAiB;0BAClD,OAAO,wBAAwB,EAAE,WAAW;2BAC5C,OAAO,wBAAwB,EAAE,YAAY;;IAQtD;;;;;OAKG;IACH,gGA0LC;IAED;;;;;OAKG;IACH,8EAiEC;IACD;;;;;;;OAOG;IACH,yFAgBC;IACD;;;;;OAKG;IACH;;;OA6BC;IACD;;;;;;;OAOG;IACH;;;0DAoFC;IACD;;;;;OAKG;IACH;;;yBAYC;IACD;;;;OAIG;IACH,6CAuBC"}
\ No newline at end of file
diff --git a/@types/lib/util/init.npm.d.ts.map b/@types/lib/util/init.npm.d.ts.map
index 5c8f1df4..884df83c 100644
--- a/@types/lib/util/init.npm.d.ts.map
+++ b/@types/lib/util/init.npm.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"init.npm.d.ts","sourceRoot":"","sources":["../../../lib/util/init.npm.js"],"names":[],"mappings":";;IAcI;;;;;;;OAOG;IACH,kEAsGC;IACD;;;;;OAKG;IACH;;;;OAwBC"}
\ No newline at end of file
+{"version":3,"file":"init.npm.d.ts","sourceRoot":"","sources":["../../../lib/util/init.npm.js"],"names":[],"mappings":";;IAcI;;;;;;;OAOG;IACH,kEA0GC;IACD;;;;;OAKG;IACH;;;;OA4BC"}
\ No newline at end of file
diff --git a/boilerplate/files/.eslintignore b/boilerplate/files/.eslintignore
deleted file mode 100644
index 8cf62d16..00000000
--- a/boilerplate/files/.eslintignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/deploy/**
-/docs/**
-/logs/**
-/node_modules/**
-/template/**
diff --git a/boilerplate/files/.eslintrc b/boilerplate/files/.eslintrc
deleted file mode 100644
index 859cae9a..00000000
--- a/boilerplate/files/.eslintrc
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-    "extends": ["eslint:recommended", "prettier", "ssjs"],
-    "plugins": ["jsdoc", "prettier"],
-    "rules": {
-        "padded-blocks": "off",
-        "prefer-rest-params": "off",
-        "prefer-spread": "off",
-        "require-jsdoc": [
-            "warn",
-            {
-                "require": {
-                    "FunctionDeclaration": true,
-                    "MethodDefinition": true,
-                    "ClassDeclaration": true,
-                    "ArrowFunctionExpression": false,
-                    "FunctionExpression": true
-                }
-            }
-        ],
-        "valid-jsdoc": "warn",
-        "spaced-comment": ["warn", "always", { "block": { "exceptions": ["*"], "balanced": true } }]
-    },
-    "overrides": [
-        {
-            "files": ["*.js"],
-            "env": { "es6": true },
-            "parserOptions": {
-                "ecmaVersion": 2018
-            },
-            "rules": {
-                "no-var": "error",
-                "prefer-const": "error",
-                "prettier/prettier": "warn"
-            }
-        }
-    ]
-}
diff --git a/boilerplate/files/eslint.config.js b/boilerplate/files/eslint.config.js
new file mode 100644
index 00000000..375381b0
--- /dev/null
+++ b/boilerplate/files/eslint.config.js
@@ -0,0 +1,82 @@
+import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
+import jsdoc from 'eslint-plugin-jsdoc';
+import js from '@eslint/js';
+import sfmcSsjs from 'eslint-config-ssjs';
+import globals from 'globals';
+
+export default [
+    {
+        ignores: ['deploy/**/*', 'docs/**/*', 'logs/**/*', 'node_modules/**/*', 'template/**/*']
+    },
+    js.configs['recommended'],
+    eslintPluginPrettierRecommended,
+    jsdoc.configs['flat/recommended'],
+    {
+        plugins: { jsdoc },
+        rules: {
+            'padded-blocks': 'off',
+            'prefer-rest-params': 'off',
+            'prefer-spread': 'off',
+
+            'jsdoc/require-jsdoc': [
+                'warn',
+                {
+                    require: {
+                        FunctionDeclaration: true,
+                        MethodDefinition: true,
+                        ClassDeclaration: true,
+                        ArrowFunctionExpression: false,
+                        FunctionExpression: true
+                    }
+                }
+            ],
+
+            'valid-jsdoc': 'off',
+
+            'spaced-comment': [
+                'warn',
+                'always',
+                {
+                    block: {
+                        exceptions: ['*'],
+                        balanced: true
+                    }
+                }
+            ]
+        }
+    },
+    {
+        ...sfmcSsjs.configs.recommended,
+        files: ['**/*.ssjs']
+    },
+    {
+        files: ['**/*.js'],
+
+        languageOptions: {
+            globals: {
+                ...globals.browser
+            },
+            ecmaVersion: 2022
+        },
+
+        rules: {
+            'no-var': 'error',
+            'prefer-const': 'error',
+            'prettier/prettier': 'warn'
+        }
+    },
+    {
+        files: ['eslint.config.js'],
+
+        languageOptions: {
+            globals: { ...globals.node },
+            ecmaVersion: 2022
+        },
+
+        rules: {
+            'no-var': 'error',
+            'prefer-const': 'error',
+            'prettier/prettier': 'warn'
+        }
+    }
+];
diff --git a/boilerplate/forcedUpdates.json b/boilerplate/forcedUpdates.json
index 602d879c..184691c3 100644
--- a/boilerplate/forcedUpdates.json
+++ b/boilerplate/forcedUpdates.json
@@ -1,4 +1,9 @@
 [
+    {
+        "version": "7.0.3",
+        "files": ["eslint.config.js"],
+        "filesRemove": [".eslintignore", ".eslintrc"]
+    },
     {
         "version": "7.0.0",
         "files": [
diff --git a/boilerplate/npm-dependencies.json b/boilerplate/npm-dependencies.json
index db6528ef..e0323672 100644
--- a/boilerplate/npm-dependencies.json
+++ b/boilerplate/npm-dependencies.json
@@ -1,9 +1,11 @@
 [
+    "@eslint/js",
     "eslint-config-prettier",
     "eslint-config-ssjs",
     "eslint-plugin-jsdoc",
     "eslint-plugin-prettier",
     "eslint",
+    "globals",
     "prettier-plugin-sql",
     "prettier",
     "sfmc-boilerplate"
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 00000000..f7290b8a
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,143 @@
+import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
+import eslintPluginUnicorn from 'eslint-plugin-unicorn';
+import globals from 'globals';
+import mochaPlugin from 'eslint-plugin-mocha';
+import jsdoc from 'eslint-plugin-jsdoc';
+import js from '@eslint/js';
+
+export default [
+    {
+        ignores: ['docs/**/*', 'node_modules/**/*', 'retrieve/**/*'],
+    },
+    js.configs.recommended,
+    eslintPluginPrettierRecommended,
+    mochaPlugin.configs.flat.recommended,
+    jsdoc.configs['flat/recommended'],
+    eslintPluginUnicorn.configs['flat/recommended'],
+    {
+        languageOptions: {
+            globals: {
+                ...globals.nodeBuiltin,
+                Atomics: 'readonly',
+                SharedArrayBuffer: 'readonly',
+            },
+
+            ecmaVersion: 2022,
+            sourceType: 'module',
+        },
+
+        settings: {
+            jsdoc: {
+                mode: 'typescript',
+
+                preferredTypes: {
+                    array: 'Array',
+                    'array.<>': '[]',
+                    'Array.<>': '[]',
+                    'array<>': '[]',
+                    'Array<>': '[]',
+                    Object: 'object',
+                    'object.<>': 'Object.<>',
+                    'object<>': 'Object.<>',
+                    'Object<>': 'Object.<>',
+                    set: 'Set',
+                    'set.<>': 'Set.<>',
+                    'set<>': 'Set.<>',
+                    'Set<>': 'Set.<>',
+                    promise: 'Promise',
+                    'promise.<>': 'Promise.<>',
+                    'promise<>': 'Promise.<>',
+                    'Promise<>': 'Promise.<>',
+                },
+            },
+        },
+
+        rules: {
+            'logical-assignment-operators': ['error', 'always'],
+            'unicorn/better-regex': 'off',
+
+            'unicorn/catch-error-name': [
+                'error',
+                {
+                    name: 'ex',
+                },
+            ],
+
+            'unicorn/explicit-length-check': 'off',
+            'unicorn/no-null': 'off',
+            'unicorn/prefer-module': 'off',
+            'unicorn/prevent-abbreviations': 'off',
+            'unicorn/filename-case': 'off',
+            'unicorn/no-array-callback-reference': 'off',
+            'unicorn/no-array-reduce': 'off',
+            'unicorn/no-await-expression-member': 'off',
+            'unicorn/no-hex-escape': 'off',
+            'unicorn/no-nested-ternary': 'off',
+            'unicorn/no-static-only-class': 'off',
+            'unicorn/no-unused-properties': 'warn',
+            'unicorn/numeric-separators-style': 'off',
+            'unicorn/prefer-array-some': 'off',
+            'unicorn/prefer-set-has': 'off',
+            'unicorn/prefer-spread': 'off',
+            'unicorn/prefer-string-replace-all': 'error',
+            'arrow-body-style': ['error', 'as-needed'],
+            curly: 'error',
+            'no-console': 'error',
+            'jsdoc/check-line-alignment': 2,
+
+            'jsdoc/require-jsdoc': [
+                'warn',
+                {
+                    require: {
+                        FunctionDeclaration: true,
+                        MethodDefinition: true,
+                        ClassDeclaration: true,
+                        ArrowFunctionExpression: false,
+                        FunctionExpression: true,
+                    },
+                },
+            ],
+
+            'jsdoc/require-param-type': 'error',
+
+            'jsdoc/tag-lines': [
+                'warn',
+                'any',
+                {
+                    startLines: 1,
+                },
+            ],
+
+            'jsdoc/no-undefined-types': 'error',
+            'valid-jsdoc': 'off',
+
+            'spaced-comment': [
+                'warn',
+                'always',
+                {
+                    block: {
+                        exceptions: ['*'],
+                        balanced: true,
+                    },
+                },
+            ],
+        },
+    },
+    {
+        files: ['**/*.js'],
+
+        rules: {
+            'no-var': 'error',
+            'prefer-const': 'error',
+            'prettier/prettier': 'warn',
+            'prefer-arrow-callback': 'warn',
+        },
+    },
+    {
+        files: ['test/*.js'],
+        rules: {
+            'mocha/no-mocha-arrows': 'off',
+            'mocha/no-pending-tests': 'off',
+        },
+    },
+];
diff --git a/lib/metadataTypes/Asset.js b/lib/metadataTypes/Asset.js
index 454c4f56..8681d822 100644
--- a/lib/metadataTypes/Asset.js
+++ b/lib/metadataTypes/Asset.js
@@ -1164,7 +1164,7 @@ class Asset extends MetadataType {
                 readDirArr = [deployDir, ...subDirArr, templateFileName];
                 const fileName = 'content' + subtypeExtension;
 
-                const fileExtArr = ['html']; // eslint-disable-line no-case-declarations
+                const fileExtArr = ['html'];
                 for (const ext of fileExtArr) {
                     if (
                         await File.pathExists(
@@ -1333,7 +1333,7 @@ class Asset extends MetadataType {
                 // metadata.content
                 subDirArr = [this.definition.type, subType];
                 readDirArr = [deployDir, ...subDirArr];
-                const fileExtArr = ['html', 'ssjs', 'amp']; // eslint-disable-line no-case-declarations
+                const fileExtArr = ['html', 'ssjs', 'amp'];
                 for (const ext of fileExtArr) {
                     if (
                         await File.pathExists(
@@ -1516,7 +1516,7 @@ class Asset extends MetadataType {
             case 'template': {
                 // template-template
                 // metadata.content
-                const fileExt = 'html'; // eslint-disable-line no-case-declarations
+                const fileExt = 'html';
                 if (metadata?.content?.length) {
                     codeArr.push({
                         subFolder: null,
diff --git a/lib/metadataTypes/Journey.js b/lib/metadataTypes/Journey.js
index 5e318d1c..8a26bf68 100644
--- a/lib/metadataTypes/Journey.js
+++ b/lib/metadataTypes/Journey.js
@@ -49,8 +49,6 @@ class Journey extends MetadataType {
         let singleKey = '';
         let mode = 'key';
         if (key) {
-            /* eslint-disable unicorn/prefer-ternary */
-
             if (key.startsWith('id:') || key.startsWith('%23')) {
                 // ! allow selecting journeys by ID because that's what users see in the URL
                 // if the key started with %23 assume an ID was copied from the URL but the user forgot to prefix it with id:
@@ -71,7 +69,6 @@ class Journey extends MetadataType {
                 // assume actual key was provided
                 singleKey = 'key:' + encodeURIComponent(key);
             }
-            /* eslint-enable unicorn/prefer-ternary */
         }
 
         try {
@@ -176,7 +173,7 @@ class Journey extends MetadataType {
     static async deleteByKey(key) {
         let version;
         let singleKey = '';
-        /* eslint-disable unicorn/prefer-ternary */
+
         if (key.startsWith('id:') || key.startsWith('%23')) {
             // ! allow selecting journeys by ID because that's what users see in the URL
             // if the key started with %23 assume an ID was copied from the URL but the user forgot to prefix it with id:
@@ -223,7 +220,7 @@ class Journey extends MetadataType {
         Util.logger.warn(
             `Deleting Journeys via this command breaks following retrieve-by-key/id requests until you've deployed/created a new draft version! You can get still get the latest available version of your journey by retrieving all interactions on this BU.`
         );
-        /* eslint-enable unicorn/prefer-ternary */
+
         return super.deleteByKeyREST(
             '/interaction/v1/interactions/' + singleKey + `?versionNumber=${version}`,
             key,
diff --git a/lib/util/init.config.js b/lib/util/init.config.js
index dbf9502c..c98616bd 100644
--- a/lib/util/init.config.js
+++ b/lib/util/init.config.js
@@ -240,7 +240,9 @@ const Init = {
         const creationLog = [];
         await File.ensureDir('deploy/');
         await File.ensureDir('src/cloudPages');
-        const relevantForcedUpdates = await this._getForcedUpdateList(versionBeforeUpgrade);
+        const relevantForced = await this._getForcedUpdateList(versionBeforeUpgrade);
+
+        await this._removeIdeConfigFiles(relevantForced);
 
         // copy in .gitignore (cant be retrieved via npm install directly)
         const gitignoreFileName = path.resolve(
@@ -253,7 +255,7 @@ const Init = {
             creationLog.push(
                 await this._createIdeConfigFile(
                     ['.' + path.sep, '', '.gitignore'],
-                    relevantForcedUpdates,
+                    relevantForced,
                     fileContent
                 )
             );
@@ -280,7 +282,7 @@ const Init = {
                         creationLog.push(
                             await this._createIdeConfigFile(
                                 [subdir + path.sep, fileArr.join('.'), ext],
-                                relevantForcedUpdates
+                                relevantForced
                             )
                         );
                     }
@@ -328,12 +330,13 @@ const Init = {
      * returns list of files that need to be updated
      *
      * @param {string} projectVersion version found in config file of the current project
-     * @returns {Promise.<string[]>} relevant files with path that need to be updated
+     * @returns {Promise.<{updates:string[],deletes:string[]}>} relevant files with path that need to be updated
      */
     async _getForcedUpdateList(projectVersion) {
         // list of files that absolutely need to get overwritten, no questions asked, when upgrading from a version lower than the given.
         let forceIdeConfigUpdate;
-        const relevantForcedUpdates = [];
+        const updates = [];
+        const deletes = [];
         if (await File.pathExists(Util.configFileName)) {
             forceIdeConfigUpdate = await File.readJSON(
                 path.resolve(__dirname, Util.boilerplateDirectory, 'forcedUpdates.json')
@@ -341,27 +344,33 @@ const Init = {
             // return all if no project version was found or only changes from "newer" versions otherwise
             for (const element of forceIdeConfigUpdate) {
                 if (!projectVersion || semver.gt(element.version, projectVersion)) {
-                    relevantForcedUpdates.push(
+                    updates.push(
                         // adapt it for local file systems
                         ...element.files.map((item) => path.normalize(item))
                     );
+                    if (element.filesRemove) {
+                        deletes.push(
+                            // adapt it for local file systems
+                            ...element.filesRemove.map((item) => path.normalize(item))
+                        );
+                    }
                 } else {
                     continue;
                 }
             }
         }
 
-        return relevantForcedUpdates;
+        return { updates, deletes };
     },
     /**
      * handles creation/update of one config file from the boilerplate at a time
      *
      * @param {string[]} fileNameArr 0: path, 1: filename, 2: extension with dot
-     * @param {string[]} relevantForcedUpdates if fileNameArr is in this list we require an override
+     * @param {{updates:string[],deletes:string[]}} relevantForced if fileNameArr is in this list we require an override
      * @param {string} [boilerplateFileContent] in case we cannot copy files 1:1 this can be used to pass in content
      * @returns {Promise.<boolean>} install successful or error occured
      */
-    async _createIdeConfigFile(fileNameArr, relevantForcedUpdates, boilerplateFileContent) {
+    async _createIdeConfigFile(fileNameArr, relevantForced, boilerplateFileContent) {
         let update = false;
         const fileName = fileNameArr.join('');
         const boilerplateFileName = path.resolve(
@@ -372,16 +381,27 @@ const Init = {
         );
         boilerplateFileContent ||= await File.readFile(boilerplateFileName, 'utf8');
 
+        let todo = null;
+
         if (await File.pathExists(fileName)) {
-            const existingFileContent = await File.readFile(fileName, 'utf8');
-            if (existingFileContent === boilerplateFileContent) {
-                Util.logger.info(`- ✔️  ${fileName} found. No update needed`);
-                return true;
+            if (relevantForced.deletes.includes(path.normalize(fileName))) {
+                Util.logger.info(
+                    `- ✋  ${fileName} found but it is required to delete it. Commencing rename instead for your convenience:`
+                );
+                todo = 'delete';
+            } else {
+                const existingFileContent = await File.readFile(fileName, 'utf8');
+                if (existingFileContent === boilerplateFileContent) {
+                    Util.logger.info(`- ✔️  ${fileName} found. No update needed`);
+                    return true;
+                }
             }
-            if (relevantForcedUpdates.includes(path.normalize(fileName))) {
+
+            if (relevantForced.updates.includes(path.normalize(fileName))) {
                 Util.logger.info(
                     `- ✋  ${fileName} found but an update is required. Commencing with override:`
                 );
+                todo = 'update';
             } else {
                 Util.logger.info(
                     `- ✋  ${fileName} found with differences to the new standard version. We recommend updating it.`
@@ -400,33 +420,60 @@ const Init = {
                         return true;
                     }
                 }
+                update = true;
             }
-            update = true;
 
             // ensure our update is not leading to data loss in case config files were not versioned correctly by the user
             await File.rename(fileName, fileName + '.BAK');
+        } else if (!relevantForced.deletes.includes(path.normalize(fileName))) {
+            todo = 'create';
         }
-        const saveStatus = await File.writeToFile(
-            fileNameArr[0],
-            fileNameArr[1],
-            fileNameArr[2].slice(1),
-            boilerplateFileContent
-        );
-
-        if (saveStatus) {
-            Util.logger.info(
-                `- ✔️  ${fileName} ${
-                    update
-                        ? `updated (we created a backup of the old file under ${fileName + '.BAK'})`
-                        : 'created'
-                }`
+        if (todo === 'create' || todo === 'update') {
+            const saveStatus = await File.writeToFile(
+                fileNameArr[0],
+                fileNameArr[1],
+                fileNameArr[2].slice(1),
+                boilerplateFileContent
             );
+
+            if (saveStatus) {
+                Util.logger.info(
+                    `- ✔️  ${fileName} ${
+                        update
+                            ? `updated (we created a backup of the old file under ${fileName + '.BAK'})`
+                            : 'created'
+                    }`
+                );
+                return true;
+            } else {
+                Util.logger.warn(`- ❌  ${fileName} ${update ? 'update' : 'creation'} failed`);
+                return false;
+            }
+        } else if (todo === 'delete') {
+            await File.rename(fileName, fileName + '.BAK');
+            Util.logger.info(`- ✔️  ${fileName} removed (renamed to ${fileName + '.BAK'})`);
             return true;
-        } else {
-            Util.logger.warn(`- ❌  ${fileName} ${update ? 'update' : 'creation'} failed`);
-            return false;
         }
     },
+    /**
+     * handles deletion of no longer needed config files
+     *
+     * @param {{updates:string[],deletes:string[]}} relevantForced if file is in .deletes, we require deleting/renaming it
+     * @returns {Promise.<boolean>} deletion successful or error occured
+     */
+    async _removeIdeConfigFiles(relevantForced) {
+        for (const fileName of relevantForced.deletes) {
+            if (await File.pathExists(fileName)) {
+                Util.logger.info(
+                    `- ✋  ${fileName} found but it is required to delete it. Commencing rename instead for your convenience:`
+                );
+
+                await File.rename(fileName, fileName + '.BAK');
+                Util.logger.info(`- ✔️  ${fileName} removed (renamed to ${fileName + '.BAK'})`);
+            }
+        }
+        return true;
+    },
     /**
      * helper method for this.upgradeProject that upgrades project config if needed
      *
diff --git a/lib/util/init.npm.js b/lib/util/init.npm.js
index e7a2a873..ac3e553d 100644
--- a/lib/util/init.npm.js
+++ b/lib/util/init.npm.js
@@ -57,6 +57,8 @@ const Init = {
                 if (fileContent) {
                     projectPackageJson = JSON.parse(fileContent);
                 }
+                // type="module" is solely required for the new flat configs of ESLint >=9
+                Util.execSync('npm', ['pkg', 'set', 'type="module"'], true);
                 Util.logger.info('✔️  package.json created');
             } catch {
                 Util.logger.error('No package.json found. Please run "npm init" manually');
@@ -105,6 +107,8 @@ const Init = {
                 !projectPackageJson.devDependencies ||
                 !projectPackageJson.devDependencies[name] ||
                 versionsDefault[name] == 'latest' ||
+                // filters out file:.. references instead of versions that would otherwise lead to an error in semver.gt()
+                !semver.valid(versionsProject[name]) ||
                 semver.gt(versionsDefault[name], versionsProject[name])
         );
         if (loadDependencies.length) {
@@ -152,6 +156,10 @@ const Init = {
         if (!currentContent.license || currentContent.license === 'ISC') {
             currentContent.license = 'UNLICENSED';
         }
+        if (!currentContent.type || currentContent.type !== 'module') {
+            // type="module" is solely required for the new flat configs of ESLint >=9
+            currentContent.type = 'module';
+        }
         return currentContent;
     },
 };
diff --git a/package-lock.json b/package-lock.json
index 664da280..c71c0c22 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -34,6 +34,7 @@
                 "mcdev": "lib/cli.js"
             },
             "devDependencies": {
+                "@eslint/js": "9.6.0",
                 "@types/mocha": "10.0.6",
                 "@types/node": "20.14.9",
                 "assert": "2.1.0",
@@ -41,14 +42,15 @@
                 "c8": "10.0.0",
                 "chai": "5.1.1",
                 "chai-files": "1.4.0",
-                "eslint": "8.57.0",
+                "eslint": "9.6.0",
                 "eslint-config-prettier": "9.1.0",
-                "eslint-config-ssjs": "1.1.11",
+                "eslint-config-ssjs": "2.0.0",
                 "eslint-plugin-jsdoc": "48.2.7",
                 "eslint-plugin-mocha": "10.4.3",
                 "eslint-plugin-prettier": "5.1.2",
                 "eslint-plugin-unicorn": "53.0.0",
                 "fast-xml-parser": "4.4.0",
+                "globals": "15.6.0",
                 "husky": "9.0.11",
                 "lint-staged": "15.2.7",
                 "mocha": "10.4.0",
@@ -333,16 +335,30 @@
                 "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
             }
         },
+        "node_modules/@eslint/config-array": {
+            "version": "0.17.0",
+            "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.0.tgz",
+            "integrity": "sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==",
+            "dev": true,
+            "dependencies": {
+                "@eslint/object-schema": "^2.1.4",
+                "debug": "^4.3.1",
+                "minimatch": "^3.1.2"
+            },
+            "engines": {
+                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+            }
+        },
         "node_modules/@eslint/eslintrc": {
-            "version": "2.1.4",
-            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
-            "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
+            "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
             "dev": true,
             "dependencies": {
                 "ajv": "^6.12.4",
                 "debug": "^4.3.2",
-                "espree": "^9.6.0",
-                "globals": "^13.19.0",
+                "espree": "^10.0.1",
+                "globals": "^14.0.0",
                 "ignore": "^5.2.0",
                 "import-fresh": "^3.2.1",
                 "js-yaml": "^4.1.0",
@@ -350,7 +366,7 @@
                 "strip-json-comments": "^3.1.1"
             },
             "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
             },
             "funding": {
                 "url": "https://opencollective.com/eslint"
@@ -372,6 +388,47 @@
                 "url": "https://github.com/sponsors/epoberezkin"
             }
         },
+        "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
+            "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
+            "dev": true,
+            "engines": {
+                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/@eslint/eslintrc/node_modules/espree": {
+            "version": "10.1.0",
+            "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz",
+            "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==",
+            "dev": true,
+            "dependencies": {
+                "acorn": "^8.12.0",
+                "acorn-jsx": "^5.3.2",
+                "eslint-visitor-keys": "^4.0.0"
+            },
+            "engines": {
+                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/@eslint/eslintrc/node_modules/globals": {
+            "version": "14.0.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+            "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=18"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
             "version": "0.4.1",
             "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -379,18 +436,28 @@
             "dev": true
         },
         "node_modules/@eslint/js": {
-            "version": "8.57.0",
-            "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
-            "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+            "version": "9.6.0",
+            "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.6.0.tgz",
+            "integrity": "sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==",
             "dev": true,
             "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+            }
+        },
+        "node_modules/@eslint/object-schema": {
+            "version": "2.1.4",
+            "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
+            "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
+            "dev": true,
+            "engines": {
+                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
             }
         },
         "node_modules/@humanwhocodes/config-array": {
             "version": "0.11.14",
             "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
             "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+            "deprecated": "Use @eslint/config-array instead",
             "dev": true,
             "dependencies": {
                 "@humanwhocodes/object-schema": "^2.0.2",
@@ -415,11 +482,25 @@
             }
         },
         "node_modules/@humanwhocodes/object-schema": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
-            "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+            "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+            "deprecated": "Use @eslint/object-schema instead",
             "dev": true
         },
+        "node_modules/@humanwhocodes/retry": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz",
+            "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==",
+            "dev": true,
+            "engines": {
+                "node": ">=18.18"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/nzakas"
+            }
+        },
         "node_modules/@isaacs/cliui": {
             "version": "8.0.2",
             "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -717,42 +798,14 @@
             "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
             "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="
         },
-        "node_modules/@typescript-eslint/parser": {
-            "version": "6.18.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.0.tgz",
-            "integrity": "sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==",
-            "dev": true,
-            "dependencies": {
-                "@typescript-eslint/scope-manager": "6.18.0",
-                "@typescript-eslint/types": "6.18.0",
-                "@typescript-eslint/typescript-estree": "6.18.0",
-                "@typescript-eslint/visitor-keys": "6.18.0",
-                "debug": "^4.3.4"
-            },
-            "engines": {
-                "node": "^16.0.0 || >=18.0.0"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/typescript-eslint"
-            },
-            "peerDependencies": {
-                "eslint": "^7.0.0 || ^8.0.0"
-            },
-            "peerDependenciesMeta": {
-                "typescript": {
-                    "optional": true
-                }
-            }
-        },
         "node_modules/@typescript-eslint/scope-manager": {
-            "version": "6.18.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.0.tgz",
-            "integrity": "sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==",
+            "version": "6.21.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
+            "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "6.18.0",
-                "@typescript-eslint/visitor-keys": "6.18.0"
+                "@typescript-eslint/types": "6.21.0",
+                "@typescript-eslint/visitor-keys": "6.21.0"
             },
             "engines": {
                 "node": "^16.0.0 || >=18.0.0"
@@ -763,9 +816,9 @@
             }
         },
         "node_modules/@typescript-eslint/types": {
-            "version": "6.18.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz",
-            "integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==",
+            "version": "6.21.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
+            "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
             "dev": true,
             "engines": {
                 "node": "^16.0.0 || >=18.0.0"
@@ -776,13 +829,13 @@
             }
         },
         "node_modules/@typescript-eslint/typescript-estree": {
-            "version": "6.18.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz",
-            "integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==",
+            "version": "6.21.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
+            "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "6.18.0",
-                "@typescript-eslint/visitor-keys": "6.18.0",
+                "@typescript-eslint/types": "6.21.0",
+                "@typescript-eslint/visitor-keys": "6.21.0",
                 "debug": "^4.3.4",
                 "globby": "^11.1.0",
                 "is-glob": "^4.0.3",
@@ -828,12 +881,12 @@
             }
         },
         "node_modules/@typescript-eslint/visitor-keys": {
-            "version": "6.18.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz",
-            "integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==",
+            "version": "6.21.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
+            "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "6.18.0",
+                "@typescript-eslint/types": "6.21.0",
                 "eslint-visitor-keys": "^3.4.1"
             },
             "engines": {
@@ -851,9 +904,9 @@
             "dev": true
         },
         "node_modules/acorn": {
-            "version": "8.11.3",
-            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
-            "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+            "version": "8.12.0",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz",
+            "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==",
             "dev": true,
             "bin": {
                 "acorn": "bin/acorn"
@@ -2313,41 +2366,37 @@
             }
         },
         "node_modules/eslint": {
-            "version": "8.57.0",
-            "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
-            "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+            "version": "9.6.0",
+            "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.6.0.tgz",
+            "integrity": "sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w==",
             "dev": true,
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.2.0",
                 "@eslint-community/regexpp": "^4.6.1",
-                "@eslint/eslintrc": "^2.1.4",
-                "@eslint/js": "8.57.0",
-                "@humanwhocodes/config-array": "^0.11.14",
+                "@eslint/config-array": "^0.17.0",
+                "@eslint/eslintrc": "^3.1.0",
+                "@eslint/js": "9.6.0",
                 "@humanwhocodes/module-importer": "^1.0.1",
+                "@humanwhocodes/retry": "^0.3.0",
                 "@nodelib/fs.walk": "^1.2.8",
-                "@ungap/structured-clone": "^1.2.0",
                 "ajv": "^6.12.4",
                 "chalk": "^4.0.0",
                 "cross-spawn": "^7.0.2",
                 "debug": "^4.3.2",
-                "doctrine": "^3.0.0",
                 "escape-string-regexp": "^4.0.0",
-                "eslint-scope": "^7.2.2",
-                "eslint-visitor-keys": "^3.4.3",
-                "espree": "^9.6.1",
-                "esquery": "^1.4.2",
+                "eslint-scope": "^8.0.1",
+                "eslint-visitor-keys": "^4.0.0",
+                "espree": "^10.1.0",
+                "esquery": "^1.5.0",
                 "esutils": "^2.0.2",
                 "fast-deep-equal": "^3.1.3",
-                "file-entry-cache": "^6.0.1",
+                "file-entry-cache": "^8.0.0",
                 "find-up": "^5.0.0",
                 "glob-parent": "^6.0.2",
-                "globals": "^13.19.0",
-                "graphemer": "^1.4.0",
                 "ignore": "^5.2.0",
                 "imurmurhash": "^0.1.4",
                 "is-glob": "^4.0.0",
                 "is-path-inside": "^3.0.3",
-                "js-yaml": "^4.1.0",
                 "json-stable-stringify-without-jsonify": "^1.0.1",
                 "levn": "^0.4.1",
                 "lodash.merge": "^4.6.2",
@@ -2361,10 +2410,10 @@
                 "eslint": "bin/eslint.js"
             },
             "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
             },
             "funding": {
-                "url": "https://opencollective.com/eslint"
+                "url": "https://eslint.org/donate"
             }
         },
         "node_modules/eslint-config-prettier": {
@@ -2380,18 +2429,18 @@
             }
         },
         "node_modules/eslint-config-ssjs": {
-            "version": "1.1.11",
-            "resolved": "https://registry.npmjs.org/eslint-config-ssjs/-/eslint-config-ssjs-1.1.11.tgz",
-            "integrity": "sha512-8C7J0TgjkwQM4j7vra9/SuqjhZa+rq6CrPzwPnPRqcrVclfOFqI6uoo3LXMnxCI/ovOoOy0KqmD++uzIXsmr5g==",
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/eslint-config-ssjs/-/eslint-config-ssjs-2.0.0.tgz",
+            "integrity": "sha512-AeJwOzxN+32mS/NNC2RnlJ8/fQUyzljNXhbDTQneE7HE8QhDrKnfVpTp4uin9vM3c/cHCeRgALu7mF+37vZjlQ==",
             "dev": true,
             "engines": {
                 "node": "^6.14.0 || ^8.10.0 || >=9.10.0"
             },
             "peerDependencies": {
-                "eslint": ">=5.4.0",
+                "eslint": ">=8.56.0",
                 "eslint-config-prettier": ">=6.11.0",
                 "eslint-plugin-prettier": ">=3.1.3",
-                "prettier": ">=2.0.5"
+                "prettier": ">=3.0.0"
             }
         },
         "node_modules/eslint-plugin-jsdoc": {
@@ -2455,6 +2504,21 @@
                 "eslint": ">=7.0.0"
             }
         },
+        "node_modules/eslint-plugin-mocha/node_modules/globals": {
+            "version": "13.24.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+            "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+            "dev": true,
+            "dependencies": {
+                "type-fest": "^0.20.2"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/eslint-plugin-prettier": {
             "version": "5.1.2",
             "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.2.tgz",
@@ -2518,86 +2582,6 @@
                 "eslint": ">=8.56.0"
             }
         },
-        "node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
-            "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
-            "dev": true,
-            "dependencies": {
-                "ajv": "^6.12.4",
-                "debug": "^4.3.2",
-                "espree": "^10.0.1",
-                "globals": "^14.0.0",
-                "ignore": "^5.2.0",
-                "import-fresh": "^3.2.1",
-                "js-yaml": "^4.1.0",
-                "minimatch": "^3.1.2",
-                "strip-json-comments": "^3.1.1"
-            },
-            "engines": {
-                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-            },
-            "funding": {
-                "url": "https://opencollective.com/eslint"
-            }
-        },
-        "node_modules/eslint-plugin-unicorn/node_modules/ajv": {
-            "version": "6.12.6",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-            "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-            "dev": true,
-            "dependencies": {
-                "fast-deep-equal": "^3.1.1",
-                "fast-json-stable-stringify": "^2.0.0",
-                "json-schema-traverse": "^0.4.1",
-                "uri-js": "^4.2.2"
-            },
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/epoberezkin"
-            }
-        },
-        "node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
-            "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
-            "dev": true,
-            "engines": {
-                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-            },
-            "funding": {
-                "url": "https://opencollective.com/eslint"
-            }
-        },
-        "node_modules/eslint-plugin-unicorn/node_modules/espree": {
-            "version": "10.0.1",
-            "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
-            "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
-            "dev": true,
-            "dependencies": {
-                "acorn": "^8.11.3",
-                "acorn-jsx": "^5.3.2",
-                "eslint-visitor-keys": "^4.0.0"
-            },
-            "engines": {
-                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-            },
-            "funding": {
-                "url": "https://opencollective.com/eslint"
-            }
-        },
-        "node_modules/eslint-plugin-unicorn/node_modules/globals": {
-            "version": "14.0.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
-            "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=18"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
         "node_modules/eslint-plugin-unicorn/node_modules/jsesc": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
@@ -2610,12 +2594,6 @@
                 "node": ">=6"
             }
         },
-        "node_modules/eslint-plugin-unicorn/node_modules/json-schema-traverse": {
-            "version": "0.4.1",
-            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-            "dev": true
-        },
         "node_modules/eslint-plugin-unicorn/node_modules/semver": {
             "version": "7.6.2",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
@@ -2699,6 +2677,51 @@
                 "url": "https://github.com/sponsors/epoberezkin"
             }
         },
+        "node_modules/eslint/node_modules/eslint-scope": {
+            "version": "8.0.1",
+            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz",
+            "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==",
+            "dev": true,
+            "dependencies": {
+                "esrecurse": "^4.3.0",
+                "estraverse": "^5.2.0"
+            },
+            "engines": {
+                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/eslint/node_modules/eslint-visitor-keys": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
+            "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
+            "dev": true,
+            "engines": {
+                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/eslint/node_modules/espree": {
+            "version": "10.1.0",
+            "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz",
+            "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==",
+            "dev": true,
+            "dependencies": {
+                "acorn": "^8.12.0",
+                "acorn-jsx": "^5.3.2",
+                "eslint-visitor-keys": "^4.0.0"
+            },
+            "engines": {
+                "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
         "node_modules/eslint/node_modules/json-schema-traverse": {
             "version": "0.4.1",
             "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -2869,9 +2892,9 @@
             "dev": true
         },
         "node_modules/fast-glob": {
-            "version": "3.3.1",
-            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
-            "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+            "version": "3.3.2",
+            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+            "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
             "dev": true,
             "dependencies": {
                 "@nodelib/fs.stat": "^2.0.2",
@@ -2945,15 +2968,15 @@
             "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="
         },
         "node_modules/file-entry-cache": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-            "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+            "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
             "dev": true,
             "dependencies": {
-                "flat-cache": "^3.0.4"
+                "flat-cache": "^4.0.0"
             },
             "engines": {
-                "node": "^10.12.0 || >=12.0.0"
+                "node": ">=16.0.0"
             }
         },
         "node_modules/fill-range": {
@@ -3051,22 +3074,22 @@
             }
         },
         "node_modules/flat-cache": {
-            "version": "3.0.4",
-            "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-            "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+            "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
             "dev": true,
             "dependencies": {
-                "flatted": "^3.1.0",
-                "rimraf": "^3.0.2"
+                "flatted": "^3.2.9",
+                "keyv": "^4.5.4"
             },
             "engines": {
-                "node": "^10.12.0 || >=12.0.0"
+                "node": ">=16"
             }
         },
         "node_modules/flatted": {
-            "version": "3.2.5",
-            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
-            "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+            "version": "3.3.1",
+            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+            "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
             "dev": true
         },
         "node_modules/fn.name": {
@@ -3280,15 +3303,16 @@
             }
         },
         "node_modules/glob": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
-            "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+            "version": "7.2.3",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+            "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dev": true,
             "dependencies": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
                 "inherits": "2",
-                "minimatch": "^3.0.4",
+                "minimatch": "^3.1.1",
                 "once": "^1.3.0",
                 "path-is-absolute": "^1.0.0"
             },
@@ -3334,15 +3358,12 @@
             }
         },
         "node_modules/globals": {
-            "version": "13.24.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
-            "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+            "version": "15.6.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-15.6.0.tgz",
+            "integrity": "sha512-UzcJi88Hw//CurUIRa9Jxb0vgOCcuD/MNjwmXp633cyaRKkCWACkoqHCtfZv43b1kqXGg/fpOa8bwgacCeXsVg==",
             "dev": true,
-            "dependencies": {
-                "type-fest": "^0.20.2"
-            },
             "engines": {
-                "node": ">=8"
+                "node": ">=18"
             },
             "funding": {
                 "url": "https://github.com/sponsors/sindresorhus"
@@ -4350,6 +4371,11 @@
                 "node": ">=12.0.0"
             }
         },
+        "node_modules/json-buffer": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+            "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+        },
         "node_modules/json-parse-better-errors": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
@@ -4406,6 +4432,14 @@
                 "jsox": "lib/cli.js"
             }
         },
+        "node_modules/keyv": {
+            "version": "4.5.4",
+            "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+            "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+            "dependencies": {
+                "json-buffer": "3.0.1"
+            }
+        },
         "node_modules/kuler": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
@@ -4521,19 +4555,6 @@
                 "url": "https://github.com/sindresorhus/got?sponsor=1"
             }
         },
-        "node_modules/latest-version/node_modules/json-buffer": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
-            "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
-        },
-        "node_modules/latest-version/node_modules/keyv": {
-            "version": "4.5.2",
-            "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
-            "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
-            "dependencies": {
-                "json-buffer": "3.0.1"
-            }
-        },
         "node_modules/latest-version/node_modules/lowercase-keys": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
@@ -5917,7 +5938,7 @@
         "node_modules/path-is-absolute": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-            "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+            "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
             "dev": true,
             "engines": {
                 "node": ">=0.10.0"
@@ -6090,6 +6111,184 @@
                 }
             }
         },
+        "node_modules/prettier-eslint/node_modules/@eslint/eslintrc": {
+            "version": "2.1.4",
+            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+            "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+            "dev": true,
+            "dependencies": {
+                "ajv": "^6.12.4",
+                "debug": "^4.3.2",
+                "espree": "^9.6.0",
+                "globals": "^13.19.0",
+                "ignore": "^5.2.0",
+                "import-fresh": "^3.2.1",
+                "js-yaml": "^4.1.0",
+                "minimatch": "^3.1.2",
+                "strip-json-comments": "^3.1.1"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/prettier-eslint/node_modules/@eslint/js": {
+            "version": "8.57.0",
+            "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+            "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+            "dev": true,
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            }
+        },
+        "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": {
+            "version": "6.21.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
+            "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
+            "dev": true,
+            "dependencies": {
+                "@typescript-eslint/scope-manager": "6.21.0",
+                "@typescript-eslint/types": "6.21.0",
+                "@typescript-eslint/typescript-estree": "6.21.0",
+                "@typescript-eslint/visitor-keys": "6.21.0",
+                "debug": "^4.3.4"
+            },
+            "engines": {
+                "node": "^16.0.0 || >=18.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            },
+            "peerDependencies": {
+                "eslint": "^7.0.0 || ^8.0.0"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/prettier-eslint/node_modules/ajv": {
+            "version": "6.12.6",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+            "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+            "dev": true,
+            "dependencies": {
+                "fast-deep-equal": "^3.1.1",
+                "fast-json-stable-stringify": "^2.0.0",
+                "json-schema-traverse": "^0.4.1",
+                "uri-js": "^4.2.2"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/epoberezkin"
+            }
+        },
+        "node_modules/prettier-eslint/node_modules/eslint": {
+            "version": "8.57.0",
+            "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+            "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+            "dev": true,
+            "dependencies": {
+                "@eslint-community/eslint-utils": "^4.2.0",
+                "@eslint-community/regexpp": "^4.6.1",
+                "@eslint/eslintrc": "^2.1.4",
+                "@eslint/js": "8.57.0",
+                "@humanwhocodes/config-array": "^0.11.14",
+                "@humanwhocodes/module-importer": "^1.0.1",
+                "@nodelib/fs.walk": "^1.2.8",
+                "@ungap/structured-clone": "^1.2.0",
+                "ajv": "^6.12.4",
+                "chalk": "^4.0.0",
+                "cross-spawn": "^7.0.2",
+                "debug": "^4.3.2",
+                "doctrine": "^3.0.0",
+                "escape-string-regexp": "^4.0.0",
+                "eslint-scope": "^7.2.2",
+                "eslint-visitor-keys": "^3.4.3",
+                "espree": "^9.6.1",
+                "esquery": "^1.4.2",
+                "esutils": "^2.0.2",
+                "fast-deep-equal": "^3.1.3",
+                "file-entry-cache": "^6.0.1",
+                "find-up": "^5.0.0",
+                "glob-parent": "^6.0.2",
+                "globals": "^13.19.0",
+                "graphemer": "^1.4.0",
+                "ignore": "^5.2.0",
+                "imurmurhash": "^0.1.4",
+                "is-glob": "^4.0.0",
+                "is-path-inside": "^3.0.3",
+                "js-yaml": "^4.1.0",
+                "json-stable-stringify-without-jsonify": "^1.0.1",
+                "levn": "^0.4.1",
+                "lodash.merge": "^4.6.2",
+                "minimatch": "^3.1.2",
+                "natural-compare": "^1.4.0",
+                "optionator": "^0.9.3",
+                "strip-ansi": "^6.0.1",
+                "text-table": "^0.2.0"
+            },
+            "bin": {
+                "eslint": "bin/eslint.js"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/prettier-eslint/node_modules/file-entry-cache": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+            "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+            "dev": true,
+            "dependencies": {
+                "flat-cache": "^3.0.4"
+            },
+            "engines": {
+                "node": "^10.12.0 || >=12.0.0"
+            }
+        },
+        "node_modules/prettier-eslint/node_modules/flat-cache": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+            "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+            "dev": true,
+            "dependencies": {
+                "flatted": "^3.2.9",
+                "keyv": "^4.5.3",
+                "rimraf": "^3.0.2"
+            },
+            "engines": {
+                "node": "^10.12.0 || >=12.0.0"
+            }
+        },
+        "node_modules/prettier-eslint/node_modules/globals": {
+            "version": "13.24.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+            "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+            "dev": true,
+            "dependencies": {
+                "type-fest": "^0.20.2"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/prettier-eslint/node_modules/json-schema-traverse": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+            "dev": true
+        },
         "node_modules/prettier-linter-helpers": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
@@ -6519,6 +6718,7 @@
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
             "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+            "deprecated": "Rimraf versions prior to v4 are no longer supported",
             "dev": true,
             "dependencies": {
                 "glob": "^7.1.3"
@@ -7240,12 +7440,12 @@
             }
         },
         "node_modules/ts-api-utils": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
-            "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+            "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
             "dev": true,
             "engines": {
-                "node": ">=16.13.0"
+                "node": ">=16"
             },
             "peerDependencies": {
                 "typescript": ">=4.2.0"
diff --git a/package.json b/package.json
index c109e2c1..5fc72037 100644
--- a/package.json
+++ b/package.json
@@ -86,6 +86,7 @@
         "yargs": "17.7.2"
     },
     "devDependencies": {
+        "@eslint/js": "9.6.0",
         "@types/mocha": "10.0.6",
         "@types/node": "20.14.9",
         "assert": "2.1.0",
@@ -93,14 +94,15 @@
         "c8": "10.0.0",
         "chai": "5.1.1",
         "chai-files": "1.4.0",
-        "eslint": "8.57.0",
+        "eslint": "9.6.0",
         "eslint-config-prettier": "9.1.0",
-        "eslint-config-ssjs": "1.1.11",
+        "eslint-config-ssjs": "2.0.0",
         "eslint-plugin-jsdoc": "48.2.7",
         "eslint-plugin-mocha": "10.4.3",
         "eslint-plugin-prettier": "5.1.2",
         "eslint-plugin-unicorn": "53.0.0",
         "fast-xml-parser": "4.4.0",
+        "globals": "15.6.0",
         "husky": "9.0.11",
         "lint-staged": "15.2.7",
         "mocha": "10.4.0",
@@ -113,9 +115,7 @@
         "fsevents": "*"
     },
     "lint-staged": {
-        "*.js": [
-            "eslint --fix"
-        ]
+        "*.js": ["eslint --fix"]
     },
     "type": "module"
 }


Test patch:
diff --git a/test/utils.js b/test/utils.js
index 90018c61..9b8ebc2e 100644
--- a/test/utils.js
+++ b/test/utils.js
@@ -9,7 +9,7 @@ import { fileURLToPath } from 'node:url';
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
 
 // for some reason doesnt realize below reference
-// eslint-disable-next-line no-unused-vars
+
 import fsmock from 'mock-fs';
 
 let apimock;
@@ -184,8 +184,9 @@ export function mockSetup(isDeploy) {
             path.resolve(__dirname, '../boilerplate/files/.beautyamp.json')
         ),
         '.prettierrc': fsmock.load(path.resolve(__dirname, '../boilerplate/files/.prettierrc')),
-        '.eslintrc': fsmock.load(path.resolve(__dirname, '../boilerplate/files/.eslintrc')),
-        '.eslintignore': fsmock.load(path.resolve(__dirname, '../boilerplate/files/.eslintignore')),
+        'eslint.config.js': fsmock.load(
+            path.resolve(__dirname, '../boilerplate/files/eslint.config.js')
+        ),
         '.mcdevrc.json': fsmock.load(path.resolve(__dirname, 'mockRoot/.mcdevrc.json')),
         '.mcdev-auth.json': fsmock.load(path.resolve(__dirname, 'mockRoot/.mcdev-auth.json')),
         'boilerplate/config.json': fsmock.load(