Repository: aiscript-dev/aiscript
Pull request #867 (2024-11-28 19:13:11)

Bump the npm-deps group across 1 directory with 9 updates
Bumps the npm-deps group with 9 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [uuid](https://github.com/uuidjs/uuid) | `10.0.0` | `11.0.3` |
| [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.13.0` | `9.15.0` |
| [@microsoft/api-extractor](https://github.com/microsoft/rushstack/tree/HEAD/apps/api-extractor) | `7.47.11` | `7.48.0` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `22.7.9` | `22.10.1` |
| [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) | `2.1.3` | `2.1.6` |
| [eslint](https://github.com/eslint/eslint) | `9.13.0` | `9.15.0` |
| [typescript](https://github.com/microsoft/TypeScript) | `5.6.3` | `5.7.2` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.11.0` | `8.16.0` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `2.1.3` | `2.1.6` |


Updates `uuid` from 10.0.0 to 11.0.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/uuidjs/uuid/releases">uuid's releases</a>.</em></p>
<blockquote>
<h2>v11.0.3</h2>
<h2><a href="https://github.com/uuidjs/uuid/compare/v11.0.2...v11.0.3">11.0.3</a> (2024-11-04)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>apply stricter typing to the v* signatures (<a href="https://redirect.github.com/uuidjs/uuid/issues/831">#831</a>) (<a href="https://github.com/uuidjs/uuid/commit/c2d3fed22cfd47c22c8f22f6154abb5060648ce5">c2d3fed</a>)</li>
<li>export internal uuid types (<a href="https://redirect.github.com/uuidjs/uuid/issues/833">#833</a>) (<a href="https://github.com/uuidjs/uuid/commit/341edf444ced63708ba336285dbec29443523939">341edf4</a>)</li>
<li>remove sourcemaps (<a href="https://redirect.github.com/uuidjs/uuid/issues/827">#827</a>) (<a href="https://github.com/uuidjs/uuid/commit/b93ea101af7382053032d4fb61cc85599d6c7216">b93ea10</a>)</li>
<li>revert &quot;simplify type for v3 and v5&quot; (<a href="https://redirect.github.com/uuidjs/uuid/issues/835">#835</a>) (<a href="https://github.com/uuidjs/uuid/commit/e2dee691e95aba854a892d2507d8cd9f009bf61d">e2dee69</a>)</li>
</ul>
<h2>v11.0.2</h2>
<h2><a href="https://github.com/uuidjs/uuid/compare/v11.0.1...v11.0.2">11.0.2</a> (2024-10-28)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>remove wrapper.mjs (<a href="https://github.com/uuidjs/uuid/commit/2a18871f00f6f9effa9f8afadd98278e6866112c">2a18871</a>)</li>
<li>remove wrapper.mjs (<a href="https://redirect.github.com/uuidjs/uuid/issues/822">#822</a>) (<a href="https://github.com/uuidjs/uuid/commit/6683ad38b048375b451eac1194960f24ba20e0ca">6683ad3</a>)</li>
</ul>
<h2>v11.0.1</h2>
<h2><a href="https://github.com/uuidjs/uuid/compare/v11.0.0...v11.0.1">11.0.1</a> (2024-10-27)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>restore package.json#browser field (<a href="https://redirect.github.com/uuidjs/uuid/issues/817">#817</a>) (<a href="https://github.com/uuidjs/uuid/commit/ae8f38657bca0ee053bf29c88c006b1ea05af1b5">ae8f386</a>)</li>
</ul>
<h2>v11.0.0</h2>
<h2><a href="https://github.com/uuidjs/uuid/compare/v11.0.0...v11.0.0">11.0.0</a> (2024-10-27)</h2>
<h3>⚠ BREAKING CHANGES</h3>
<ul>
<li>refactor v1 internal state and options logic (<a href="https://redirect.github.com/uuidjs/uuid/issues/780">#780</a>)</li>
<li>refactor v7 internal state and options logic, fixes <a href="https://redirect.github.com/uuidjs/uuid/issues/764">#764</a> (<a href="https://redirect.github.com/uuidjs/uuid/issues/779">#779</a>)</li>
<li>Port to TypeScript, closes  <a href="https://redirect.github.com/uuidjs/uuid/issues/762">#762</a> (<a href="https://redirect.github.com/uuidjs/uuid/issues/763">#763</a>)</li>
<li>update node support matrix (only support node 16-20) (<a href="https://redirect.github.com/uuidjs/uuid/issues/750">#750</a>)</li>
<li>This library always aims at supporting one EOLed LTS release which by this time now is 12.x which has reached EOL 30 Apr 2022.</li>
<li>Remove the minified UMD build from the package.</li>
<li>Drop support for browsers that don't correctly implement const/let and default arguments, and no longer transpile the browser build to ES2015.</li>
<li>Although in practice this is currently a noop since the resulting build does not change, the build will no longer transpiles future changes for Node.js 8.x targets, so semantically this is still a breaking change.</li>
<li>Deep requiring specific algorithms of this library like require('uuid/v4'), which has been deprecated in uuid@7, is no longer supported.</li>
<li>The default export, which used to be the v4() method but which was already discouraged in v3.x of this library, has been removed.</li>
<li>Explicitly note that deep imports of the different uuid version functions are deprecated and no longer encouraged and that ECMAScript module named imports should be used instead. Emit a deprecation warning for people who deep-require the different algorithm variants.</li>
<li>Remove builtin support for insecure random number generators in the browser. Users who want that will have to supply their own random number generator function.</li>
<li>Remove support for generating v3 and v5 UUIDs in Node.js&lt;4.x</li>
<li>Convert code base to ECMAScript Modules (ESM) and release CommonJS build for node and ESM build for browser bundlers.</li>
</ul>
<h3>Features</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md">uuid's changelog</a>.</em></p>
<blockquote>
<h2><a href="https://github.com/uuidjs/uuid/compare/v11.0.2...v11.0.3">11.0.3</a> (2024-11-04)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>apply stricter typing to the v* signatures (<a href="https://redirect.github.com/uuidjs/uuid/issues/831">#831</a>) (<a href="https://github.com/uuidjs/uuid/commit/c2d3fed22cfd47c22c8f22f6154abb5060648ce5">c2d3fed</a>)</li>
<li>export internal uuid types (<a href="https://redirect.github.com/uuidjs/uuid/issues/833">#833</a>) (<a href="https://github.com/uuidjs/uuid/commit/341edf444ced63708ba336285dbec29443523939">341edf4</a>)</li>
<li>remove sourcemaps (<a href="https://redirect.github.com/uuidjs/uuid/issues/827">#827</a>) (<a href="https://github.com/uuidjs/uuid/commit/b93ea101af7382053032d4fb61cc85599d6c7216">b93ea10</a>)</li>
<li>revert &quot;simplify type for v3 and v5&quot; (<a href="https://redirect.github.com/uuidjs/uuid/issues/835">#835</a>) (<a href="https://github.com/uuidjs/uuid/commit/e2dee691e95aba854a892d2507d8cd9f009bf61d">e2dee69</a>)</li>
</ul>
<h2><a href="https://github.com/uuidjs/uuid/compare/v11.0.1...v11.0.2">11.0.2</a> (2024-10-28)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>remove wrapper.mjs (<a href="https://redirect.github.com/uuidjs/uuid/issues/822">#822</a>) (<a href="https://github.com/uuidjs/uuid/commit/6683ad38b048375b451eac1194960f24ba20e0ca">6683ad3</a>)</li>
</ul>
<h2><a href="https://github.com/uuidjs/uuid/compare/v11.0.0...v11.0.1">11.0.1</a> (2024-10-27)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>restore package.json#browser field (<a href="https://redirect.github.com/uuidjs/uuid/issues/817">#817</a>) (<a href="https://github.com/uuidjs/uuid/commit/ae8f38657bca0ee053bf29c88c006b1ea05af1b5">ae8f386</a>)</li>
</ul>
<h2><a href="https://github.com/uuidjs/uuid/compare/v9.0.0...v11.0.0">11.0.0</a> (2024-10-26)</h2>
<h3>⚠ BREAKING CHANGES</h3>
<ul>
<li>refactor v1 internal state and options logic (<a href="https://redirect.github.com/uuidjs/uuid/issues/780">#780</a>)</li>
<li>refactor v7 internal state and options logic, fixes <a href="https://redirect.github.com/uuidjs/uuid/issues/764">#764</a> (<a href="https://redirect.github.com/uuidjs/uuid/issues/779">#779</a>)</li>
<li>Port to TypeScript, closes <a href="https://redirect.github.com/uuidjs/uuid/issues/762">#762</a> (<a href="https://redirect.github.com/uuidjs/uuid/issues/763">#763</a>)</li>
<li>update node support matrix (only support node 16-20) (<a href="https://redirect.github.com/uuidjs/uuid/issues/750">#750</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>Port to TypeScript, closes <a href="https://redirect.github.com/uuidjs/uuid/issues/762">#762</a> (<a href="https://redirect.github.com/uuidjs/uuid/issues/763">#763</a>) (<a href="https://github.com/uuidjs/uuid/commit/1e0f9870db864ca93f7a69db0d468b5e1b7605e7">1e0f987</a>)</li>
<li>update node support matrix (only support node 16-20) (<a href="https://redirect.github.com/uuidjs/uuid/issues/750">#750</a>) (<a href="https://github.com/uuidjs/uuid/commit/883b163b9ab9d6655bfbd8a35e61a3c71674dfe1">883b163</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>missing v7 expectations in browser spec (<a href="https://redirect.github.com/uuidjs/uuid/issues/751">#751</a>) (<a href="https://github.com/uuidjs/uuid/commit/f54a866cedb2b3b96581157c1f4ac935a0b11411">f54a866</a>)</li>
<li>refactor v1 internal state and options logic (<a href="https://redirect.github.com/uuidjs/uuid/issues/780">#780</a>) (<a href="https://github.com/uuidjs/uuid/commit/031b3d3d738bc6694501ac0a37152b95ed500989">031b3d3</a>)</li>
<li>refactor v7 internal state and options logic, fixes <a href="https://redirect.github.com/uuidjs/uuid/issues/764">#764</a> (<a href="https://redirect.github.com/uuidjs/uuid/issues/779">#779</a>) (<a href="https://github.com/uuidjs/uuid/commit/9dbd1cd4177c43fcaac961a3b16fb2d044c9940a">9dbd1cd</a>)</li>
<li>remove v4 options default assignment preventing native.randomUUID from being used (<a href="https://redirect.github.com/uuidjs/uuid/issues/786">#786</a>) (<a href="https://github.com/uuidjs/uuid/commit/afe62323c4408a824755a39d7b971a8ae06f7199">afe6232</a>), closes <a href="https://redirect.github.com/uuidjs/uuid/issues/763">#763</a></li>
<li>seq_hi shift for byte 6 (<a href="https://redirect.github.com/uuidjs/uuid/issues/775">#775</a>) (<a href="https://github.com/uuidjs/uuid/commit/1d532ca374f181932a24a83fa98f71a5bd4f3e96">1d532ca</a>)</li>
<li>tsconfig module type (<a href="https://redirect.github.com/uuidjs/uuid/issues/778">#778</a>) (<a href="https://github.com/uuidjs/uuid/commit/7eff835cba334ad418f57768c00d15b918a9b419">7eff835</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/uuidjs/uuid/commit/1370497eecb5c4a570da3d76aa1b47b86448470f"><code>1370497</code></a> chore(main): release 11.0.3 (<a href="https://redirect.github.com/uuidjs/uuid/issues/828">#828</a>)</li>
<li><a href="https://github.com/uuidjs/uuid/commit/383474d402a32ae19f5897f20f3c6b8fe0ee1e57"><code>383474d</code></a> chore: replace optional-dev-dependencies with iodd (<a href="https://redirect.github.com/uuidjs/uuid/issues/836">#836</a>)</li>
<li><a href="https://github.com/uuidjs/uuid/commit/341edf444ced63708ba336285dbec29443523939"><code>341edf4</code></a> fix: export internal uuid types (<a href="https://redirect.github.com/uuidjs/uuid/issues/833">#833</a>)</li>
<li><a href="https://github.com/uuidjs/uuid/commit/e2dee691e95aba854a892d2507d8cd9f009bf61d"><code>e2dee69</code></a> fix: revert &quot;simplify type for v3 and v5&quot; (<a href="https://redirect.github.com/uuidjs/uuid/issues/835">#835</a>)</li>
<li><a href="https://github.com/uuidjs/uuid/commit/c8866d9b59035e147661a19f822f46863b475ad6"><code>c8866d9</code></a> chore: enable manual runs of browser workflow (<a href="https://redirect.github.com/uuidjs/uuid/issues/834">#834</a>)</li>
<li><a href="https://github.com/uuidjs/uuid/commit/c2d3fed22cfd47c22c8f22f6154abb5060648ce5"><code>c2d3fed</code></a> fix: apply stricter typing to the v* signatures (<a href="https://redirect.github.com/uuidjs/uuid/issues/831">#831</a>)</li>
<li><a href="https://github.com/uuidjs/uuid/commit/913e958b1bf442ce00b3b244620698434f684025"><code>913e958</code></a> chore: update to actions/checkout@v4 (<a href="https://redirect.github.com/uuidjs/uuid/issues/830">#830</a>)</li>
<li><a href="https://github.com/uuidjs/uuid/commit/0980160d3ac367c2509708ccfad0c0c4ed686584"><code>0980160</code></a> chore: cleanup changelog (<a href="https://redirect.github.com/uuidjs/uuid/issues/829">#829</a>)</li>
<li><a href="https://github.com/uuidjs/uuid/commit/b93ea101af7382053032d4fb61cc85599d6c7216"><code>b93ea10</code></a> fix: remove sourcemaps (<a href="https://redirect.github.com/uuidjs/uuid/issues/827">#827</a>)</li>
<li><a href="https://github.com/uuidjs/uuid/commit/36f2369af6479a46db1eb4fdffb73cbbf6108cf4"><code>36f2369</code></a> chore(main): release 11.0.2 (<a href="https://redirect.github.com/uuidjs/uuid/issues/823">#823</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/uuidjs/uuid/compare/v10.0.0...v11.0.3">compare view</a></li>
</ul>
</details>
<br />

Updates `@eslint/js` from 9.13.0 to 9.15.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/eslint/eslint/releases"><code>@​eslint/js</code>'s releases</a>.</em></p>
<blockquote>
<h2>v9.15.0</h2>
<h2>Features</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/01557cec24203be72222858a3912da0a474ac75c"><code>01557ce</code></a> feat: Implement Language#normalizeLanguageOptions() (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19104">#19104</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/2edc0e2bdc40c4a6da8d526c82c0b6c582bae419"><code>2edc0e2</code></a> feat: add meta.defaultOptions (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/17656">#17656</a>) (Josh Goldberg ✨)</li>
<li><a href="https://github.com/eslint/eslint/commit/bdec50e91baf9d5eefa07d97d2059fdebb53cdaa"><code>bdec50e</code></a> feat: fix <code>no-useless-computed-key</code> false negative with <code>__proto__</code> (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19123">#19123</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/3087c9e95094cad1354aca2e4ae48c7bd2381184"><code>3087c9e</code></a> feat: add <code>meta</code> object to <code>@eslint/js</code> plugin (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19095">#19095</a>) (Francesco Trotta)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/fd33f1315ac59b1b3828dbab8e1e056a1585eff0"><code>fd33f13</code></a> fix: update types for <code>no-restricted-imports</code> rule (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19060">#19060</a>) (Nitin Kumar)</li>
<li><a href="https://github.com/eslint/eslint/commit/bd35098f5b949ecb83e8c7e287524b28b2a3dd71"><code>bd35098</code></a> fix: switch away from Node.js node:assert and AssertionError (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19082">#19082</a>) (Josh Goldberg ✨)</li>
<li><a href="https://github.com/eslint/eslint/commit/9db5b152c325a930130d49ca967013471c3ba0dc"><code>9db5b15</code></a> fix: unsafe report for <code>no-lonely-if</code> (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19087">#19087</a>) (Abraham Guo)</li>
<li><a href="https://github.com/eslint/eslint/commit/68fa497f6a11f1738dce85bb2bdd7a5f8b9f5d6d"><code>68fa497</code></a> fix: ignore files on a different drive on Windows (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19069">#19069</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/4ce625a230778a41b856162df9ebcc57c25cc103"><code>4ce625a</code></a> fix: upgrade <code>@​humanwhocodes/retry</code><a href="https://github.com/0"><code>@​0</code></a>.4.1 to avoid debug logs (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19102">#19102</a>) (Milos Djermanovic)</li>
</ul>
<h2>Documentation</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/d9279202e7d15452e44adf38451d33d4aaad3bd4"><code>d927920</code></a> docs: fix styles in no-js mode (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/18916">#18916</a>) (Tanuj Kanti)</li>
<li><a href="https://github.com/eslint/eslint/commit/09bc2a88c00aa9a93c7de505795fc4e85b2e6357"><code>09bc2a8</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/39089c80a7af09494fce86a6574bf012cbe46d10"><code>39089c8</code></a> docs: add <code>no-useless-computed-key</code> examples with object patterns (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19109">#19109</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/895c60f7fe09f59df1e9490006220d3ec4b9d5b0"><code>895c60f</code></a> docs: add missing messageId property and suggestion properties (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19122">#19122</a>) (fnx)</li>
<li><a href="https://github.com/eslint/eslint/commit/298625eb65dc00bfa0a877ea46faada22021c23e"><code>298625e</code></a> docs: Change CLI -c to use flat config (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19103">#19103</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/522d8a32f326c52886c531f43cf6a1ff15af8286"><code>522d8a3</code></a> docs: add deprecation on <code>indent</code>, <code>quotes</code> and <code>semi</code> rule types (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19090">#19090</a>) (Marco Pasqualetti)</li>
</ul>
<h2>Chores</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/2967d91037ad670ea3a67fdb9c171b60d9af138b"><code>2967d91</code></a> chore: upgrade <code>@​eslint/js</code><a href="https://github.com/9"><code>@​9</code></a>.15.0 (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19133">#19133</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/b441bee6ad9807fef614bd071e6bd3e8b3307b2d"><code>b441bee</code></a> chore: package.json update for <code>@​eslint/js</code> release (Jenkins)</li>
<li><a href="https://github.com/eslint/eslint/commit/7d6bf4a250f97d8ff1e2606e3d769e016a32f45b"><code>7d6bf4a</code></a> chore: upgrade <code>@​eslint/core</code><a href="https://github.com/0"><code>@​0</code></a>.9.0 (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19131">#19131</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/902e70713de1ab67ede9ef8a3836fd2d09a759e5"><code>902e707</code></a> chore: upgrade <code>@​eslint/plugin-kit</code><a href="https://github.com/0"><code>@​0</code></a>.2.3 (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19130">#19130</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/5ff6c1dd09f32b56c05ab97f328741fc8ffb1f64"><code>5ff6c1d</code></a> chore: bump cross-spawn (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19125">#19125</a>) (Ian Bobinac)</li>
<li><a href="https://github.com/eslint/eslint/commit/cceccc771631011e04b37122b990205f0e8b6925"><code>cceccc7</code></a> chore: update dependency <code>@​eslint/json</code> to ^0.6.0 (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19117">#19117</a>) (renovate[bot])</li>
<li><a href="https://github.com/eslint/eslint/commit/0da3f732fe1776f8f79dac829b2cab4cedd4b6d8"><code>0da3f73</code></a> chore: update algolia referrer (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19114">#19114</a>) (Strek)</li>
<li><a href="https://github.com/eslint/eslint/commit/4f08332ac03e51002f8de6da5c5a362608205437"><code>4f08332</code></a> ci: unpin <code>trunk-io/trunk-action</code> (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19108">#19108</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/6b75683b47c346faaeb6c1dac8e168d64338c7b3"><code>6b75683</code></a> perf: optimize <code>text-table</code> by replacing regex with <code>trimEnd</code> (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19061">#19061</a>) (Nitin Kumar)</li>
</ul>
<h2>v9.14.0</h2>
<h2>Features</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/3fa009f25992d3d305437205be0ca145a0fb53f4"><code>3fa009f</code></a> feat: add support for Import Attributes and RegExp Modifiers (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19076">#19076</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/b0faee30e007a89bd7bdbc22a70223fabb99a541"><code>b0faee3</code></a> feat: add types for the <code>@eslint/js</code> package (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19010">#19010</a>) (Nitin Kumar)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/24d0172bbfb92cac663cb1631bd04e7539262066"><code>24d0172</code></a> fix: enable retry concurrency limit for readFile() (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19077">#19077</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/b44206725247d30b10cd58859c388949f5489087"><code>b442067</code></a> fix: Don't crash when directory is deleted during traversal. (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19067">#19067</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/d474443109762f3b92811df0411965cf64f595c2"><code>d474443</code></a> fix: avoid call stack overflow while processing globs (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19035">#19035</a>) (Livia Medeiros)</li>
</ul>
<h2>Documentation</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/151c965aec1c46000ac7dfc67a1c04802112aafc"><code>151c965</code></a> docs: update <code>context.languageOptions.parser</code> description (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19084">#19084</a>) (Nitin Kumar)</li>
<li><a href="https://github.com/eslint/eslint/commit/dc34f94a2ed25b37ac4aafcabed7bfae582db77e"><code>dc34f94</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/f16e846ac004bc32e52cd3991d14d7a89374bbb5"><code>f16e846</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/ee0a77ea3caa5838bab704b54a577eefbed58f68"><code>ee0a77e</code></a> docs: change link from <code>@​types/eslint</code> to lib/types (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19049">#19049</a>) (Karl Horky)</li>
<li><a href="https://github.com/eslint/eslint/commit/50f03a119e6827c03b1d6c86d3aa1f4820b609e8"><code>50f03a1</code></a> docs: Clarify global ignores in config migration guide (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19032">#19032</a>) (Milos Djermanovic)</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"><code>@​eslint/js</code>'s changelog</a>.</em></p>
<blockquote>
<p>v9.15.0 - November 15, 2024</p>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/2967d91037ad670ea3a67fdb9c171b60d9af138b"><code>2967d91</code></a> chore: upgrade <code>@​eslint/js</code><a href="https://github.com/9"><code>@​9</code></a>.15.0 (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19133">#19133</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/b441bee6ad9807fef614bd071e6bd3e8b3307b2d"><code>b441bee</code></a> chore: package.json update for <code>@​eslint/js</code> release (Jenkins)</li>
<li><a href="https://github.com/eslint/eslint/commit/7d6bf4a250f97d8ff1e2606e3d769e016a32f45b"><code>7d6bf4a</code></a> chore: upgrade <code>@​eslint/core</code><a href="https://github.com/0"><code>@​0</code></a>.9.0 (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19131">#19131</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/01557cec24203be72222858a3912da0a474ac75c"><code>01557ce</code></a> feat: Implement Language#normalizeLanguageOptions() (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19104">#19104</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/902e70713de1ab67ede9ef8a3836fd2d09a759e5"><code>902e707</code></a> chore: upgrade <code>@​eslint/plugin-kit</code><a href="https://github.com/0"><code>@​0</code></a>.2.3 (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19130">#19130</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/2edc0e2bdc40c4a6da8d526c82c0b6c582bae419"><code>2edc0e2</code></a> feat: add meta.defaultOptions (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/17656">#17656</a>) (Josh Goldberg ✨)</li>
<li><a href="https://github.com/eslint/eslint/commit/fd33f1315ac59b1b3828dbab8e1e056a1585eff0"><code>fd33f13</code></a> fix: update types for <code>no-restricted-imports</code> rule (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19060">#19060</a>) (Nitin Kumar)</li>
<li><a href="https://github.com/eslint/eslint/commit/5ff6c1dd09f32b56c05ab97f328741fc8ffb1f64"><code>5ff6c1d</code></a> chore: bump cross-spawn (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19125">#19125</a>) (Ian Bobinac)</li>
<li><a href="https://github.com/eslint/eslint/commit/d9279202e7d15452e44adf38451d33d4aaad3bd4"><code>d927920</code></a> docs: fix styles in no-js mode (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/18916">#18916</a>) (Tanuj Kanti)</li>
<li><a href="https://github.com/eslint/eslint/commit/bdec50e91baf9d5eefa07d97d2059fdebb53cdaa"><code>bdec50e</code></a> feat: fix <code>no-useless-computed-key</code> false negative with <code>__proto__</code> (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19123">#19123</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/09bc2a88c00aa9a93c7de505795fc4e85b2e6357"><code>09bc2a8</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/bd35098f5b949ecb83e8c7e287524b28b2a3dd71"><code>bd35098</code></a> fix: switch away from Node.js node:assert and AssertionError (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19082">#19082</a>) (Josh Goldberg ✨)</li>
<li><a href="https://github.com/eslint/eslint/commit/39089c80a7af09494fce86a6574bf012cbe46d10"><code>39089c8</code></a> docs: add <code>no-useless-computed-key</code> examples with object patterns (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19109">#19109</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/895c60f7fe09f59df1e9490006220d3ec4b9d5b0"><code>895c60f</code></a> docs: add missing messageId property and suggestion properties (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19122">#19122</a>) (fnx)</li>
<li><a href="https://github.com/eslint/eslint/commit/cceccc771631011e04b37122b990205f0e8b6925"><code>cceccc7</code></a> chore: update dependency <code>@​eslint/json</code> to ^0.6.0 (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19117">#19117</a>) (renovate[bot])</li>
<li><a href="https://github.com/eslint/eslint/commit/0da3f732fe1776f8f79dac829b2cab4cedd4b6d8"><code>0da3f73</code></a> chore: update algolia referrer (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19114">#19114</a>) (Strek)</li>
<li><a href="https://github.com/eslint/eslint/commit/9db5b152c325a930130d49ca967013471c3ba0dc"><code>9db5b15</code></a> fix: unsafe report for <code>no-lonely-if</code> (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19087">#19087</a>) (Abraham Guo)</li>
<li><a href="https://github.com/eslint/eslint/commit/68fa497f6a11f1738dce85bb2bdd7a5f8b9f5d6d"><code>68fa497</code></a> fix: ignore files on a different drive on Windows (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19069">#19069</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/4f08332ac03e51002f8de6da5c5a362608205437"><code>4f08332</code></a> ci: unpin <code>trunk-io/trunk-action</code> (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19108">#19108</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/3087c9e95094cad1354aca2e4ae48c7bd2381184"><code>3087c9e</code></a> feat: add <code>meta</code> object to <code>@eslint/js</code> plugin (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19095">#19095</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/298625eb65dc00bfa0a877ea46faada22021c23e"><code>298625e</code></a> docs: Change CLI -c to use flat config (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19103">#19103</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/4ce625a230778a41b856162df9ebcc57c25cc103"><code>4ce625a</code></a> fix: upgrade <code>@​humanwhocodes/retry</code><a href="https://github.com/0"><code>@​0</code></a>.4.1 to avoid debug logs (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19102">#19102</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/522d8a32f326c52886c531f43cf6a1ff15af8286"><code>522d8a3</code></a> docs: add deprecation on <code>indent</code>, <code>quotes</code> and <code>semi</code> rule types (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19090">#19090</a>) (Marco Pasqualetti)</li>
<li><a href="https://github.com/eslint/eslint/commit/6b75683b47c346faaeb6c1dac8e168d64338c7b3"><code>6b75683</code></a> perf: optimize <code>text-table</code> by replacing regex with <code>trimEnd</code> (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19061">#19061</a>) (Nitin Kumar)</li>
</ul>
<p>v9.14.0 - November 1, 2024</p>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/f36cb1649a85028fb3999ee2056ee467a907c061"><code>f36cb16</code></a> chore: upgrade <code>@​eslint/js</code><a href="https://github.com/9"><code>@​9</code></a>.14.0 (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19086">#19086</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/28be4471f6eb61b4304ae3d17ea7eeacc6364bbe"><code>28be447</code></a> chore: package.json update for <code>@​eslint/js</code> release (Jenkins)</li>
<li><a href="https://github.com/eslint/eslint/commit/24d0172bbfb92cac663cb1631bd04e7539262066"><code>24d0172</code></a> fix: enable retry concurrency limit for readFile() (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19077">#19077</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/3fa009f25992d3d305437205be0ca145a0fb53f4"><code>3fa009f</code></a> feat: add support for Import Attributes and RegExp Modifiers (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19076">#19076</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/b0faee30e007a89bd7bdbc22a70223fabb99a541"><code>b0faee3</code></a> feat: add types for the <code>@eslint/js</code> package (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19010">#19010</a>) (Nitin Kumar)</li>
<li><a href="https://github.com/eslint/eslint/commit/151c965aec1c46000ac7dfc67a1c04802112aafc"><code>151c965</code></a> docs: update <code>context.languageOptions.parser</code> description (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19084">#19084</a>) (Nitin Kumar)</li>
<li><a href="https://github.com/eslint/eslint/commit/dc34f94a2ed25b37ac4aafcabed7bfae582db77e"><code>dc34f94</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/f48a2a0e9bf4a659b9af5e70e873fb631430c1ba"><code>f48a2a0</code></a> test: add <code>no-invalid-regexp</code> tests with RegExp Modifiers (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19075">#19075</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/37c9177aa07296a7a794c4b4ef5333e16fa22415"><code>37c9177</code></a> build: update <code>@wdio/*</code> dependencies (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19068">#19068</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/b44206725247d30b10cd58859c388949f5489087"><code>b442067</code></a> fix: Don't crash when directory is deleted during traversal. (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19067">#19067</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/35a8858d62cb050fa0b56702e55c94ffaaf6956d"><code>35a8858</code></a> build: exclude flawed dendency versions (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19065">#19065</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/425202ed49a1372c1719d4e7b48d0fbdda8af9fa"><code>425202e</code></a> perf: Fix caching in config loaders (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19042">#19042</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/3d44b3c4751e4c44c32b879b65a723faee9c1c29"><code>3d44b3c</code></a> ci: run tests in Node.js 23 (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19055">#19055</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/f16e846ac004bc32e52cd3991d14d7a89374bbb5"><code>f16e846</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/ee0a77ea3caa5838bab704b54a577eefbed58f68"><code>ee0a77e</code></a> docs: change link from <code>@​types/eslint</code> to lib/types (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19049">#19049</a>) (Karl Horky)</li>
<li><a href="https://github.com/eslint/eslint/commit/d474443109762f3b92811df0411965cf64f595c2"><code>d474443</code></a> fix: avoid call stack overflow while processing globs (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19035">#19035</a>) (Livia Medeiros)</li>
<li><a href="https://github.com/eslint/eslint/commit/725962731538eaa38d5d78b9e82ce3fccc9762d0"><code>7259627</code></a> test: ensure tmp directory cleanup in <code>check-emfile-handling.js</code> (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19036">#19036</a>) (Livia Medeiros)</li>
<li><a href="https://github.com/eslint/eslint/commit/50f03a119e6827c03b1d6c86d3aa1f4820b609e8"><code>50f03a1</code></a> docs: Clarify global ignores in config migration guide (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19032">#19032</a>) (Milos Djermanovic)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/b441bee6ad9807fef614bd071e6bd3e8b3307b2d"><code>b441bee</code></a> chore: package.json update for <code>@​eslint/js</code> release</li>
<li><a href="https://github.com/eslint/eslint/commit/3087c9e95094cad1354aca2e4ae48c7bd2381184"><code>3087c9e</code></a> feat: add <code>meta</code> object to <code>@eslint/js</code> plugin (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19095">#19095</a>)</li>
<li><a href="https://github.com/eslint/eslint/commit/28be4471f6eb61b4304ae3d17ea7eeacc6364bbe"><code>28be447</code></a> chore: package.json update for <code>@​eslint/js</code> release</li>
<li><a href="https://github.com/eslint/eslint/commit/b0faee30e007a89bd7bdbc22a70223fabb99a541"><code>b0faee3</code></a> feat: add types for the <code>@eslint/js</code> package (<a href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19010">#19010</a>)</li>
<li>See full diff in <a href="https://github.com/eslint/eslint/commits/v9.15.0/packages/js">compare view</a></li>
</ul>
</details>
<br />

Updates `@microsoft/api-extractor` from 7.47.11 to 7.48.0
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/microsoft/rushstack/blob/main/apps/api-extractor/CHANGELOG.md"><code>@​microsoft/api-extractor</code>'s changelog</a>.</em></p>
<blockquote>
<h2>7.48.0</h2>
<p>Sat, 23 Nov 2024 01:18:55 GMT</p>
<h3>Minor changes</h3>
<ul>
<li>Update TSDoc dependencies.</li>
</ul>
<h2>7.47.12</h2>
<p>Fri, 22 Nov 2024 01:10:43 GMT</p>
<p><em>Version update only</em></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/microsoft/rushstack/commit/a9b6c472c31676e5ae4fcd594c311a6b6029e82e"><code>a9b6c47</code></a> Bump versions [skip ci]</li>
<li><a href="https://github.com/microsoft/rushstack/commit/e5cbdb0c4cc157eacf05721a04f7975cfdb36158"><code>e5cbdb0</code></a> Update changelogs [skip ci]</li>
<li><a href="https://github.com/microsoft/rushstack/commit/e9edfa64b2f2c30e332639b1f0c6bf4c5cb0a252"><code>e9edfa6</code></a> Bump cyclics and external dependencies.: (<a href="https://github.com/microsoft/rushstack/tree/HEAD/apps/api-extractor/issues/5014">#5014</a>)</li>
<li><a href="https://github.com/microsoft/rushstack/commit/85400039ea667f0b34ac460c6a960eda624cb00d"><code>8540003</code></a> Bump versions [skip ci]</li>
<li><a href="https://github.com/microsoft/rushstack/commit/bf16af57f32367bfa5df497af0e3dc6eb30a6e60"><code>bf16af5</code></a> Update changelogs [skip ci]</li>
<li>See full diff in <a href="https://github.com/microsoft/rushstack/commits/@microsoft/api-extractor_v7.48.0/apps/api-extractor">compare view</a></li>
</ul>
</details>
<br />

Updates `@types/node` from 22.7.9 to 22.10.1
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node">compare view</a></li>
</ul>
</details>
<br />

Updates `@vitest/coverage-v8` from 2.1.3 to 2.1.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/vitest-dev/vitest/releases"><code>@​vitest/coverage-v8</code>'s releases</a>.</em></p>
<blockquote>
<h2>v2.1.6</h2>
<h2>🚀 Features</h2>
<ul>
<li>Support Vite 6</li>
</ul>
<h5>    <a href="https://github.com/vitest-dev/vitest/compare/v2.1.5...v2.1.6">View changes on GitHub</a></h5>
<h2>v2.1.5</h2>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li><code>dangerouslyIgnoreUnhandledErrors</code> without base reporter  -  by <a href="https://github.com/AriPerkkio"><code>@​AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6808">vitest-dev/vitest#6808</a> <a href="https://github.com/vitest-dev/vitest/commit/0bf0ab00"><!-- raw HTML omitted -->(0bf0a)<!-- raw HTML omitted --></a></li>
<li>Capture <code>unhandledRejection</code> even when base reporter is not used  -  by <a href="https://github.com/AriPerkkio"><code>@​AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6812">vitest-dev/vitest#6812</a> <a href="https://github.com/vitest-dev/vitest/commit/8878b04d"><!-- raw HTML omitted -->(8878b)<!-- raw HTML omitted --></a></li>
<li>Don't change the working directory when loading workspace projects  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6811">vitest-dev/vitest#6811</a> <a href="https://github.com/vitest-dev/vitest/commit/f0aeaca8"><!-- raw HTML omitted -->(f0aea)<!-- raw HTML omitted --></a></li>
<li>Remove <code>sequence.concurrent</code> from the <code>RuntimeConfig</code> type  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6880">vitest-dev/vitest#6880</a> <a href="https://github.com/vitest-dev/vitest/commit/6af73d93"><!-- raw HTML omitted -->(6af73)<!-- raw HTML omitted --></a></li>
<li>Stop the runner before restarting, restart on workspace config change  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6859">vitest-dev/vitest#6859</a> <a href="https://github.com/vitest-dev/vitest/commit/b01df47d"><!-- raw HTML omitted -->(b01df)<!-- raw HTML omitted --></a></li>
<li>Don't rerun on Esc or Ctrl-C during watch filter  -  by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6895">vitest-dev/vitest#6895</a> <a href="https://github.com/vitest-dev/vitest/commit/98f76ea7"><!-- raw HTML omitted -->(98f76)<!-- raw HTML omitted --></a></li>
<li>Print ssrTransform error  -  by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6885">vitest-dev/vitest#6885</a> <a href="https://github.com/vitest-dev/vitest/commit/4c96cce7"><!-- raw HTML omitted -->(4c96c)<!-- raw HTML omitted --></a></li>
<li>Throw an error and a warning if <code>.poll</code>, <code>.element</code>, <code>.rejects</code>/<code>.resolves</code>, and <code>locator.*</code> weren't awaited  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6877">vitest-dev/vitest#6877</a> <a href="https://github.com/vitest-dev/vitest/commit/93b67c24"><!-- raw HTML omitted -->(93b67)<!-- raw HTML omitted --></a></li>
<li><strong>browser</strong>:
<ul>
<li>Don't process the default css styles  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6861">vitest-dev/vitest#6861</a> <a href="https://github.com/vitest-dev/vitest/commit/0d67f04b"><!-- raw HTML omitted -->(0d67f)<!-- raw HTML omitted --></a></li>
<li>Support non US key input  -  by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6873">vitest-dev/vitest#6873</a> <a href="https://github.com/vitest-dev/vitest/commit/5969d8da"><!-- raw HTML omitted -->(5969d)<!-- raw HTML omitted --></a></li>
<li>Stop the browser rpc when the pool is closed  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6858">vitest-dev/vitest#6858</a> <a href="https://github.com/vitest-dev/vitest/commit/9a0c93d7"><!-- raw HTML omitted -->(9a0c9)<!-- raw HTML omitted --></a></li>
<li>Init browsers eagerly when tests are running  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6876">vitest-dev/vitest#6876</a> <a href="https://github.com/vitest-dev/vitest/commit/417bdb42"><!-- raw HTML omitted -->(417bd)<!-- raw HTML omitted --></a></li>
</ul>
</li>
<li><strong>coverage</strong>:
<ul>
<li>Report uncovered files when re-run by <code>enter</code> or <code>'a'</code>  -  by <a href="https://github.com/AriPerkkio"><code>@​AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6848">vitest-dev/vitest#6848</a> <a href="https://github.com/vitest-dev/vitest/commit/487c80ae"><!-- raw HTML omitted -->(487c8)<!-- raw HTML omitted --></a></li>
</ul>
</li>
<li><strong>ui</strong>:
<ul>
<li>Remove crossorigin attributes for same origin assets  -  by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6883">vitest-dev/vitest#6883</a> <a href="https://github.com/vitest-dev/vitest/commit/6e793c64"><!-- raw HTML omitted -->(6e793)<!-- raw HTML omitted --></a></li>
</ul>
</li>
<li><strong>vite-node</strong>:
<ul>
<li>Improve esm check to decide external  -  by <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6816">vitest-dev/vitest#6816</a> <a href="https://github.com/vitest-dev/vitest/commit/7e1faf3d"><!-- raw HTML omitted -->(7e1fa)<!-- raw HTML omitted --></a></li>
<li>Top-level throw in module is not reported properly  -  by <a href="https://github.com/vanaigr"><code>@​vanaigr</code></a> and <a href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6840">vitest-dev/vitest#6840</a> <a href="https://github.com/vitest-dev/vitest/commit/cf0cbf6a"><!-- raw HTML omitted -->(cf0cb)<!-- raw HTML omitted --></a></li>
</ul>
</li>
<li><strong>vitest</strong>:
<ul>
<li>Use fetch() implementation from happy-dom  -  by <a href="https://github.com/capricorn86"><code>@​capricorn86</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6879">vitest-dev/vitest#6879</a> <a href="https://github.com/vitest-dev/vitest/commit/3c56feb4"><!-- raw HTML omitted -->(3c56f)<!-- raw HTML omitted --></a></li>
</ul>
</li>
</ul>
<h3>   🏎 Performance</h3>
<ul>
<li>Limit workspace project concurrency to available cores  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6869">vitest-dev/vitest#6869</a> <a href="https://github.com/vitest-dev/vitest/commit/f4c04ab6"><!-- raw HTML omitted -->(f4c04)<!-- raw HTML omitted --></a></li>
</ul>
<h5>    <a href="https://github.com/vitest-dev/vitest/compare/v2.1.4...v2.1.5">View changes on GitHub</a></h5>
<h2>v2.1.4</h2>
<h3>   🚀 Features</h3>
<p><em>This patch release includes a non-breaking feature for the experimental Browser Mode that doesn't follow SemVer. If you want to avoid picking up releases like this, make sure to pin the Vitest version in your <code>package.json</code>. See npm's documentation about <a href="https://docs.npmjs.com/cli/v6/using-npm/semver/">semver</a> for more information.</em></p>
<ul>
<li><strong>browser</strong>: Allow custom HTML path, respect plugins <code>transformIndexHtml</code>  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6725">vitest-dev/vitest#6725</a> <a href="https://github.com/vitest-dev/vitest/commit/169028f0"><!-- raw HTML omitted -->(16902)<!-- raw HTML omitted --></a></li>
</ul>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li><strong>windows</strong>:
<ul>
<li>Don't normalize drive case letter in root  -  by <a href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/6792">vitest-dev/vitest#6792</a> <a href="https://github.com/vitest-dev/vitest/commit/b28cd2e3"><!-- raw HTML omitted -->(b28cd)<!-- raw HTML omitted --></a></li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/vitest-dev/vitest/commit/b936702debce5a9deca637b25950afa485ad3639"><code>b936702</code></a> bump: 2.1.6</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/32f23b98b4b1a3708360debc03b6719f5226db87"><code>32f23b9</code></a> chore: release v2.1.5</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/0ad2cdcaae0cd6e48b7a30d29bf6e89104187319"><code>0ad2cdc</code></a> chore(deps): update all non-major dependencies (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8/issues/6890">#6890</a>)</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/0df44c0e7c7d7895ddef99f5029cbe3037fe5732"><code>0df44c0</code></a> chore: release v2.1.4</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/de74785e052649c12a415d290dbce7ad6ad76be4"><code>de74785</code></a> chore(deps): update <code>@antfu/eslint-config</code> v3.8.0 (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8/issues/6751">#6751</a>)</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/62ac4eb1bc285d1c77620ed441ca6f66d45f34c1"><code>62ac4eb</code></a> chore(deps): update <code>magic-string</code> (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8/issues/6711">#6711</a>)</li>
<li><a href="https://github.com/vitest-dev/vitest/commit/d260cef634b45503a4ec99f0b8afdeaca0b37924"><code>d260cef</code></a> chore(deps): update all non-major dependencies (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8/issues/6360">#6360</a>)</li>
<li>See full diff in <a href="https://github.com/vitest-dev/vitest/commits/v2.1.6/packages/coverage-v8">compare view</a></li>
</ul>
</details>
<br />

Updates `eslint` from 9.13.0 to 9.15.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.15.0</h2>
<h2>Features</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/01557cec24203be72222858a3912da0a474ac75c"><code>01557ce</code></a> feat: Implement Language#normalizeLanguageOptions() (<a href="https://redirect.github.com/eslint/eslint/issues/19104">#19104</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/2edc0e2bdc40c4a6da8d526c82c0b6c582bae419"><code>2edc0e2</code></a> feat: add meta.defaultOptions (<a href="https://redirect.github.com/eslint/eslint/issues/17656">#17656</a>) (Josh Goldberg ✨)</li>
<li><a href="https://github.com/eslint/eslint/commit/bdec50e91baf9d5eefa07d97d2059fdebb53cdaa"><code>bdec50e</code></a> feat: fix <code>no-useless-computed-key</code> false negative with <code>__proto__</code> (<a href="https://redirect.github.com/eslint/eslint/issues/19123">#19123</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/3087c9e95094cad1354aca2e4ae48c7bd2381184"><code>3087c9e</code></a> feat: add <code>meta</code> object to <code>@eslint/js</code> plugin (<a href="https://redirect.github.com/eslint/eslint/issues/19095">#19095</a>) (Francesco Trotta)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/fd33f1315ac59b1b3828dbab8e1e056a1585eff0"><code>fd33f13</code></a> fix: update types for <code>no-restricted-imports</code> rule (<a href="https://redirect.github.com/eslint/eslint/issues/19060">#19060</a>) (Nitin Kumar)</li>
<li><a href="https://github.com/eslint/eslint/commit/bd35098f5b949ecb83e8c7e287524b28b2a3dd71"><code>bd35098</code></a> fix: switch away from Node.js node:assert and AssertionError (<a href="https://redirect.github.com/eslint/eslint/issues/19082">#19082</a>) (Josh Goldberg ✨)</li>
<li><a href="https://github.com/eslint/eslint/commit/9db5b152c325a930130d49ca967013471c3ba0dc"><code>9db5b15</code></a> fix: unsafe report for <code>no-lonely-if</code> (<a href="https://redirect.github.com/eslint/eslint/issues/19087">#19087</a>) (Abraham Guo)</li>
<li><a href="https://github.com/eslint/eslint/commit/68fa497f6a11f1738dce85bb2bdd7a5f8b9f5d6d"><code>68fa497</code></a> fix: ignore files on a different drive on Windows (<a href="https://redirect.github.com/eslint/eslint/issues/19069">#19069</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/4ce625a230778a41b856162df9ebcc57c25cc103"><code>4ce625a</code></a> fix: upgrade <code>@​humanwhocodes/retry</code><a href="https://github.com/0"><code>@​0</code></a>.4.1 to avoid debug logs (<a href="https://redirect.github.com/eslint/eslint/issues/19102">#19102</a>) (Milos Djermanovic)</li>
</ul>
<h2>Documentation</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/d9279202e7d15452e44adf38451d33d4aaad3bd4"><code>d927920</code></a> docs: fix styles in no-js mode (<a href="https://redirect.github.com/eslint/eslint/issues/18916">#18916</a>) (Tanuj Kanti)</li>
<li><a href="https://github.com/eslint/eslint/commit/09bc2a88c00aa9a93c7de505795fc4e85b2e6357"><code>09bc2a8</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/39089c80a7af09494fce86a6574bf012cbe46d10"><code>39089c8</code></a> docs: add <code>no-useless-computed-key</code> examples with object patterns (<a href="https://redirect.github.com/eslint/eslint/issues/19109">#19109</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/895c60f7fe09f59df1e9490006220d3ec4b9d5b0"><code>895c60f</code></a> docs: add missing messageId property and suggestion properties (<a href="https://redirect.github.com/eslint/eslint/issues/19122">#19122</a>) (fnx)</li>
<li><a href="https://github.com/eslint/eslint/commit/298625eb65dc00bfa0a877ea46faada22021c23e"><code>298625e</code></a> docs: Change CLI -c to use flat config (<a href="https://redirect.github.com/eslint/eslint/issues/19103">#19103</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/522d8a32f326c52886c531f43cf6a1ff15af8286"><code>522d8a3</code></a> docs: add deprecation on <code>indent</code>, <code>quotes</code> and <code>semi</code> rule types (<a href="https://redirect.github.com/eslint/eslint/issues/19090">#19090</a>) (Marco Pasqualetti)</li>
</ul>
<h2>Chores</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/2967d91037ad670ea3a67fdb9c171b60d9af138b"><code>2967d91</code></a> chore: upgrade <code>@​eslint/js</code><a href="https://github.com/9"><code>@​9</code></a>.15.0 (<a href="https://redirect.github.com/eslint/eslint/issues/19133">#19133</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/b441bee6ad9807fef614bd071e6bd3e8b3307b2d"><code>b441bee</code></a> chore: package.json update for <code>@​eslint/js</code> release (Jenkins)</li>
<li><a href="https://github.com/eslint/eslint/commit/7d6bf4a250f97d8ff1e2606e3d769e016a32f45b"><code>7d6bf4a</code></a> chore: upgrade <code>@​eslint/core</code><a href="https://github.com/0"><code>@​0</code></a>.9.0 (<a href="https://redirect.github.com/eslint/eslint/issues/19131">#19131</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/902e70713de1ab67ede9ef8a3836fd2d09a759e5"><code>902e707</code></a> chore: upgrade <code>@​eslint/plugin-kit</code><a href="https://github.com/0"><code>@​0</code></a>.2.3 (<a href="https://redirect.github.com/eslint/eslint/issues/19130">#19130</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/5ff6c1dd09f32b56c05ab97f328741fc8ffb1f64"><code>5ff6c1d</code></a> chore: bump cross-spawn (<a href="https://redirect.github.com/eslint/eslint/issues/19125">#19125</a>) (Ian Bobinac)</li>
<li><a href="https://github.com/eslint/eslint/commit/cceccc771631011e04b37122b990205f0e8b6925"><code>cceccc7</code></a> chore: update dependency <code>@​eslint/json</code> to ^0.6.0 (<a href="https://redirect.github.com/eslint/eslint/issues/19117">#19117</a>) (renovate[bot])</li>
<li><a href="https://github.com/eslint/eslint/commit/0da3f732fe1776f8f79dac829b2cab4cedd4b6d8"><code>0da3f73</code></a> chore: update algolia referrer (<a href="https://redirect.github.com/eslint/eslint/issues/19114">#19114</a>) (Strek)</li>
<li><a href="https://github.com/eslint/eslint/commit/4f08332ac03e51002f8de6da5c5a362608205437"><code>4f08332</code></a> ci: unpin <code>trunk-io/trunk-action</code> (<a href="https://redirect.github.com/eslint/eslint/issues/19108">#19108</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/6b75683b47c346faaeb6c1dac8e168d64338c7b3"><code>6b75683</code></a> perf: optimize <code>text-table</code> by replacing regex with <code>trimEnd</code> (<a href="https://redirect.github.com/eslint/eslint/issues/19061">#19061</a>) (Nitin Kumar)</li>
</ul>
<h2>v9.14.0</h2>
<h2>Features</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/3fa009f25992d3d305437205be0ca145a0fb53f4"><code>3fa009f</code></a> feat: add support for Import Attributes and RegExp Modifiers (<a href="https://redirect.github.com/eslint/eslint/issues/19076">#19076</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/b0faee30e007a89bd7bdbc22a70223fabb99a541"><code>b0faee3</code></a> feat: add types for the <code>@eslint/js</code> package (<a href="https://redirect.github.com/eslint/eslint/issues/19010">#19010</a>) (Nitin Kumar)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/24d0172bbfb92cac663cb1631bd04e7539262066"><code>24d0172</code></a> fix: enable retry concurrency limit for readFile() (<a href="https://redirect.github.com/eslint/eslint/issues/19077">#19077</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/b44206725247d30b10cd58859c388949f5489087"><code>b442067</code></a> fix: Don't crash when directory is deleted during traversal. (<a href="https://redirect.github.com/eslint/eslint/issues/19067">#19067</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/d474443109762f3b92811df0411965cf64f595c2"><code>d474443</code></a> fix: avoid call stack overflow while processing globs (<a href="https://redirect.github.com/eslint/eslint/issues/19035">#19035</a>) (Livia Medeiros)</li>
</ul>
<h2>Documentation</h2>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/151c965aec1c46000ac7dfc67a1c04802112aafc"><code>151c965</code></a> docs: update <code>context.languageOptions.parser</code> description (<a href="https://redirect.github.com/eslint/eslint/issues/19084">#19084</a>) (Nitin Kumar)</li>
<li><a href="https://github.com/eslint/eslint/commit/dc34f94a2ed25b37ac4aafcabed7bfae582db77e"><code>dc34f94</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/f16e846ac004bc32e52cd3991d14d7a89374bbb5"><code>f16e846</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/ee0a77ea3caa5838bab704b54a577eefbed58f68"><code>ee0a77e</code></a> docs: change link from <code>@​types/eslint</code> to lib/types (<a href="https://redirect.github.com/eslint/eslint/issues/19049">#19049</a>) (Karl Horky)</li>
<li><a href="https://github.com/eslint/eslint/commit/50f03a119e6827c03b1d6c86d3aa1f4820b609e8"><code>50f03a1</code></a> docs: Clarify global ignores in config migration guide (<a href="https://redirect.github.com/eslint/eslint/issues/19032">#19032</a>) (Milos Djermanovic)</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.15.0 - November 15, 2024</p>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/2967d91037ad670ea3a67fdb9c171b60d9af138b"><code>2967d91</code></a> chore: upgrade <code>@​eslint/js</code><a href="https://github.com/9"><code>@​9</code></a>.15.0 (<a href="https://redirect.github.com/eslint/eslint/issues/19133">#19133</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/b441bee6ad9807fef614bd071e6bd3e8b3307b2d"><code>b441bee</code></a> chore: package.json update for <code>@​eslint/js</code> release (Jenkins)</li>
<li><a href="https://github.com/eslint/eslint/commit/7d6bf4a250f97d8ff1e2606e3d769e016a32f45b"><code>7d6bf4a</code></a> chore: upgrade <code>@​eslint/core</code><a href="https://github.com/0"><code>@​0</code></a>.9.0 (<a href="https://redirect.github.com/eslint/eslint/issues/19131">#19131</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/01557cec24203be72222858a3912da0a474ac75c"><code>01557ce</code></a> feat: Implement Language#normalizeLanguageOptions() (<a href="https://redirect.github.com/eslint/eslint/issues/19104">#19104</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/902e70713de1ab67ede9ef8a3836fd2d09a759e5"><code>902e707</code></a> chore: upgrade <code>@​eslint/plugin-kit</code><a href="https://github.com/0"><code>@​0</code></a>.2.3 (<a href="https://redirect.github.com/eslint/eslint/issues/19130">#19130</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/2edc0e2bdc40c4a6da8d526c82c0b6c582bae419"><code>2edc0e2</code></a> feat: add meta.defaultOptions (<a href="https://redirect.github.com/eslint/eslint/issues/17656">#17656</a>) (Josh Goldberg ✨)</li>
<li><a href="https://github.com/eslint/eslint/commit/fd33f1315ac59b1b3828dbab8e1e056a1585eff0"><code>fd33f13</code></a> fix: update types for <code>no-restricted-imports</code> rule (<a href="https://redirect.github.com/eslint/eslint/issues/19060">#19060</a>) (Nitin Kumar)</li>
<li><a href="https://github.com/eslint/eslint/commit/5ff6c1dd09f32b56c05ab97f328741fc8ffb1f64"><code>5ff6c1d</code></a> chore: bump cross-spawn (<a href="https://redirect.github.com/eslint/eslint/issues/19125">#19125</a>) (Ian Bobinac)</li>
<li><a href="https://github.com/eslint/eslint/commit/d9279202e7d15452e44adf38451d33d4aaad3bd4"><code>d927920</code></a> docs: fix styles in no-js mode (<a href="https://redirect.github.com/eslint/eslint/issues/18916">#18916</a>) (Tanuj Kanti)</li>
<li><a href="https://github.com/eslint/eslint/commit/bdec50e91baf9d5eefa07d97d2059fdebb53cdaa"><code>bdec50e</code></a> feat: fix <code>no-useless-computed-key</code> false negative with <code>__proto__</code> (<a href="https://redirect.github.com/eslint/eslint/issues/19123">#19123</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/09bc2a88c00aa9a93c7de505795fc4e85b2e6357"><code>09bc2a8</code></a> docs: Update README (GitHub Actions Bot)</li>
<li><a href="https://github.com/eslint/eslint/commit/bd35098f5b949ecb83e8c7e287524b28b2a3dd71"><code>bd35098</code></a> fix: switch away from Node.js node:assert and AssertionError (<a href="https://redirect.github.com/eslint/eslint/issues/19082">#19082</a>) (Josh Goldberg ✨)</li>
<li><a href="https://github.com/eslint/eslint/commit/39089c80a7af09494fce86a6574bf012cbe46d10"><code>39089c8</code></a> docs: add <code>no-useless-computed-key</code> examples with object patterns (<a href="https://redirect.github.com/eslint/eslint/issues/19109">#19109</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/895c60f7fe09f59df1e9490006220d3ec4b9d5b0"><code>895c60f</code></a> docs: add missing messageId property and suggestion properties (<a href="https://redirect.github.com/eslint/eslint/issues/19122">#19122</a>) (fnx)</li>
<li><a href="https://github.com/eslint/eslint/commit/cceccc771631011e04b37122b990205f0e8b6925"><code>cceccc7</code></a> chore: update dependency <code>@​eslint/json</code> to ^0.6.0 (<a href="https://redirect.github.com/eslint/eslint/issues/19117">#19117</a>) (renovate[bot])</li>
<li><a href="https://github.com/eslint/eslint/commit/0da3f732fe1776f8f79dac829b2cab4cedd4b6d8"><code>0da3f73</code></a> chore: update algolia referrer (<a href="https://redirect.github.com/eslint/eslint/issues/19114">#19114</a>) (Strek)</li>
<li><a href="https://github.com/eslint/eslint/commit/9db5b152c325a930130d49ca967013471c3ba0dc"><code>9db5b15</code></a> fix: unsafe report for <code>no-lonely-if</code> (<a href="https://redirect.github.com/eslint/eslint/issues/19087">#19087</a>) (Abraham Guo)</li>
<li><a href="https://github.com/eslint/eslint/commit/68fa497f6a11f1738dce85bb2bdd7a5f8b9f5d6d"><code>68fa497</code></a> fix: ignore files on a different drive on Windows (<a href="https://redirect.github.com/eslint/eslint/issues/19069">#19069</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/4f08332ac03e51002f8de6da5c5a362608205437"><code>4f08332</code></a> ci: unpin <code>trunk-io/trunk-action</code> (<a href="https://redirect.github.com/eslint/eslint/issues/19108">#19108</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/3087c9e95094cad1354aca2e4ae48c7bd2381184"><code>3087c9e</code></a> feat: add <code>meta</code> object to <code>@eslint/js</code> plugin (<a href="https://redirect.github.com/eslint/eslint/issues/19095">#19095</a>) (Francesco Trotta)</li>
<li><a href="https://github.com/eslint/eslint/commit/298625eb65dc00bfa0a877ea46faada22021c23e"><code>298625e</code></a> docs: Change CLI -c to use flat config (<a href="https://redirect.github.com/eslint/eslint/issues/19103">#19103</a>) (Nicholas C. Zakas)</li>
<li><a href="https://github.com/eslint/eslint/commit/4ce625a230778a41b856162df9ebcc57c25cc103"><code>4ce625a</code></a> fix: upgrade <code>@​humanwhocodes/retry</code><a href="https://github.com/0"><code>@​0</code></a>.4.1 to avoid debug logs (<a href="https://redirect.github.com/eslint/eslint/issues/19102">#19102</a>) (Milos Djermanovic)</li>
<li><a href="https://github.com/eslint/eslint/commit/522d8a32f326c52886c531f43cf6a1ff15af8286"><code>522d8a3</code></a> docs: add deprecation on <code>indent</code>, <code>quotes</code> and <code>semi</code> rule types (<a href="https://redirect.github.com/eslint/eslint/issues/19090">#19090</a>) (Marco Pasqualetti)</li>
<li><a href="https://github.com/eslint/eslint/commit/6b75683b47c346faaeb6c1dac8e168d64338c7b3"><code>6b75683</code></a> perf: optimize <code>text-table</code> by replacing regex with <code>trimEnd</code> (<a href="https://redirect.github.com/eslint/eslint/issues/19061">#19061</a>) (Nitin Kumar)</li>
</ul>
<p>v9.14.0 - November 1, 2024</p>
<ul>
<li><a href="https://github.com/eslint/eslint/commit/f36cb1649a85028fb3999ee2056ee467a907c061"><code>f36cb16</code></a> chore: upgrade <code>@​eslint/js</code><a href="https://github.com/9"><code>@​9</code></a>.14.0 (<a href="https://redirect...

_Description has been truncated_


Patch:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e295a5a..64d1b7e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -10,6 +10,8 @@
 また、実装に取り掛かるときは当該Issueに自分をアサインしてください(自分でできない場合は他メンバーに自分をアサインしてもらうようお願いしてください)。
 自分が実装するという意思表示をすることで、作業がバッティングするのを防ぎます。
 
+言語仕様の改変がある場合は、テストおよび[ドキュメント](https://github.com/aiscript-dev/aiscript-dev.github.io)の更新も同時にお願いします。
+
 ## Tools
 ### Vitest
 このプロジェクトではテストフレームワークとして[Vitest](https://vitest.dev)を導入しています。
diff --git a/README.md b/README.md
index 09afc5d..7e541ee 100644
--- a/README.md
+++ b/README.md
@@ -10,8 +10,6 @@
 
 [Play online ▶](https://aiscript-dev.github.io/aiscript/)
 
-[Read translated version (en)](./translations/en/README.md)
-
 AiScriptは、JavaScript上で動作する軽量スクリプト言語です。
 
 * 配列、オブジェクト、関数等をファーストクラスでサポート
@@ -22,11 +20,19 @@ AiScriptは、JavaScript上で動作する軽量スクリプト言語です。
 
 このリポジトリには、JavaScriptで実装されたパーサーと処理系が含まれます。
 
+[ドキュメントはこちらをご覧ください](https://aiscript-dev.github.io/ja/)
+
+[Read translated document](https://aiscript-dev.github.io/en/)
+
 ## Getting started (language)
-[See here](./docs/get-started.md)
+[はじめに（日本語）](https://aiscript-dev.github.io/ja/guides/get-started.html)
+
+[Get Started (en)](https://aiscript-dev.github.io/en/guides/get-started.html)
 
 ## Getting started (host implementation)
-todo
+[アプリに組み込む（日本語）](https://aiscript-dev.github.io/ja/guides/implementation.html)
+
+[Embedding into Your Application (en)](https://aiscript-dev.github.io/en/guides/implementation.html)
 
 ## Example programs
 ### Hello world
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..5e82059
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,8 @@
+# ドキュメント移動済み
+本ディレクトリ下にあったドキュメントは、開発用のものを除き専用Webサイトに移動されました。
+
+[該当issue](https://github.com/aiscript-dev/aiscript/issues/804)
+
+[移行先サイト](https://aiscript-dev.github.io/ja/)
+
+[移行先サイトのリポジトリ](https://github.com/aiscript-dev/aiscript-dev.github.io)
diff --git a/docs/builtin-props.md b/docs/builtin-props.md
deleted file mode 100644
index 2dec6db..0000000
--- a/docs/builtin-props.md
+++ /dev/null
@@ -1,264 +0,0 @@
-[Read translated version (en)](../translations/en/docs/builtin-props.md)
-
-組み込みプロパティとは、型ごとに用意された特殊な値あるいは関数です。  
-オブジェクトのプロパティのように`.<name>`の記法で呼び出すことができます。（`[<str>]`の記法は使えません）
-```js
-// 例
-'ai kawaii'.len //9
-
-Core:range(0,2).push(4) //[0,1,2,4]
-```
-今の所、数値・文字列・配列・エラー型に対応するものが用意されています。オブジェクトのそれに相当するものは、記法との兼ね合いで[std関数](std.md#-obj)として実装されています。
-
-## 書式
-本ページでは、（型名）型の任意の値に対する組み込みプロパティを下記のような形式で表記します。
-> #(_v_: 型名).プロパティ名  
-> // または  
-> @(_v_: 型名).組み込みメソッド名(引数リスト): 返り値の型  
-
-\#から始まるものは関数以外の値を持つ組み込みプロパティです。
-\@から始まるものは関数の組み込みプロパティ（組み込みメソッド）です。
-
-## 数値
-### @(_x_: num).to_str(): str
-数値を文字列に変換します。  
-
-### @(_x_: num).to_hex(): str
-数値から16進数の文字列を生成します。  
-
-## 文字列
-### #(_v_: str).len
-型: `num`  
-文字列の長さを取得します。  
-
-### @(_v_: str).to_num(): num | null
-文字列が数字であれば、数値に変換します。  
-
-### @(_v_: str).to_arr(): `arr<str>`
-文字列を書記素クラスタ毎に区切り、配列にしたものを返します。  
-文字列に孤立サロゲートが含まれない場合、孤立サロゲートを返すことはありません。  
-
-### @(_v_: str).to_unicode_arr(): `arr<str>`
-文字列を Unicode コードポイント毎に区切り、配列にしたものを返します。  
-書記素クラスタは分割されます。  
-文字列に孤立サロゲートが含まれない場合、孤立サロゲートを返すことはありません。  
-
-### @(_v_: str).to_unicode_codepoint_arr(): `arr<num>`
-文字列を Unicode コードポイント毎に区切り、それぞれ[コードポイント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt)値を取得し配列にしたものを返します。  
-文字列に孤立サロゲートが含まれない場合、孤立サロゲートを返すことはありません。  
-
-### @(_v_: str).to_char_arr(): `arr<str>`
-文字列を UTF-16 コード単位毎に区切り、配列にしたものを返します。  
-文字列にサロゲートペアが含まれる場合、上位と下位それぞれ孤立サロゲートを返します。
-
-### @(_v_: str).to_charcode_arr(): `arr<num>`
-文字列を UTF-16 コード単位毎に区切り、それぞれ[UTF-16 コード単位を表す `0` から `65535` までの整数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt)を取得し配列にしたものを返します。  
-文字列にサロゲートペアが含まれる場合、上位と下位それぞれ孤立サロゲートを返します。
-
-### @(_v_: str).to_utf8_byte_arr(): `arr<num>`
-文字列を UTF-8 エンコードし、各バイト毎の `0` から `255` までの整数値を取得し配列にしたものを返します。  
-
-### @(_v_: str).pick(_i_: num): str | null
-文字列中の _i_ 番目の文字を取得します。  
-
-### @(_v_: str).incl(_keyword_: str): bool
-文字列中に _keyword_ が含まれていれば`true`、なければ`false`を返します。  
-
-### @(_v_: str).starts_with(_prefix_: str, _start\_index_?: num): bool
-文字列が _prefix_ で始まっていれば`true`、そうでなければ`false`を返します。\
-_prefix_ が空文字列の場合は常に`true`を返します。\
-_start\_index_ が指定されている場合、そのインデックスから始めます。\
-_start\_index_ が`v.len`より大きいか`-v.len`より小さい場合は`false`を返します。\
-_start\_index_ が負の場合は末尾から数えます。
-
-### @(_v_: str).ends_with(_suffix_: str, _end\_index_?: num): bool
-文字列が _suffix_ で終わっていれば`true`、そうでなければ`false`を返します。\
-_suffix_ が空文字列の場合は常に`true`を返します。\
-_end\_index_ が指定されている場合、そのインデックスの直前を末尾とします。（省略時は`v.len`）\
-_end\_index_ が`v.len`より大きいか`-v.len`より小さい場合は`false`を返します。\
-_end\_index_ が負の場合は末尾から数えます。
-
-### @(_v_: str).slice(_begin_: num, _end_: num): str
-文字列の _begin_ 番目から _end_ 番目の直前までの部分を取得します。  
-
-### @(_v_: str).split(_splitter_?: str): arr<str>
-文字列を _splitter_ がある場所で区切り、配列にしたものを返します。  
-_splitter_ が与えられなければ一文字づつ区切ります。  
-
-### @(_v_: str).replace(_old_: str, _new_: str): str
-文字列中の _old_ を _new_ に置換したものを返します。  
-
-### @(_v_: str).index_of(_search_: str, _fromIndex_?: num): num
-文字列中から_search_を探し、その添字を返します。  
-_fromIndex_が指定されていれば、その位置から検索を開始します。  
-_fromIndex_が負値の時は末尾からの位置（文字列の長さ+_fromIndex_）が使用されます。  
-該当が無ければ-1を返します。
-
-### @(_v_: str).pad_start(_width_: num, _pad_?: str): str
-文字列の長さがが _width_ になるように、先頭を _pad_ の繰り返しで埋めた新しい文字列を返します。\
-_pad_ を省略した場合、空白`' '`で埋められます。\
-_pad_ が長すぎる場合、_pad_ の末尾が切り捨てられます。
-
-### @(_v_: str).pad_end(_width_: num, _pad_?: str): str
-文字列の長さがが _width_ になるように、末尾を _pad_ の繰り返しで埋めた新しい文字列を返します。\
-_pad_ を省略した場合、空白`' '`で埋められます。\
-_pad_ が長すぎる場合、_pad_ の末尾が切り捨てられます。
-
-### @(_v_: str).trim(): str
-文字列の前後の空白を取り除いたものを返します。
-
-### @(_v_: str).upper(): str
-文字列中の英字を大文字に変換して返します。
-
-### @(_v_: str).lower(): str
-文字列中の英字を小文字に変換して返します。
-
-### @(_v_: str).charcode_at(_i_: num): num | null
-_i_ 番目のにある [UTF-16 コード単位を表す `0` から `65535` までの整数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt)を返します。  
-インデックスは UTF-16 コード単位に基づきます。  
-文字列にサロゲートペアが含まれる場合、位置によって上位または下位の孤立サロゲートを返すことがあります。  
-_i_ 番目の文字が存在しない場合は null が返されます。  
-
-### @(_v_: str).codepoint_at(_i_: num): num | null
-_i_ 番目の文字の[コードポイント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt)を取得します。  
-インデックスは UTF-16 コード単位に基づきます。  
-文字列にサロゲートペアが含まれ、指定位置が下位のサロゲートである場合、下位の孤立サロゲートを返します。  
-_i_ 番目の文字が存在しない場合は null が返されます。  
-
-## 配列
-### #(_v_: arr).len
-型: `num`  
-配列の要素数を取得します。
-
-### @(_v_: arr).at(_index_: num, _otherwise_?: value): value
-配列の _index_ の位置の要素を返します。\
-_index_ が負の場合は末尾から数えます。\
-_index_ が範囲外の場合は、代わりに _otherwise_ を返します。\
-_otherwise_ が省略されている場合は`null`になります。
-
-### @(_v_: arr).push(_i_: value): null
-**【この操作は配列を書き換えます】**  
-配列の最後に要素を追加します。  
-
-### @(_v_: arr).unshift(i: value): null
-**【この操作は配列を書き換えます】**  
-配列の最初に要素を追加します。  
-
-### @(_v_: arr).pop(): value
-**【この操作は配列を書き換えます】**  
-配列の最後の要素を取り出します。  
-
-### @(_v_: arr).shift(): value
-**【この操作は配列を書き換えます】**  
-配列の最初の要素を取り出します。  
-
-### @(_a_: arr).concat(_b_: arr): arr
-配列を連結します。  
-
-### @(_v_: arr<str>).join(_joiner_?: str): str
-文字列の配列を結合して一つの文字列として返します。  
-
-### @(_v_: arr).slice(_begin_: num, _end_: num): arr
-配列の _begin_ 番目から _end_ 番目の部分を切り出して返します。
-
-### @(_v_: arr).incl(_i_: value): bool
-配列に指定した値が含まれているかどうかを返します。  
-
-### @(_v_: arr).map(_func_: fn): arr
-配列の各要素に対し _func_ を非同期的に呼び出します。
-それぞれの要素を _func_ の返り値で置き換えたものを返します。  
-
-### @(_v_: arr).filter(_func_: fn): arr
-配列の要素のうち _func_ が true を返すようなもののみを抜き出して返します。  
-順序は維持されます。  
-
-### @(_v_: arr).reduce(_func_: Callback, _initial_: value): value
-`Callback`: @(_acm_: value, _item_: value, _index_: num): value  
-配列の各要素に対し _func_ を順番に呼び出します。  
-各呼び出しでは、前回の結果が第1引数 _acm_ として渡されます。  
-_initial_ が指定された場合は初回呼び出しの引数が(_initial_, _v_\[0], 0)、  
-指定されなかった場合は(_v_\[0], _v_\[1], 1)となります。  
-配列が空配列であり、かつ _initial_ が指定されていない場合はエラーになります。従って基本的には _initial_ を指定しておくことが推奨されています。  
-
-### @(_v_: arr).find(_func_: @(_item_: value, _index_: num) { bool }): value
-配列から _func_ が true を返すような要素を探し、その値を返します。  
-
-### @(_v_: arr).index_of(_val_: value, _fromIndex_?: num): num
-配列から_val_と同じ値を探し、その添字を返します。  
-_fromIndex_が指定されていれば、その位置から検索を開始します。  
-_fromIndex_が負値の時は末尾からの位置（配列の長さ+_fromIndex_）が使用されます。  
-該当が無ければ-1を返します。
-
-### @(_v_: arr).reverse(): null
-**【この操作は配列を書き換えます】**  
-配列を反転させます。  
-
-### @(_v_: arr).copy(): arr
-配列のコピーを生成します。  
-シャローコピーであり、配列やオブジェクトの参照は維持されます。  
-
-### @(_v_: arr).sort(_comp_: @(_a_: value, _b_: value)): arr
-**【この操作は配列を書き換えます】**  
-配列の並べ替えをします。第1引数 _comp_ として次のような比較関数を渡します。  
-安定ソートです。
-* _a_ が _b_ より順番的に前の時、負の値を返す
-* _a_ が _b_ より順番的に後の時、正の値を返す
-* _a_ が _b_ と順番的に同等の時、0を返す
-
-数値の並び替えでは`Core:sub`を渡すことで昇順、`@(a,b){b-a}`を渡すことで降順ソートができます。  
-文字列用の比較関数として`Str:lt`（昇順）, `Str:gt`（降順）が用意されています。詳しくは[std.md](std.md#-str)をご覧下さい。  
-
-### @(_v_: arr).fill(_val_?: value, _fromIndex_?: num, _toIndex_?: num): arr
-**【この操作は配列を書き換えます】**  
-配列の _fromIndex_ から _toIndex_ までの範囲の要素を _val_ で置き換えます。  
-_val_ 省略時は`null`で置き換えます。  
-_fromIndex_ および _toIndex_ に関する挙動は`arr.slice`に準拠します。  
-
-### @(_v_: arr).repeat(_times_: num): arr
-配列を _times_ 回繰り返した配列を作成します。  
-`arr.copy`同様シャローコピーであり、配列やオブジェクトの参照は維持されます。  
-_times_ には0以上の整数値を指定します。それ以外ではエラーになります。  
-
-### @(_v_: arr).splice(_index_: num, _remove_count_?: num, _items_?: arr\<value>): arr\<value>
-**【この操作は配列を書き換えます】**  
-配列の _index_ から _remove_count_ 個の要素を取り除き、その位置に _items_ の要素を挿入します。  
-返り値として、取り除いた要素の配列を返します。\
-_index_ が負の場合は末尾から数えます。\
-_index_ が最後の要素より後の場合は要素を取り除かず、挿入は末尾に追加します。\
-_remove_count_ を省略した場合、末尾まで取り除きます。\
-_items_ を省略した場合、何も挿入しません。
-
-### @(_v_: arr).flat(_depth_?: num): arr
-配列に含まれる配列を _depth_ で指定した深さの階層まで結合した新しい配列を作成します。  
-_depth_ には0以上の整数値を指定します。省略時は1になります。  
-
-### @(_v_: arr).flat_map(_func_: @(_item_: value, _index_: num) { value }): arr
-配列の各要素を _func_ の返り値で置き換えた後、1階層平坦化した新しい配列を作成します。  
-_func_ は非同期的に呼び出されます。
-
-### @(_v_: arr).insert(_index_: num, _item_: value): null
-**【この操作は配列を書き換えます】**  
-配列の _index_ の位置に _item_ を挿入します。\
-_index_ が負の場合は末尾から数えます。\
-_index_ が最後の要素より後の場合は末尾に追加します。
-
-### @(_v_: arr).remove(_index_: num): value | null
-**【この操作は配列を書き換えます】**  
-配列から _index_ の位置の要素を取り除き、その要素を返します。\
-_index_ が負の場合は末尾から数えます。\
-_index_ が最後の要素より後の場合は取り除かず、`null`を返します。
-
-### @(_v_: arr).every(_func_: @(_item_: value, _index_: num) { bool }): bool
-配列の全ての要素に対して _func_ が true を返す時のみ true 返します。空配列には常に true を返します。
-
-### @(_v_: arr).some(_func_: @(_item_: value, _index_: num) { bool }): bool
-配列の要素に対して _func_ が true を返す要素が存在する時のみ true 返します。
-
-## エラー型
-### #(_v_: error).name
-型: `str`  
-エラーの識別子となる文字列を取得します。
-
-### #(_v_: error).info
-型: `value`  
-エラーに付加情報がある場合、それを取得します。
diff --git a/docs/execution.md b/docs/execution.md
deleted file mode 100644
index 0240ba9..0000000
--- a/docs/execution.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# 実行方法
-## 1. Playgroundから実行
-自分でホストする場合は、以下のコマンドを実行し表示されたリンクをブラウザで開きます。
-```
-cd playground
-npm run build
-npm run serve
-```
-
-PlaygroundはGitHubでもホストされています：\
-https://aiscript-dev.github.io/aiscript/
-
-## 2. スクリプトファイルから実行
-ファイルの内容を解析して実行します。
-
-プロジェクトルートに`main.ais`を作成し、以下の内容を記述しファイルに保存します。
-```
-<: "Hello world!"
-```
-
-以下のコマンドを実行します。
-```
-$ npm run start
-```
-
-## 3. スクリプトファイルを解析する (パーサーのデバッグ向け)
-ファイルの内容を解析してASTを表示することができます。
-主にパーサーのデバッグ向けで、インタプリタの実装状況に関わらずASTの内容を表示することができます。
-
-プロジェクトルートに`main.ais`を作成し、以下の内容を記述しファイルに保存します。
-```
-<: "Hello world!"
-```
-
-以下のコマンドを実行します。
-```
-$ npm run parse
-```
-
-## 4. REPL上で実行
-コマンドライン上で対話的にコードを実行します。
-以下のコマンドを実行し、コードを入力します。
-```
-$npm run repl
-```
diff --git a/docs/get-started.md b/docs/get-started.md
deleted file mode 100644
index 77f8a46..0000000
--- a/docs/get-started.md
+++ /dev/null
@@ -1,274 +0,0 @@
-# Getting started
-
-[Read translated version (en)](../translations/en/docs/get-started.md)
-
-## Introduction
-AiScript(あいすくりぷと)は、プログラミング言語です。
-このドキュメントでは、既にある程度のプログラミングの知識があることを前提にしています。
-したがってAiScriptの構文、仕様などについてだけ書き、プログラミング自体についての説明は省きます。
-
-参考：[syntax.md](./syntax.md)
-
-## Hello, world!
-AiScriptでは、次のように書きます:
-```
-print("Hello, world!")
-```
-
-`print( ~ )`は関数呼び出しです。カッコの前に呼び出す関数名を書き、カッコの中に引数を書きます。
-引数が複数あるときは`,`で区切って列挙します。
-関数についての詳細は後述します。
-
-`"~"`は文字列リテラルです。`"`で囲ったものが文字列になります。
-
-ちなみに、`print( ~ )`には糖衣構文があり、次のようにも書けます:
-```js
-<: "Hello, world!"
-```
-
-## コメント
-AiScriptのコメントは`//`で始めます。
-コメントはプログラムの動作に影響を与えません。
-
-```
-// this is a comment
-```
-
-複数行にわたってコメントアウトする場合、`/*` `*/`で囲みます。  
-
-```
-/*
-this is a comment
-*/
-```
-## 組み込み型
-<table>
-	<tr><th>名称</th><th>型名</th><th>リテラル例</th></tr>
-	<tr><td>文字列</td><td><code>str</code></td><td><code>"kawaii"</code></td></tr>
-	<tr><td>数値</td><td><code>num</code></td><td><code>42</code></td></tr>
-	<tr><td>真理値</td><td><code>bool</code></td><td><code>true</code>/<code>false</code></td></tr>
-	<tr><td>配列</td><td><code>arr</code></td><td><code>["ai" "chan" "cute"]</code></td></tr>
-	<tr><td>オブジェクト</td><td><code>obj</code></td><td><code>{ foo: "bar"; a: 42; }</code></td></tr>
-	<tr><td>null</td><td><code>null</code></td><td><code>null</code></td></tr>
-	<tr><td>関数</td><td><code>fn</code></td><td><code>@(x) { x }</code></td></tr>
-	<tr><td>エラー</td><td><code>error</code></td><td><code>(TODO)</code></td></tr>
-</table>
-
-## 変数
-### 宣言
-変数宣言は次のように書きます:
-```
-let message = "Hello"
-```
-
-`let`のあとに変数名を書き、`=`の後に値を書きます。
-
-AiScriptではこの方法で宣言した変数はイミュータブルです。つまり、変数の値を後から変えることは出来ません。
-再代入可能な変数を作る時は、`let`の代わりに`var`で変数宣言します。例:
-```
-// ミュータブルな変数を宣言
-var message = "Hello"
-
-// 再代入
-message = "Hi"
-
-// また再代入
-message = "Yo"
-```
-なお、同一スコープ内での変数の再宣言は禁止されています。
-
-### 参照
-変数の値を参照する時は、単に変数名を書きます:
-```
-print(message)
-```
-
-## 配列
-`[]`の中に式をスペースで区切って列挙します。
-```
-["ai", "chan", "kawaii"]
-```
-
-配列の要素にアクセスするときは、`[<index>]`と書きます。
-インデックスは0始まりです。
-```
-let arr = ["ai", "chan", "kawaii"]
-<: arr[0] // "ai"
-<: arr[2] // "kawaii"
-```
-
-## オブジェクト
-AiScriptにおけるオブジェクトは文字列のみをキーとした連想配列のようなものとなっています。  
-キーと値から構成される各要素をプロパティと呼びます。  
-この時キーをプロパティ名と呼びます。  
-`{}`の中にプロパティを`,`/`;`/空白で区切って列挙します。
-プロパティ名と値は`: `で区切ります。
-```
-{
-	foo: "bar"
-	answer: 42
-	nested: {
-		some: "thing"
-	}
-}
-```
-
-オブジェクトのプロパティにアクセスするときは、
-`.<name>`か`[<str>]`と書きます。
-```
-let obj = {foo: "bar", answer: 42}
-<: obj.foo // "bar"
-<: obj["answer"] // 42
-```
-
-## 演算
-演算は、
-```
-(1 + 1)
-```
-のように書きます。これは標準関数（後述）呼び出しの糖衣構文で、実際にはこのように解釈されます:
-```
-Core:add(1, 1)
-```
-詳しくは→[syntax.md](/docs/syntax.md#%E6%BC%94%E7%AE%97%E5%AD%90)
-
-## ブロック式
-ブロック式 `eval { ~ }` を使うと、ブロック内で最後に書かれた式が値として返されます。
-```
-let foo = eval {
-	let a = 1
-	let b = 2
-	(a + b)
-}
-
-<: foo // 3
-```
-
-## 条件分岐
-AiScriptでの条件分岐は、次のように書きます:
-```
-if (a == b) {
-	<: "a equals to b"
-}
-```
-
-`if`の後にboolを返す式(条件)を書き、その後に条件に一致した場合に評価される式(then節)を書きます。
-then節の後に`else`を書き、さらに式を追加することで条件に一致しなかった場合の処理も行うことが出来ます:
-```
-if (a == b) {
-	<: "a equals to b"
-} else {
-	<: "a does not equal to b"
-}
-```
-
-`elif`の後に条件式を書くことで条件判定を複数行うことも出来ます:
-```
-if (a == b) {
-	<: "a equals to b"
-} elif (a > b) {
-	<: "a is greater than b"
-} else {
-	<: "a is less than b"
-}
-```
-
-これらの条件分岐は式なので、ブロック内で値を返せます:
-```
-<: if (a == b) {
-	"a equals to b"
-} elif (a > b) {
-	"a is greater than b"
-} else {
-	"a is less than b"
-}
-```
-
-## 繰り返し
-AiScriptでの繰り返しは、次のように書きます:
-```
-for (let i, 100) {
-	<: i
-}
-```
-`for`の後にイテレータ変数名を書き、`,`の後に繰り返し回数を返す式を書きます。その後のブロックで繰り返す処理を書きます。
-イテレータ変数は省略することも出来ます:
-```
-for (100) {
-	<: "yo"
-}
-```
-
-## 繰り返し(配列)
-`each`を使うと、配列の各アイテムに対し処理を繰り返すことができます:
-```
-let items = ["a", "b", "c"]
-each (let item, items) {
-	<: item
-}
-```
-
-## 関数
-### 関数定義
-次のように書きます:
-```
-@fn(x) {
-	(x * 2)
-}
-```
-
-`@`の後に関数名を書き、カッコの中に引数定義を書きます。その後にブロックが関数の処理になります。
-
-### return
-関数の最後に書かれた式の値が関数の返り値になりますが、関数の途中で値を返したい時は`return`を使います。
-
-### 標準定数、標準関数
-何も書かなくても最初から使える定数・関数です。
-
-[標準定数・関数一覧](./std.md)
-
-### 組み込みプロパティ
-オブジェクト以外の値に`.`をつけて呼び出すことができる擬似的なプロパティです。
-
-[組み込みプロパティ一覧](./builtin-props.md)
-
-## テンプレート
-バッククォートを使うと、文字列の中に変数や式を埋め込めます:
-```
-let ai = "kawaii"
-<: `Hello, {ai} world!`
-// 結果: Hello, kawaii world!
-```
-
-## メタデータ
-AiScriptファイルにメタデータを埋め込める機能です。
-```
-### {
-	name: "example"
-	version: 42
-	keywords: ["foo", "bar", "baz"]
-}
-```
-
-## エラー型
-一部の標準関数は実行失敗時にエラー型の値を返します。  
-これによりエラー処理を行うことができます。  
-```
-@validate(str){
-	let v=Json:parse(str)
-	if (Core:type(v)=='error') print(v.name)
-	else print('successful')
-}
-```
-
-## エラーメッセージ
-進行不能なエラーが発生するとエラーメッセージが表示されます。  
-```
-let scores=[10, 8, 5, 5]
-let 3rd=scores[2] // unexpected token: NumberLiteral (Line 2, Column 5)
-```
-```
-let arr=[]
-arr[0] // Runtime: Index out of range. Index: 0 max: -1 (Line 2, Column 4)
-```
-行(Line)、列(Column)は1始まりです。
diff --git a/docs/keywords.md b/docs/keywords.md
deleted file mode 100644
index 4f3e2aa..0000000
--- a/docs/keywords.md
+++ /dev/null
@@ -1,24 +0,0 @@
-## 予約語について
-AiScriptにおける予約語とは、変数や関数の名前として使用することが禁止されている単語のことを言います。  
-使用するとSyntax Errorとなります。  
-```js
-// matchとforは予約語
-let match=null // エラー
-@for(){ print('hoge') } // エラー
-```
-
-## 使用中の語と使用予定の語
-`match`や`for`は文法中で既にキーワードとして使用されています。  
-もしこれらが変数名として使用されると、プログラムの見た目が紛らわしいものになるだけでなく、文法解析上のコストが増加します。  
-ゆえに文法中のキーワードは基本的に全て予約語となっています。  
-
-一方で、いくつかの単語は文法中に存在しないにも関わらず予約語となっています。  
-これは将来文法が拡張された時に使用される可能性を見越してのものです。  
-
-## 一覧
-以下の単語が予約語として登録されています。  
-### 使用中の語
-`null`, `true`, `false`, `each`, `for`, `loop`, `break`, `continue`, `match`, `case`, `default`, `if`, `elif`, `else`, `return`, `eval`, `var`, `let`, `exists`
-
-### 使用予定の語
-`as`, `async`, `attr`, `attribute`, `await`, `catch`, `class`, `component`, `constructor`, `dictionary`, `do`, `enum`, `export`, `finally`, `fn`, `hash`, `in`, `interface`, `out`, `private`, `public`, `ref`, `static`, `struct`, `table`, `this`, `throw`, `trait`, `try`, `undefined`, `use`, `using`, `when`, `while`, `yield`, `import`, `is`, `meta`, `module`, `namespace`, `new`
diff --git a/docs/literals.md b/docs/literals.md
deleted file mode 100644
index 4e58fa0..0000000
--- a/docs/literals.md
+++ /dev/null
@@ -1,132 +0,0 @@
-## リテラル式
-AiScriptにおけるリテラルとは、値を文字列として書き表すための表記法です。  
-リテラルはスクリプト中でそのまま式として使用することができます。  
-null、真理値、数値、文字列、オブジェクト、関数のリテラルが存在しています。  
-
-### null
-```js
-null
-```
-
-### 真理値
-```js
-true
-false
-```
-
-### 数値
-十進以外の記数法はサポートされていません。  
-```js
-12 // 自然数
--34 // 負数
-52.448 // 小数
-```
-※負数を表す`-`は数値リテラルのみで使用できます。`-variable`のような表記はサポートされていません。
-
-### 文字列
-`'`または`"`が使用可能な通常の文字列リテラルと、`` ` ``を使用し文中に式を含むことができるテンプレートリテラルがあります。
-
-#### エスケープについて
-`\`を前置した文字は、構文の一部ではなく一つの文字として解釈されます。  
-例えば`'\''`は`'`、  
-`"\""`では`"`、  
-``` `\`` ```は`` ` ``、  
-`` `\{` ``は`{`、として解釈されます。  
-特に構文としての意味を持たない文字の場合、単に`\`が無視されます。例：`'\n'` → `n`  
-文字`\`を使用したい場合は`'\\'`のように２つ繋げてください。  
-エスケープシーケンスは未サポートです。  
-
-#### 文字列リテラル
-```js
-'ここでは"を文字列に含むことができます'
-"ここでは'を文字列に含むことができます"
-'エスケープすれば\'を含むことができます'
-"エスケープすれば\"を含むことができます"
-'改行
-できます'
-"改行 // ここにコメントを書くと文字列の一部になります
-できます" // ここは問題なし
-```
-
-#### テンプレートリテラル
-変数や式を埋め込んだ文字列を作成するためのリテラルです。  
-全体を`` ` ` ``で囲い、式を埋め込む場所は`{ }`で囲います。  
-式の値が文字列でない場合は、[Core:to_str](./std.md)と同じ方法で文字列に変換されます。  
-```js
-<: `Ai chan is No.{ 2-1 }` // Ai chan is No.1
-// 改行可　一行にしたい場合は{ Str:lf }を使う
-`This statement is { true }.
-Previous statement is { !true }.`
-// \を前置することで`、{、}、をエスケープできる
-`\` \{ \}` // ` { }
-```
-```js
-// { }の中身が空であってはならない（{ }を文字列として使いたい場合はエスケープすること）
-`Everything is { } here.` // Syntax Error
-// 式の前後で改行をしてはならない（式中で改行するのは可）
-`Oops, something went {
-	'wrong'
-}!` // Syntax Error
-```
-
-### 配列
-```js
-[] // 空の配列
-[1, 1+1, 1+1+1] // コロンで区切ることも出来る
-[1, 1+1, 1+1+1,] // 最後の項に,をつけてもよい
-[  // 改行区切りも可
-	'hoge'
-	'huga'
-	'piyo'
-]
-[  // コロンと改行の併用可
-	'hoge',
-	'huga',
-	'piyo',
-]
-```
-```js
-[1 2 3] // 空白区切りは廃止済み
-```
-
-### オブジェクト
-```js
-{} // 空のオブジェクト
-{ // 改行区切り
-	a: 12
-	b: 'hoge'
-}
-{a: 12,b: 'hoge'} // コロン区切り
-```
-```js
-// 空白区切りは廃止済み
-{a: 12 b: 'hoge'} // Syntax Error
-// セミコロン区切りは廃止済み
-{a: 12; b: 'hoge'} // Syntax Error
-```
-
-### 関数
-関数のリテラルは「無名関数」と呼ばれており、[関数の宣言](./syntax.md#%E9%96%A2%E6%95%B0)とよく似た形をしていますが、関数名がありません。（そして、リテラルなので当然ながら、文ではなく式です）  
-```js
-var func = @(){} // 何もしない関数
-// 最後の式が暗黙にreturnされる
-func = @(x, y) {
-	x + y
-}
-<: func(1, 2) // 3
-// 明示的にreturnを書くこともできる
-@(x, y) {
-	return x + y
-}
-// 引数を複数行で書いてもよい
-@(
-	x,
-	y
-) {
-	x + y
-}
-@(x,y){x+y} // ワンライナー
-```
-
-### エラー型
-エラー型のリテラルはありませんが、[Error:create](./std.md)で値を作ることができます。  
diff --git a/docs/std-math.md b/docs/std-math.md
deleted file mode 100644
index 987462f..0000000
--- a/docs/std-math.md
+++ /dev/null
@@ -1,146 +0,0 @@
-# Math
-数学・数値計算関連の標準定数・関数には`Math:`の名前空間が付与されています。
-
-## 定数
-型は全て`num`です。
-<table>
-	<tr><th>定数名</th><th>説明</th><th>概算値</th></tr>
-	<tr><td><code>Math:Infinity</code></td><td>無限大</td><td>なし</td></tr>
-	<tr><td><code>Math:E</code></td><td>ネイピア数e</td><td><code>2.718281828459045</code></td></tr>
-	<tr><td><code>Math:LN2</code></td><td>2の自然対数</td><td><code>0.6931471805599453</code></td></tr>
-	<tr><td><code>Math:LN10</code></td><td>10の自然対数</td><td><code>2.302585092994046</code></td></tr>
-	<tr><td><code>Math:LOG2E</code></td><td>2を底としたeの対数</td><td><code>1.4426950408889634</code></td></tr>
-	<tr><td><code>Math:LOG10E</code></td><td>10を底としたeの対数</td><td><code>0.4342944819032518</code></td></tr>
-	<tr><td><code>Math:PI</code></td><td>円周率π</td><td><code>3.141592653589793</code></td></tr>
-	<tr><td><code>Math:SQRT1_2</code></td><td>√(1/2)</td><td><code>0.7071067811865476</code></td></tr>
-	<tr><td><code>Math:SQRT2</code></td><td>√2</td><td><code>1.4142135623730951</code></td></tr>
-</table>
-
-## 基本的な関数
-### @Math:abs(_x_: num): num
-絶対値を計算します。  
-
-### @Math:sign(_x_: num): num
-_x_ が正であれば1、負であれば-1、0または-0であればそのままの値を返します。  
-いずれでもなければNaNを返します。  
-
-### @Math:round(_x_: num): num
-四捨五入して、もっとも近い整数を返します。
-
-### @Math:ceil(_x_: num): num
-引数以上の最小の整数を返します。
-
-### @Math:floor(_x_: num): num
-引数以下の最大の整数を返します。
-
-### @Math:trunc(_x_: num): num
-引数の小数部を切り捨て、整数部を返します。
-
-### @Math:min(_a_: num, _b_: num): num
-小さい方の値を取得します。  
-
-### @Math:max(_a_: num, _b_: num): num
-大きい方の値を取得します。  
-
-### @Math:sqrt(_x_: num): num
-正の平方根を計算します。  
-
-### @Math:cbrt(_x_: num): num
-立方根を計算します。  
-
-### @Math:hypot(_vs_: arr): num
-_vs_ の要素をそれぞれ自乗してから合計した値の正の平方根を返します。  
-
-## 三角関数
-角度の単位はラジアンです。
-### @Math:sin(_rad_: num): num
-正弦を計算します。  
-
-### @Math:cos(_rad_: num): num
-余弦を計算します。  
-
-### @Math:tan(_rad_: num): num
-正接を計算します。  
-
-### @Math:asin(_x_: num): num
-逆正弦を計算します。  
-
-### @Math:acos(_x_: num): num
-逆余弦を計算します。  
-
-### @Math:atan(_x_: num): num
-逆正接を計算します。  
-
-### @Math:atan2(_y_: num, _x_: num): num
-_y_ /_x_ の正接を返しますが、_x_ が負値の場合はπだけずれた値を返します。
-
-## 双曲線関数
-### @Math:sinh(_x_: num): num
-双曲線正弦を計算します。  
-
-### @Math:cosh(_x_: num): num
-双曲線余弦を計算します。  
-
-### @Math:tanh(_x_: num): num
-双曲線正接を計算します。  
-
-### @Math:asinh(_x_: num): num
-双曲線逆正弦を計算します。  
-
-### @Math:acosh(_x_: num): num
-双曲線逆余弦を計算します。  
-
-### @Math:atanh(_x_: num): num
-双曲線逆正接を計算します。  
-
-## 指数・対数関数
-### @Math:pow(_x_: num, _y_: num): num
-_x_ の _y_ 乗を計算します。内部的にJavascriptの`**`演算子ではなく`Math.pow`関数を用いている点を除き、ほぼ`Core:pow`と同じものです。
-
-### @Math:exp(_x_: num): num
-eの _x_ 乗を計算します。  
-
-### @Math:expm1(_x_: num): num
-eの _x_ 乗から1を引いた値を計算します。  
-### @Math:log(_x_: num): num
-自然対数を計算します。**常用対数には`Math:log10`を使用して下さい。**  
-
-### @Math:log1p(_x_: num): num
-_x_ +1の自然対数を計算します。
-
-### @Math:log10(_x_: num): num
-10を底とした対数を計算します。
-
-### @Math:log2(_x_: num): num
-2を底とした対数を計算します。
-
-## 乱数
-### @Math:rnd(_min_?: num, _max_?: num): num
-乱数を生成します。  
-_min_ および _max_ を渡した場合、_min_ <= x, x <= _max_ の整数、  
-渡していない場合は 0 <= x, x < 1 の 小数が返されます。  
-
-### @Math:gen_rng(_seed_: num | str, _options_?: obj): @(_min_?: num, _max_?: num)
-シードから乱数生成機を生成します。  
-生成された乱数生成器は、_min_ および _max_ を渡した場合、_min_ <= x, x <= _max_ の整数、  
-渡していない場合は 0 <= x, x < 1 の浮動小数点数を返します。  
-_options_ に渡したオブジェクトを通じて、内部の挙動を指定できます。  
-`options.algorithm`の指定による挙動の変化は下記の通りです。  
-| `options.algorithm` | 内部の乱数生成アルゴリズム | 範囲指定整数生成アルゴリズム |
-|--|--|--|
-| `rc4` | RC4 | Rejection Sampling |
-| `rc4_legacy` | RC4 | 浮動小数点数演算による範囲制限​(0.19.0以前のアルゴリズム) |
-| 無指定 または 'chacha20' | ChaCha20 | Rejection Sampling |
-
-> [!CAUTION]
-> `rc4_legacy`等、浮動小数点数演算を伴う範囲指定整数生成アルゴリズムでは、演算時の丸め誤差により、指定した _max_ の値より大きな値が生成される可能性があります。
-
-## その他
-### @Math:clz32(_x_: num): num
-xを32ビットのバイナリで表現したときの先頭の0の個数を返します。  
-
-### @Math:fround(_x_: num): num
-_x_ を32ビットの浮動小数点数に変換した時の値を返します。  
-
-### @Math:imul(_x_: num, _y_: num): num
-_x_ と _y_ に対しC言語風の32ビット乗算を行った結果を返します。
diff --git a/docs/std.md b/docs/std.md
deleted file mode 100644
index 4b58be1..0000000
--- a/docs/std.md
+++ /dev/null
@@ -1,192 +0,0 @@
-*English translation has been left out of date for a long time. 
-[Please contribute!](../translations/en/docs/std.md)*
-
-## 標準定数・標準関数について
-Aiscriptで最初から定義されていてどこでも使える定数・関数を指します。  
-standardを省略してstd定数/関数とも呼ばれています。
-## 書式
-> #Core:v
-
-`Core:v`という標準定数を表します。
-> @Core:type(_v_: value): str
-
-`Core:type`という標準関数を表します。  
-`v`という名のvalue型（つまり任意の型）の引数を一つとり、str型（文字列型）の値を返します。
-
-# 一覧
-
-## std
-### @print(_message_: str): void
-画面に文字列を表示します。  
-
-### @readline(_message_: str): str
-文字列の入力を受け付けます。  
-
-## :: Core
-
-### #Core:v
-型: `str`  
-AiScriptのバージョンです。  
-
-### @Core:type(_v_: value): str
-値の型名を取得します。  
-
-### @Core:to_str(_v_: value): str
-値を表す文字列を取得します。  
-
-### @Core:sleep(_time_: num): void
-指定時間（ミリ秒）待機します。
-
-### @Core:abort(_message_: str): never
-プログラムを緊急停止します。
-
-## :: Util
-### @Util:uuid(): str
-新しいUUIDを生成します。  
-
-## :: Json
-### @Json:stringify(_v_: value): str
-JSONを生成します。  
-
-### @Json:parse(_json_: str): value
-JSONをパースします。 引数がJSONとしてパース可能性でない場合、エラー型の値（`name`=`'not_json'`）を返します。 
-
-### @Json:parsable(_str_: str): bool
-文字列がJSONとしてパース可能であるかの判定を行います。歴史的理由により存在しています 
-
-## :: Date
-### @Date:now(): num
-現在時刻を取得します。  
-
-### @Date:year(_date_?: num): num
-時刻の年を取得します。  
-_date_ を渡した場合、_date_に対応する年、  
-渡していない場合は現在時刻の年が返されます。    
-
-### @Date:month(_date_?: num): num
-現在時刻の月を取得します。  
-_date_ を渡した場合、_date_に対応する月、  
-渡していない場合は現在時刻の月が返されます。    
-
-### @Date:day(_date_?: num): num
-現在時刻の日を取得します。  
-_date_ を渡した場合、_date_に対応する日、  
-渡していない場合は現在時刻の日が返されます。    
-
-### @Date:hour(_date_?: num): num
-現在時刻の時を取得します。  
-_date_ を渡した場合、_date_に対応する時、  
-渡していない場合は現在時刻の時が返されます。    
-
-### @Date:minute(_date_?: num): num
-現在時刻の分を取得します。  
-_date_ を渡した場合、_date_に対応する分、  
-渡していない場合は現在時刻の分が返されます。    
-
-### @Date:second(_date_?: num): num
-現在時刻の秒を取得します。  
-_date_ を渡した場合、_date_に対応する秒、  
-渡していない場合は現在時刻の秒が返されます。    
-
-### @Date:millisecond(_date_?: num): num
-現在時刻のミリ秒を取得します。  
-_date_ を渡した場合、_date_に対応するミリ秒、  
-渡していない場合は現在時刻のミリ秒が返されます。  
-
-### @Date:parse(_date_: str): num
-日付として解釈可能な文字列から日時を表す数値を生成します。  
-解釈は[JavaScriptのDateコンストラクター](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/Date)に依存します。  
-引数が日付として解釈可能でない場合、エラー型の値（`name`=`'not_date'`）を返します。  
-
-
-### @Date:to_iso_str(_date_?: num, _time_offset_?: num): str
-_date_ を拡張表記のISO形式にした文字列を返します。  
-_date_ を渡していない場合は現在時刻を使用します。  
-_time_offset_ はUTCからの時差（分単位）を指定します。  
-_time_offset_ を渡していない場合はローカルのものを参照します。  
-
-## :: Math
-数が多いため専用のページになっています。→[std-math.md](std-math.md)
-
-## :: Num
-### @Num:from_hex(_hex_: str): num
-16進数の文字列から数値を生成します。  
-
-## :: Str
-### #Str:lf
-型: `str`  
-改行コード(LF)です。  
-
-### @Str:lt(a: str, b: str): num
-a < b ならば -1、a == b ならば 0、a > b ならば 1 を返します。  
-arr.sortの比較関数として使用できます。
-
-### @Str:gt(a: str, b: str): num
-a > b ならば -1、a == b ならば 0、a < b ならば 1 を返します。  
-arr.sortの比較関数として使用できます。
-
-### @Str:from_codepoint(codepoint: num): str
-Unicodeのコードポイントから文字を生成します。
-
-_codepoint_ は 0 以上、10FFFF<sub>16</sub> 以下である必要があります。
-
-### @Str:from_unicode_codepoints(_codePoints_: `arr<num>`): str
-Unicodeのコードポイント列を表す数値の配列から文字を生成します。  
-_codePoints_の各要素は 0 以上、10FFFF<sub>16</sub> 以下である必要があります。
-
-### @Str:from_utf8_bytes(_bytes_: `arr<num>`): str
-UTF-8のバイト列を表す数値の配列から文字を生成します。  
-_bytes_の各要素は 0 以上、255 以下である必要があります。
-
-## :: Uri
-### @Uri:encode_full(uri: str): str
-uri をURIとしてエンコードした文字列を返します。以下の文字はエンコードされません。  
-`A-Z a-z 0-9 - _ . ! ~ * ' ( ) ; , / ? : @ & = + $ #`
-
-### @Uri:encode_component(text: str): str
-text をURI構成要素としてエンコードした文字列を返します。以下の文字はエンコードされません。  
-`A-Z a-z 0-9 - _ . ! ~ * ' ( )`
-
-### @Uri:decode_full(encoded_uri: str): str
-encoded_uri をエンコードされたURIとしてデコードした文字列を返します。  
-以下の文字に対応するエスケープシーケンスはデコードされません。  
-`; , / ? : @ & = + $ #`
-
-### @Uri:decode_component(encoded_text: str): str
-encoded_text をエンコードされたURI構成要素としてデコードした文字列を返します。  
-
-## :: Arr
-### @Arr:create(_length_: num, _initial_?: value): arr
-長さが`length`の配列を作成します。  
-配列は _initial_ が与えられていれば _initial_ 、でなければ`null`で埋められます。  
-
-## :: Obj
-### @Obj:keys(_v_: obj): arr
-### @Obj:vals(_v_: obj): arr
-### @Obj:kvs(_v_: obj): arr
-オブジェクトのキー、値、キーと値の組を配列にして返します。
-
-### @Obj:get(_v_: obj, _key_: str): value
-
-### @Obj:set(_v_: obj, _key_: str, _val_: value): null
-
-### @Obj:has(_v_: obj, _key_: str): bool
-
-### @Obj:copy(_v_: obj): obj
-オブジェクトのコピーを生成します。  
-
-### @Obj:merge(_o1_: obj, _o2_: obj): obj
-２つのオブジェクトを併合したものを返します。
-
-## :: Error
-### @Error:create(_name_: str, _info_?: value): error
-エラー型の値を作成します。
-
-## :: Async
-### @Async:interval(_interval_: num, _callback_: fn, _immediate_?: bool): fn
-指定した周期でコールバック関数を呼び出します。  
-戻り値として停止関数を返します。  
-
-### @Async:timeout(_delay_: num, _callback_: fn):
-指定した時間経過後にコールバック関数を呼び出します。  
-戻り値として停止関数を返します。  
diff --git a/docs/syntax.md b/docs/syntax.md
deleted file mode 100644
index bd4ad0f..0000000
--- a/docs/syntax.md
+++ /dev/null
@@ -1,419 +0,0 @@
-# Syntax
-
-[Read translated version (en)](../translations/en/docs/syntax.md)
-
-## 文と式
-AiScriptにおける構文要素は、コメント等を除き「文(statement)」と「式(expression)」の2つからなります。  
-文は行頭または式を受け取る構文要素（ifや関数リテラルなど）にのみ記述することができます。返り値が利用されることを想定されていない構文要素であり、返り値は常にnullです。  
-対して式は、文を書ける場所に加えて何らかの値を要求するほとんど全ての構文要素の内部に書くことができます。また、多くの場合何らかの意味ある値を返します。  
-
-## コメント
-`//`で始めた行や`/*` `*/`で囲んだ箇所はコメントになり、プログラムの動作に影響を与えません。
-
-```js
-// 単行コメント
-/*
-   複数行コメント
-*/
-```
-
-## バージョン表記
-プログラムの一行目に以下の記法を行うことで、想定されたAiScriptのバージョンを明記することができます。  
-このバージョンはホストプログラムによって読み込まれる場合があります。  
-```js
-/// @ 0.16.0
-```
-
-## 文
-
-### 変数・関数宣言
-イミュータブル変数（定数）には`let`、ミュータブル変数には`var`、関数には`@`を使用します。  
-#### 予約語について
-変数や関数の宣言において、名前として使用できないキーワードがいくつかあります。  
-詳しくは[keywords.md](./keywords.md)を参照ください。  
-#### 変数
-```js
-// イミュータブル（再代入不可）
-let answer = 42
-// ミュータブル（再代入可能）
-var answer2 = 57
-```
-```js
-// 初期値の省略は不可
-var answer // Syntax Error
-// match等の予約語は変数名として使用できない
-let match = 12 // Syntax Error
-// 同名の変数の再宣言は禁止
-var a = 1
-var a = 2 // Runtime Error
-let a = 3 // Runtime Error
-```
-#### 関数
-関数宣言はイミュータブル変数を関数で初期化するのと同じ動作になっています。  
-```js
-// 最後の式が暗黙にreturnされる
-@add(x, y) {
-	x + y
-}
-<: add(1, 2) // 3
-// 定数をリテラル関数で初期化しても同じ働きになる
-let add2 = @(x, y) {
-	x + y
-}
-// 明示的にreturnを書くこともできる
-@add3(x, y) {
-	return x + y
-}
-// 引数を複数行で書いてもよい
-@add4(
-	x,
-	y
-) {
-	x + y
-}
-// 省略可能引数
-@func1(a, b?) {
-	<: a
-	<: b // 省略されるとnullになる
-}
-func1('hoge') // 'hoge' null
-// 初期値を設定された引数（省略可能引数と組み合わせて使用可能）
-@func2(a, b?, c = 'piyo', d?) {
-	<: a
-	<: b
-	<: c
-	<: d
-}
-func2('hoge', 'fuga') // 'hoge' 'fuga' 'piyo' null
-// 初期値には変数を使用可能（値は宣言時点で固定）
-var v = 'hoge'
-@func3(a = v) {
-	<: a
-}
-v = 'fuga'
-func3() // 'hoge'
-// ワンライナー
-@func4(a,b?,c=1){<:a;<:b;<:c}
-```
-```js
-// match等の予約語は関数名として使用できない
-@match(x, y) { // Syntax Error
-  x == y
-}
-// 最後の引数の後にはコロンを付けられない
-@add(x, y,) { // Syntax Error
-	x + y
-}
-// 変数同様再宣言は不可
-var func = null
-@func() { // Runtime Error
-  'hoge'
-}
-// 省略可能引数構文と初期値構文は併用できない
-@func(a? = 1) {} // Syntax Error
-```
-
-### 代入
-宣言済みの変数の値を変更します。  
-```js
-var a = 0
-a = 1
-<: a // 1
-```
-```js
-// letで宣言された変数は代入不可
-let a = 0
-a = 1 // Runtime Error
-```
-
-#### 分割代入
-```js
-// 配列の分割代入
-var a = ''
-var b = ''
-[a, b] = ['hoge', 'fuga']
-<: a // 'hoge'
-<: b // 'fuga'
-// オブジェクトの分割代入
-{ name: a, nature: b } = { name: 'Ai-chan', nature: 'kawaii' }
-<: a // 'Ai-chan'
-<: b // 'kawaii'
-// 組み合わせ
-let ai_kun = {
-  name: 'Ai-kun',
-  nature: ['kakkoii', 'kawaii', 'ponkotsu'],
-}
-{ name: a, nature: [b] } = ai_kun
-<: a // 'Ai-kun'
-<: b // 'kakkoii'
-```
-```js
-// 宣言で分割代入を使うことも可能
-let [hoge, fuga] = ['hoge', 'fuga']
-
-each let { value: a }, [{ value: 1 }, { value: 2 }] {
-	<: a // 1, 2
-}
-
-// 引数でも使用可能
-@func([a, b] = [0, 0]) {
-	[a, b]
-}
-func([1, 2]) // [1, 2]
-func([1]) // [1, null], not [1, 0]
-func() // [0, 0]
-
-// 再宣言を含む宣言は不可
-var a = 0
-let [a, b] = [1, 'piyo'] // Runtime Error
-
-// 名前空間での宣言では使用不可
-:: Ai {
-	// Runtime Error
-	let [chan, kun] = ['kawaii', 'kakkoii']
-}
-```
-```js
-// 代入値が分割できる型でなければエラー
-[a, b] = 1 // Runtime Error
-{ zero: a, one: b } = ['hoge', 'fuga'] // Runtime Error
-```
-
-### for
-与えられた回数のループを行います。  
-```js
-let repeat = 5
-for repeat print('Wan') // WanWanWanWanWan
-// {}を使うことで複数の文を書ける
-for 2 + 3 {
-	<: 'Nyan'
-} // NyanNyanNyanNyanNyan
-// ()でくくってもよい
-for ({ a: 3 }.a) {
-  <: 'Piyo'
-} // PiyoPiyoPiyo
-```
-```js
-// {の直前に空白必須
-for 5{ // Syntax Error
-	<: 'Mogu'
-}
-```
-#### for-let
-イテレータ変数を宣言し、ループ内で参照することができます。  
-```js
-for let i, 5 {
-	<: i
-} // 0 1 2 3 4
-// 初期値を設定することもできる
-for let i = 3, 5 {
-	<: i
-} // 3 4 5 6 7
-```
-```js
-// イテレータ変数はletで宣言される必要がある
-for var i, 5 {
-	<: i
-} // Syntax Error
-```
-
-### each
-配列の各要素に対しループを行います。  
-```js
-let arr = ['foo', 'bar', 'baz']
-each let v, arr {
-	<: v
-} // foo bar baz
-```
-```js
-// {の直前に空白必須
-each let v, arr{ // Syntax Error
-	<: v
-}
-```
-
-### while
-条件がtrueの間ループを続けます。  
-条件が最初からfalseの場合はループは実行されません。
-```js
-var count = 0
-while count < 42 {
-	count += 1
-}
-<: count // 42
-// 条件が最初からfalseの場合
-while false {
-  <: 'hoge'
-} // no output
-```
-
-### do-while
-条件がtrueの間ループを続けます。  
-条件が最初からfalseであってもループは一度実行されます。
-```js
-var count = 0
-do {
-	count += 1
-} while count < 42
-<: count // 42
-// 条件が最初からfalseの場合
-do {
-  <: 'hoge'
-} while false // hoge
-```
-
-### loop
-`break`されるまで無制限にループを行います。  
-```js
-var i = 5
-loop {
-	<: i
-	i -= 1
-	if i == 0 break
-} // 5 4 3 2 1
-```
-
-## グローバル専用文
-他の構文要素の内部に書くことを許容されない特殊な文です。  
-これらの構文要素は実行開始時に巻き上げられるため、プログラム上のどこに書いても最初に読み込まれます。  
-
-### メタデータ構文
-オブジェクトリテラルと類似した記法でAiScriptファイルにメタデータを埋め込める機能です。  
-メタデータはホストプログラムによって読まれる場合があります。  
-要素として関数を除く純粋な[リテラル](./literals.md)のみが許可されており、それ以外の式を含むと構文エラーとなります。  
-```js
-### {
-	name: "example"
-	version: 42
-	keywords: ["foo", "bar", "baz"]
-}
-```
-
-### 名前空間
-複数の定数・関数に共通した接頭辞をつけることのできる機能です。  
-ミュータブルな変数の存在は許容されていません。  
-未発達な機能であり、今後役割が大きく変更される可能性があります。  
-```js
-:: Ai {
-	let chan = 'kawaii'
-	@kun() {
-		<: chan
-	}
-}
-<: Ai:chan // kawaii
-Ai:kun() // kawaii
-```
-
-## 式
-
-### リテラル
-値をスクリプト中に直接書き込むことができる構文です。  
-詳しくは→[literals.md](./literals.md)  
-
-### 演算子
-主要な演算を表現します。  
-#### 単項演算子
-式に前置して使用します。論理否定（`!`）、正数符号（`+`）、負数符号（`-`）の三種があります。
-#### 二項演算子
-２つの式の間に置いて使用します。四則演算とその派生（`+`,`-`,`*`,`^`,`/`,`%`)、比較演算（`==`,`!=`,`<`,`<=`,`>`,`>=`）、論理演算（`&&`,`||`）があります。
-#### 演算子の優先度
-例えば`1 + 2 * 3`などは`2 * 3`が先に計算されてから`1 +`が行われます。これは`*`の優先度が`+`より高いことによるものです。優先度の一覧は下の表をご覧下さい。  
-この優先度は`(1 + 2) * 3`のように`(` `)`で括ることで変えることができます。  
-#### 二項演算子の糖衣構文性
-二項演算子は構文解析の過程でそれぞれ対応する組み込み関数に置き換えられます。  
-（単項演算子である`!`にも対応する関数`Core:not`が存在しますが、置き換えは行われていません）  
-何の関数に置き換えられるかは下の表をご覧下さい。  
-### 演算子一覧
-上から順に優先度が高くなっています。（一部優先度が同じものもあります）  
-<table>
-	<tr><th>演算子</th><th>対応する関数</th><th>意味</th></tr>
-	<tr><td><code>^</code></td><td><code>Core:pow</code></td><td>冪算</td></tr>
-	<tr><td><code>+（単項）</code></td><td>なし</td><td>正数</td></tr>
-	<tr><td><code>-（単項）</code></td><td>なし</td><td>負数</td></tr>
-	<tr><td><code>!（単項）</code></td><td>なし</td><td>否定</td></tr>
-	<tr><td><code>*</code></td><td><code>Core:mul</code></td><td>乗算</td></tr>
-	<tr><td><code>/</code></td><td><code>Core:div</code></td><td>除算</td></tr>
-	<tr><td><code>%</code></td><td><code>Core:mod</code></td><td>剰余</td></tr>
-	<tr><td><code>+</code></td><td><code>Core:add</code></td><td>加算</td></tr>
-	<tr><td><code>-</code></td><td><code>Core:sub</code></td><td>減算</td></tr>
-	<tr><td><code>></code></td><td><code>Core:gt</code></td><td>大きい</td></tr>
-	<tr><td><code>>=</code></td><td><code>Core:gteq</code></td><td>以上</td></tr>
-	<tr><td><code><</code></td><td><code>Core:lt</code></td><td>小さい</td></tr>
-	<tr><td><code><=</code></td><td><code>Core:lteq</code></td><td>以下</td></tr>
-	<tr><td><code>==</code></td><td><code>Core:eq</code></td><td>等しい</td></tr>
-	<tr><td><code>!=</code></td><td><code>Core:neq</code></td><td>等しくない</td></tr>
-	<tr><td><code>&&</code></td><td><code>Core:and</code></td><td>かつ</td></tr>
-	<tr><td><code>||</code></td><td><code>Core:or</code></td><td>または</td></tr>
-</table>
-
-### if
-キーワード`if`に続く式がtrueに評価されるかfalseに評価されるかで条件分岐を行います。  
-式として扱うことができ、最後の文の値を返します。
-`if`の直後に１つ以上の空白またはタブを挟む必要があります。（改行があっても）  
-条件式が`bool`型ではない値に評価されるとエラーになります。  
-```js
-// 単行
-if answer == 42 print("correct answer")
-// 複数行
-if answer == 42 {
-	<: "correct answer"
-}
-// 条件式は()で囲ってもよい
-if ({ a: true }.a) print('ok')
-// 式として使用可能
-<: `{if answer == 42 "collect answer"}`
-// else, elifも使用可能
-let result = if answer == "bebeyo" {
-	"correct answer"
-} elif answer == "ai" {
-	"kawaii"
-} else {
-	"wrong answer"
-}
-// elseがない場合、条件式がfalseならnullを返す
-<: if false 1 // null
-```
-```js
-// 条件式の前後の空白は必須（かっこでくくっていても）
-if(true) return 1 // Syntax Error
-if (true)return 1 // Syntax Error
-// elif, elseの直前の空白は必須
-if (false) {
-}elif (true) { // Syntax Error
-}else {} // Syntax Error
-```
-
-### eval
-別名ブロック式。
-`{ }`内の文を順次評価し、最後の文の値を返します。
-```js
-let foo = eval {
-	let x = 1
-	let y = 2
-	x + y
-}
-<: foo // 3
-```
-
-### match
-```js
-let x = 1
-let y = match x {
-	case 1 => "yes"
-	case 0 => "no"
-	default => "other"
-}
-<: y // "yes"
-
-// ワンライナー
-<:match x{case 1=>"yes",case 0=>"no",default=>"other"} // "yes"
-```
-
-### exists
-与えられた名称の変数または関数が存在すればtrue、しなければfalseを返します。
-```js
-// 変数barは存在しないためfalse
-var foo = exists bar
-// 変数fooが存在するためtrue
-var bar = exists foo
-```
diff --git a/package-lock.json b/package-lock.json
index f98e6fd..4ccc899 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,24 +11,24 @@
 			"dependencies": {
 				"seedrandom": "3.0.5",
 				"stringz": "2.1.0",
-				"uuid": "10.0.0"
+				"uuid": "11.0.3"
 			},
 			"devDependencies": {
-				"@eslint/js": "9.13.0",
-				"@microsoft/api-extractor": "7.47.11",
+				"@eslint/js": "9.15.0",
+				"@microsoft/api-extractor": "7.48.0",
 				"@types/eslint__js": "8.42.3",
-				"@types/node": "22.7.9",
+				"@types/node": "22.10.1",
 				"@types/seedrandom": "3.0.8",
 				"@types/uuid": "10.0.0",
-				"@vitest/coverage-v8": "2.1.3",
+				"@vitest/coverage-v8": "2.1.6",
 				"chalk": "5.3.0",
-				"eslint": "9.13.0",
+				"eslint": "9.15.0",
 				"eslint-plugin-import": "2.31.0",
 				"semver": "7.6.3",
 				"ts-node": "10.9.2",
-				"typescript": "5.6.3",
-				"typescript-eslint": "8.11.0",
-				"vitest": "2.1.3"
+				"typescript": "5.7.2",
+				"typescript-eslint": "8.16.0",
+				"vitest": "2.1.6"
 			}
 		},
 		"node_modules/@ampproject/remapping": {
@@ -128,9 +128,9 @@
 			}
 		},
 		"node_modules/@esbuild/aix-ppc64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
-			"integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
+			"integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
 			"cpu": [
 				"ppc64"
 			],
@@ -140,13 +140,13 @@
 				"aix"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/android-arm": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
-			"integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
+			"integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
 			"cpu": [
 				"arm"
 			],
@@ -156,13 +156,13 @@
 				"android"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/android-arm64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
-			"integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
+			"integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
 			"cpu": [
 				"arm64"
 			],
@@ -172,13 +172,13 @@
 				"android"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/android-x64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
-			"integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
+			"integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
 			"cpu": [
 				"x64"
 			],
@@ -188,13 +188,13 @@
 				"android"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/darwin-arm64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
-			"integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
+			"integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
 			"cpu": [
 				"arm64"
 			],
@@ -204,13 +204,13 @@
 				"darwin"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/darwin-x64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
-			"integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
+			"integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
 			"cpu": [
 				"x64"
 			],
@@ -220,13 +220,13 @@
 				"darwin"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/freebsd-arm64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
-			"integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
+			"integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
 			"cpu": [
 				"arm64"
 			],
@@ -236,13 +236,13 @@
 				"freebsd"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/freebsd-x64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
-			"integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
+			"integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
 			"cpu": [
 				"x64"
 			],
@@ -252,13 +252,13 @@
 				"freebsd"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/linux-arm": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
-			"integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
+			"integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
 			"cpu": [
 				"arm"
 			],
@@ -268,13 +268,13 @@
 				"linux"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/linux-arm64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
-			"integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
+			"integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
 			"cpu": [
 				"arm64"
 			],
@@ -284,13 +284,13 @@
 				"linux"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/linux-ia32": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
-			"integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
+			"integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
 			"cpu": [
 				"ia32"
 			],
@@ -300,13 +300,13 @@
 				"linux"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/linux-loong64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
-			"integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
+			"integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
 			"cpu": [
 				"loong64"
 			],
@@ -316,13 +316,13 @@
 				"linux"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/linux-mips64el": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
-			"integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
+			"integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
 			"cpu": [
 				"mips64el"
 			],
@@ -332,13 +332,13 @@
 				"linux"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/linux-ppc64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
-			"integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
+			"integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
 			"cpu": [
 				"ppc64"
 			],
@@ -348,13 +348,13 @@
 				"linux"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/linux-riscv64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
-			"integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
+			"integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
 			"cpu": [
 				"riscv64"
 			],
@@ -364,13 +364,13 @@
 				"linux"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/linux-s390x": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
-			"integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
+			"integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
 			"cpu": [
 				"s390x"
 			],
@@ -380,13 +380,13 @@
 				"linux"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/linux-x64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
-			"integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
+			"integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
 			"cpu": [
 				"x64"
 			],
@@ -396,13 +396,13 @@
 				"linux"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/netbsd-x64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
-			"integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
+			"integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
 			"cpu": [
 				"x64"
 			],
@@ -412,13 +412,29 @@
 				"netbsd"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
+			}
+		},
+		"node_modules/@esbuild/openbsd-arm64": {
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
+			"integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
+			"cpu": [
+				"arm64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"openbsd"
+			],
+			"engines": {
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/openbsd-x64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
-			"integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
+			"integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
 			"cpu": [
 				"x64"
 			],
@@ -428,13 +444,13 @@
 				"openbsd"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/sunos-x64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
-			"integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
+			"integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
 			"cpu": [
 				"x64"
 			],
@@ -444,13 +460,13 @@
 				"sunos"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/win32-arm64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
-			"integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
+			"integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
 			"cpu": [
 				"arm64"
 			],
@@ -460,13 +476,13 @@
 				"win32"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/win32-ia32": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
-			"integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
+			"integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
 			"cpu": [
 				"ia32"
 			],
@@ -476,13 +492,13 @@
 				"win32"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@esbuild/win32-x64": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
-			"integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
+			"integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
 			"cpu": [
 				"x64"
 			],
@@ -492,7 +508,7 @@
 				"win32"
 			],
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			}
 		},
 		"node_modules/@eslint-community/eslint-utils": {
@@ -525,21 +541,19 @@
 			}
 		},
 		"node_modules/@eslint-community/regexpp": {
-			"version": "4.11.1",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz",
-			"integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==",
+			"version": "4.12.1",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+			"integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
 			}
 		},
 		"node_modules/@eslint/config-array": {
-			"version": "0.18.0",
-			"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
-			"integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
+			"version": "0.19.0",
+			"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz",
+			"integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==",
 			"dev": true,
-			"license": "Apache-2.0",
 			"dependencies": {
 				"@eslint/object-schema": "^2.1.4",
 				"debug": "^4.3.1",
@@ -554,7 +568,6 @@
 			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
 			"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
 			"dev": true,
-			"license": "ISC",
 			"dependencies": {
 				"brace-expansion": "^1.1.7"
 			},
@@ -563,20 +576,19 @@
 			}
 		},
 		"node_modules/@eslint/core": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz",
-			"integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==",
+			"version": "0.9.0",
+			"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz",
+			"integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==",
 			"dev": true,
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			}
 		},
 		"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==",
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
+			"integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"ajv": "^6.12.4",
 				"debug": "^4.3.2",
@@ -600,7 +612,6 @@
 			"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
 			"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"fast-deep-equal": "^3.1.1",
 				"fast-json-stable-stringify": "^2.0.0",
@@ -616,15 +627,13 @@
 			"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,
-			"license": "MIT"
+			"dev": true
 		},
 		"node_modules/@eslint/eslintrc/node_modules/minimatch": {
 			"version": "3.1.2",
 			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
 			"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
 			"dev": true,
-			"license": "ISC",
 			"dependencies": {
 				"brace-expansion": "^1.1.7"
 			},
@@ -633,9 +642,9 @@
 			}
 		},
 		"node_modules/@eslint/js": {
-			"version": "9.13.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz",
-			"integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==",
+			"version": "9.15.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz",
+			"integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==",
 			"dev": true,
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -646,17 +655,15 @@
 			"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
 			"integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
 			"dev": true,
-			"license": "Apache-2.0",
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			}
 		},
 		"node_modules/@eslint/plugin-kit": {
-			"version": "0.2.0",
-			"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz",
-			"integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==",
+			"version": "0.2.3",
+			"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz",
+			"integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==",
 			"dev": true,
-			"license": "Apache-2.0",
 			"dependencies": {
 				"levn": "^0.4.1"
 			},
@@ -665,29 +672,40 @@
 			}
 		},
 		"node_modules/@humanfs/core": {
-			"version": "0.19.0",
-			"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz",
-			"integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==",
+			"version": "0.19.1",
+			"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+			"integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
 			"dev": true,
-			"license": "Apache-2.0",
 			"engines": {
 				"node": ">=18.18.0"
 			}
 		},
 		"node_modules/@humanfs/node": {
-			"version": "0.16.5",
-			"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz",
-			"integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==",
+			"version": "0.16.6",
+			"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+			"integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
 			"dev": true,
-			"license": "Apache-2.0",
 			"dependencies": {
-				"@humanfs/core": "^0.19.0",
+				"@humanfs/core": "^0.19.1",
 				"@humanwhocodes/retry": "^0.3.0"
 			},
 			"engines": {
 				"node": ">=18.18.0"
 			}
 		},
+		"node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+			"version": "0.3.1",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+			"integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+			"dev": true,
+			"engines": {
+				"node": ">=18.18"
+			},
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/nzakas"
+			}
+		},
 		"node_modules/@humanwhocodes/module-importer": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -703,11 +721,10 @@
 			}
 		},
 		"node_modules/@humanwhocodes/retry": {
-			"version": "0.3.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
-			"integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+			"version": "0.4.1",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
+			"integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
 			"dev": true,
-			"license": "Apache-2.0",
 			"engines": {
 				"node": ">=18.18"
 			},
@@ -798,18 +815,18 @@
 			}
 		},
 		"node_modules/@microsoft/api-extractor": {
-			"version": "7.47.11",
-			"resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.47.11.tgz",
-			"integrity": "sha512-lrudfbPub5wzBhymfFtgZKuBvXxoSIAdrvS2UbHjoMT2TjIEddq6Z13pcve7A03BAouw0x8sW8G4txdgfiSwpQ==",
+			"version": "7.48.0",
+			"resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.48.0.tgz",
+			"integrity": "sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ==",
 			"dev": true,
 			"dependencies": {
-				"@microsoft/api-extractor-model": "7.29.8",
-				"@microsoft/tsdoc": "~0.15.0",
-				"@microsoft/tsdoc-config": "~0.17.0",
-				"@rushstack/node-core-library": "5.9.0",
+				"@microsoft/api-extractor-model": "7.30.0",
+				"@microsoft/tsdoc": "~0.15.1",
+				"@microsoft/tsdoc-config": "~0.17.1",
+				"@rushstack/node-core-library": "5.10.0",
 				"@rushstack/rig-package": "0.5.3",
-				"@rushstack/terminal": "0.14.2",
-				"@rushstack/ts-command-line": "4.23.0",
+				"@rushstack/terminal": "0.14.3",
+				"@rushstack/ts-command-line": "4.23.1",
 				"lodash": "~4.17.15",
 				"minimatch": "~3.0.3",
 				"resolve": "~1.22.1",
@@ -822,14 +839,14 @@
 			}
 		},
 		"node_modules/@microsoft/api-extractor-model": {
-			"version": "7.29.8",
-			"resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.29.8.tgz",
-			"integrity": "sha512-t3Z/xcO6TRbMcnKGVMs4uMzv/gd5j0NhMiJIGjD4cJMeFJ1Hf8wnLSx37vxlRlL0GWlGJhnFgxvnaL6JlS+73g==",
+			"version": "7.30.0",
+			"resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.0.tgz",
+			"integrity": "sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug==",
 			"dev": true,
 			"dependencies": {
-				"@microsoft/tsdoc": "~0.15.0",
-				"@microsoft/tsdoc-config": "~0.17.0",
-				"@rushstack/node-core-library": "5.9.0"
+				"@microsoft/tsdoc": "~0.15.1",
+				"@microsoft/tsdoc-config": "~0.17.1",
+				"@rushstack/node-core-library": "5.10.0"
 			}
 		},
 		"node_modules/@microsoft/api-extractor/node_modules/lru-cache": {
@@ -876,18 +893,18 @@
 			}
 		},
 		"node_modules/@microsoft/tsdoc": {
-			"version": "0.15.0",
-			"resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz",
-			"integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==",
+			"version": "0.15.1",
+			"resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz",
+			"integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==",
 			"dev": true
 		},
 		"node_modules/@microsoft/tsdoc-config": {
-			"version": "0.17.0",
-			"resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz",
-			"integrity": "sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==",
+			"version": "0.17.1",
+			"resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz",
+			"integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==",
 			"dev": true,
 			"dependencies": {
-				"@microsoft/tsdoc": "0.15.0",
+				"@microsoft/tsdoc": "0.15.1",
 				"ajv": "~8.12.0",
 				"jju": "~1.4.0",
 				"resolve": "~1.22.2"
@@ -940,9 +957,9 @@
 			}
 		},
 		"node_modules/@rollup/rollup-android-arm-eabi": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
-			"integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz",
+			"integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==",
 			"cpu": [
 				"arm"
 			],
@@ -953,9 +970,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-android-arm64": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
-			"integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz",
+			"integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==",
 			"cpu": [
 				"arm64"
 			],
@@ -966,9 +983,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-darwin-arm64": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
-			"integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz",
+			"integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==",
 			"cpu": [
 				"arm64"
 			],
@@ -979,9 +996,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-darwin-x64": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
-			"integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz",
+			"integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==",
 			"cpu": [
 				"x64"
 			],
@@ -991,10 +1008,36 @@
 				"darwin"
 			]
 		},
+		"node_modules/@rollup/rollup-freebsd-arm64": {
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz",
+			"integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==",
+			"cpu": [
+				"arm64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"freebsd"
+			]
+		},
+		"node_modules/@rollup/rollup-freebsd-x64": {
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz",
+			"integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==",
+			"cpu": [
+				"x64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"freebsd"
+			]
+		},
 		"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
-			"integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz",
+			"integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==",
 			"cpu": [
 				"arm"
 			],
@@ -1005,9 +1048,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-arm-musleabihf": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
-			"integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz",
+			"integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==",
 			"cpu": [
 				"arm"
 			],
@@ -1018,9 +1061,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-arm64-gnu": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
-			"integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz",
+			"integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==",
 			"cpu": [
 				"arm64"
 			],
@@ -1031,9 +1074,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-arm64-musl": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
-			"integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz",
+			"integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==",
 			"cpu": [
 				"arm64"
 			],
@@ -1044,9 +1087,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
-			"integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz",
+			"integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==",
 			"cpu": [
 				"ppc64"
 			],
@@ -1057,9 +1100,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-riscv64-gnu": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
-			"integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz",
+			"integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==",
 			"cpu": [
 				"riscv64"
 			],
@@ -1070,9 +1113,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-s390x-gnu": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
-			"integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz",
+			"integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==",
 			"cpu": [
 				"s390x"
 			],
@@ -1083,9 +1126,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-x64-gnu": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
-			"integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz",
+			"integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==",
 			"cpu": [
 				"x64"
 			],
@@ -1096,9 +1139,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-x64-musl": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
-			"integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz",
+			"integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==",
 			"cpu": [
 				"x64"
 			],
@@ -1109,9 +1152,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-win32-arm64-msvc": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
-			"integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz",
+			"integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==",
 			"cpu": [
 				"arm64"
 			],
@@ -1122,9 +1165,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-win32-ia32-msvc": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
-			"integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz",
+			"integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==",
 			"cpu": [
 				"ia32"
 			],
@@ -1135,9 +1178,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-win32-x64-msvc": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
-			"integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz",
+			"integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==",
 			"cpu": [
 				"x64"
 			],
@@ -1155,9 +1198,9 @@
 			"license": "MIT"
 		},
 		"node_modules/@rushstack/node-core-library": {
-			"version": "5.9.0",
-			"resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.9.0.tgz",
-			"integrity": "sha512-MMsshEWkTbXqxqFxD4gcIUWQOCeBChlGczdZbHfqmNZQFLHB3yWxDFSMHFUdu2/OB9NUk7Awn5qRL+rws4HQNg==",
+			"version": "5.10.0",
+			"resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.10.0.tgz",
+			"integrity": "sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw==",
 			"dev": true,
 			"dependencies": {
 				"ajv": "~8.13.0",
@@ -1233,12 +1276,12 @@
 			}
 		},
 		"node_modules/@rushstack/terminal": {
-			"version": "0.14.2",
-			"resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.2.tgz",
-			"integrity": "sha512-2fC1wqu1VCExKC0/L+0noVcFQEXEnoBOtCIex1TOjBzEDWcw8KzJjjj7aTP6mLxepG0XIyn9OufeFb6SFsa+sg==",
+			"version": "0.14.3",
+			"resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.3.tgz",
+			"integrity": "sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw==",
 			"dev": true,
 			"dependencies": {
-				"@rushstack/node-core-library": "5.9.0",
+				"@rushstack/node-core-library": "5.10.0",
 				"supports-color": "~8.1.1"
 			},
 			"peerDependencies": {
@@ -1251,12 +1294,12 @@
 			}
 		},
 		"node_modules/@rushstack/ts-command-line": {
-			"version": "4.23.0",
-			"resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.0.tgz",
-			"integrity": "sha512-jYREBtsxduPV6ptNq8jOKp9+yx0ld1Tb/Tkdnlj8gTjazl1sF3DwX2VbluyYrNd0meWIL0bNeer7WDf5tKFjaQ==",
+			"version": "4.23.1",
+			"resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.1.tgz",
+			"integrity": "sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA==",
 			"dev": true,
 			"dependencies": {
-				"@rushstack/terminal": "0.14.2",
+				"@rushstack/terminal": "0.14.3",
 				"@types/argparse": "1.0.38",
 				"argparse": "~1.0.9",
 				"string-argv": "~0.3.1"
@@ -1339,12 +1382,12 @@
 			"license": "MIT"
 		},
 		"node_modules/@types/node": {
-			"version": "22.7.9",
-			"resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.9.tgz",
-			"integrity": "sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==",
+			"version": "22.10.1",
+			"resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz",
+			"integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==",
 			"dev": true,
 			"dependencies": {
-				"undici-types": "~6.19.2"
+				"undici-types": "~6.20.0"
 			}
 		},
 		"node_modules/@types/seedrandom": {
@@ -1362,16 +1405,16 @@
 			"license": "MIT"
 		},
 		"node_modules/@typescript-eslint/eslint-plugin": {
-			"version": "8.11.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz",
-			"integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==",
+			"version": "8.16.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz",
+			"integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/regexpp": "^4.10.0",
-				"@typescript-eslint/scope-manager": "8.11.0",
-				"@typescript-eslint/type-utils": "8.11.0",
-				"@typescript-eslint/utils": "8.11.0",
-				"@typescript-eslint/visitor-keys": "8.11.0",
+				"@typescript-eslint/scope-manager": "8.16.0",
+				"@typescript-eslint/type-utils": "8.16.0",
+				"@typescript-eslint/utils": "8.16.0",
+				"@typescript-eslint/visitor-keys": "8.16.0",
 				"graphemer": "^1.4.0",
 				"ignore": "^5.3.1",
 				"natural-compare": "^1.4.0",
@@ -1395,15 +1438,15 @@
 			}
 		},
 		"node_modules/@typescript-eslint/parser": {
-			"version": "8.11.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz",
-			"integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==",
+			"version": "8.16.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz",
+			"integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/scope-manager": "8.11.0",
-				"@typescript-eslint/types": "8.11.0",
-				"@typescript-eslint/typescript-estree": "8.11.0",
-				"@typescript-eslint/visitor-keys": "8.11.0",
+				"@typescript-eslint/scope-manager": "8.16.0",
+				"@typescript-eslint/types": "8.16.0",
+				"@typescript-eslint/typescript-estree": "8.16.0",
+				"@typescript-eslint/visitor-keys": "8.16.0",
 				"debug": "^4.3.4"
 			},
 			"engines": {
@@ -1423,13 +1466,13 @@
 			}
 		},
 		"node_modules/@typescript-eslint/scope-manager": {
-			"version": "8.11.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz",
-			"integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==",
+			"version": "8.16.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz",
+			"integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "8.11.0",
-				"@typescript-eslint/visitor-keys": "8.11.0"
+				"@typescript-eslint/types": "8.16.0",
+				"@typescript-eslint/visitor-keys": "8.16.0"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1440,13 +1483,13 @@
 			}
 		},
 		"node_modules/@typescript-eslint/type-utils": {
-			"version": "8.11.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz",
-			"integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==",
+			"version": "8.16.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz",
+			"integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/typescript-estree": "8.11.0",
-				"@typescript-eslint/utils": "8.11.0",
+				"@typescript-eslint/typescript-estree": "8.16.0",
+				"@typescript-eslint/utils": "8.16.0",
 				"debug": "^4.3.4",
 				"ts-api-utils": "^1.3.0"
 			},
@@ -1457,6 +1500,9 @@
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
+			"peerDependencies": {
+				"eslint": "^8.57.0 || ^9.0.0"
+			},
 			"peerDependenciesMeta": {
 				"typescript": {
 					"optional": true
@@ -1464,9 +1510,9 @@
 			}
 		},
 		"node_modules/@typescript-eslint/types": {
-			"version": "8.11.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz",
-			"integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==",
+			"version": "8.16.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz",
+			"integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==",
 			"dev": true,
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1477,13 +1523,13 @@
 			}
 		},
 		"node_modules/@typescript-eslint/typescript-estree": {
-			"version": "8.11.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz",
-			"integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==",
+			"version": "8.16.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz",
+			"integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "8.11.0",
-				"@typescript-eslint/visitor-keys": "8.11.0",
+				"@typescript-eslint/types": "8.16.0",
+				"@typescript-eslint/visitor-keys": "8.16.0",
 				"debug": "^4.3.4",
 				"fast-glob": "^3.3.2",
 				"is-glob": "^4.0.3",
@@ -1529,15 +1575,15 @@
 			}
 		},
 		"node_modules/@typescript-eslint/utils": {
-			"version": "8.11.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz",
-			"integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==",
+			"version": "8.16.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz",
+			"integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"@typescript-eslint/scope-manager": "8.11.0",
-				"@typescript-eslint/types": "8.11.0",
-				"@typescript-eslint/typescript-estree": "8.11.0"
+				"@typescript-eslint/scope-manager": "8.16.0",
+				"@typescript-eslint/types": "8.16.0",
+				"@typescript-eslint/typescript-estree": "8.16.0"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1548,16 +1594,21 @@
 			},
 			"peerDependencies": {
 				"eslint": "^8.57.0 || ^9.0.0"
+			},
+			"peerDependenciesMeta": {
+				"typescript": {
+					"optional": true
+				}
 			}
 		},
 		"node_modules/@typescript-eslint/visitor-keys": {
-			"version": "8.11.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz",
-			"integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==",
+			"version": "8.16.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz",
+			"integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "8.11.0",
-				"eslint-visitor-keys": "^3.4.3"
+				"@typescript-eslint/types": "8.16.0",
+				"eslint-visitor-keys": "^4.2.0"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1567,34 +1618,22 @@
 				"url": "https://opencollective.com/typescript-eslint"
 			}
 		},
-		"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
-			"version": "3.4.3",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
-			"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
-			"dev": true,
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"funding": {
-				"url": "https://opencollective.com/eslint"
-			}
-		},
 		"node_modules/@vitest/coverage-v8": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.3.tgz",
-			"integrity": "sha512-2OJ3c7UPoFSmBZwqD2VEkUw6A/tzPF0LmW0ZZhhB8PFxuc+9IBG/FaSM+RLEenc7ljzFvGN+G0nGQoZnh7sy2A==",
+			"version": "2.1.6",
+			"resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.6.tgz",
+			"integrity": "sha512-qItJVYDbG3MUFO68dOZUz+rWlqe9LMzotERXFXKg25s2A/kSVsyS9O0yNGrITfBd943GsnBeQZkBUu7Pc+zVeA==",
 			"dev": true,
 			"dependencies": {
 				"@ampproject/remapping": "^2.3.0",
 				"@bcoe/v8-coverage": "^0.2.3",
-				"debug": "^4.3.6",
+				"debug": "^4.3.7",
 				"istanbul-lib-coverage": "^3.2.2",
 				"istanbul-lib-report": "^3.0.1",
 				"istanbul-lib-source-maps": "^5.0.6",
 				"istanbul-reports": "^3.1.7",
-				"magic-string": "^0.30.11",
-				"magicast": "^0.3.4",
-				"std-env": "^3.7.0",
+				"magic-string": "^0.30.12",
+				"magicast": "^0.3.5",
+				"std-env": "^3.8.0",
 				"test-exclude": "^7.0.1",
 				"tinyrainbow": "^1.2.0"
 			},
@@ -1602,8 +1641,8 @@
 				"url": "https://opencollective.com/vitest"
 			},
 			"peerDependencies": {
-				"@vitest/browser": "2.1.3",
-				"vitest": "2.1.3"
+				"@vitest/browser": "2.1.6",
+				"vitest": "2.1.6"
 			},
 			"peerDependenciesMeta": {
 				"@vitest/browser": {
@@ -1612,14 +1651,14 @@
 			}
 		},
 		"node_modules/@vitest/expect": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.3.tgz",
-			"integrity": "sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==",
+			"version": "2.1.6",
+			"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.6.tgz",
+			"integrity": "sha512-9M1UR9CAmrhJOMoSwVnPh2rELPKhYo0m/CSgqw9PyStpxtkwhmdM6XYlXGKeYyERY1N6EIuzkQ7e3Lm1WKCoUg==",
 			"dev": true,
 			"dependencies": {
-				"@vitest/spy": "2.1.3",
-				"@vitest/utils": "2.1.3",
-				"chai": "^5.1.1",
+				"@vitest/spy": "2.1.6",
+				"@vitest/utils": "2.1.6",
+				"chai": "^5.1.2",
 				"tinyrainbow": "^1.2.0"
 			},
 			"funding": {
@@ -1627,22 +1666,21 @@
 			}
 		},
 		"node_modules/@vitest/mocker": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.3.tgz",
-			"integrity": "sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==",
+			"version": "2.1.6",
+			"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.6.tgz",
+			"integrity": "sha512-MHZp2Z+Q/A3am5oD4WSH04f9B0T7UvwEb+v5W0kCYMhtXGYbdyl2NUk1wdSMqGthmhpiThPDp/hEoVwu16+u1A==",
 			"dev": true,
 			"dependencies": {
-				"@vitest/spy": "2.1.3",
+				"@vitest/spy": "2.1.6",
 				"estree-walker": "^3.0.3",
-				"magic-string": "^0.30.11"
+				"magic-string": "^0.30.12"
 			},
 			"funding": {
 				"url": "https://opencollective.com/vitest"
 			},
 			"peerDependencies": {
-				"@vitest/spy": "2.1.3",
-				"msw": "^2.3.5",
-				"vite": "^5.0.0"
+				"msw": "^2.4.9",
+				"vite": "^5.0.0 || ^6.0.0"
 			},
 			"peerDependenciesMeta": {
 				"msw": {
@@ -1654,9 +1692,9 @@
 			}
 		},
 		"node_modules/@vitest/pretty-format": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz",
-			"integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==",
+			"version": "2.1.6",
+			"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.6.tgz",
+			"integrity": "sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA==",
 			"dev": true,
 			"dependencies": {
 				"tinyrainbow": "^1.2.0"
@@ -1666,12 +1704,12 @@
 			}
 		},
 		"node_modules/@vitest/runner": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.3.tgz",
-			"integrity": "sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==",
+			"version": "2.1.6",
+			"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.6.tgz",
+			"integrity": "sha512-SjkRGSFyrA82m5nz7To4CkRSEVWn/rwQISHoia/DB8c6IHIhaE/UNAo+7UfeaeJRE979XceGl00LNkIz09RFsA==",
 			"dev": true,
 			"dependencies": {
-				"@vitest/utils": "2.1.3",
+				"@vitest/utils": "2.1.6",
 				"pathe": "^1.1.2"
 			},
 			"funding": {
@@ -1679,13 +1717,13 @@
 			}
 		},
 		"node_modules/@vitest/snapshot": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.3.tgz",
-			"integrity": "sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==",
+			"version": "2.1.6",
+			"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.6.tgz",
+			"integrity": "sha512-5JTWHw8iS9l3v4/VSuthCndw1lN/hpPB+mlgn1BUhFbobeIUj1J1V/Bj2t2ovGEmkXLTckFjQddsxS5T6LuVWw==",
 			"dev": true,
 			"dependencies": {
-				"@vitest/pretty-format": "2.1.3",
-				"magic-string": "^0.30.11",
+				"@vitest/pretty-format": "2.1.6",
+				"magic-string": "^0.30.12",
 				"pathe": "^1.1.2"
 			},
 			"funding": {
@@ -1693,25 +1731,25 @@
 			}
 		},
 		"node_modules/@vitest/spy": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz",
-			"integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==",
+			"version": "2.1.6",
+			"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.6.tgz",
+			"integrity": "sha512-oTFObV8bd4SDdRka5O+mSh5w9irgx5IetrD5i+OsUUsk/shsBoHifwCzy45SAORzAhtNiprUVaK3hSCCzZh1jQ==",
 			"dev": true,
 			"dependencies": {
-				"tinyspy": "^3.0.0"
+				"tinyspy": "^3.0.2"
 			},
 			"funding": {
 				"url": "https://opencollective.com/vitest"
 			}
 		},
 		"node_modules/@vitest/utils": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.3.tgz",
-			"integrity": "sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==",
+			"version": "2.1.6",
+			"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.6.tgz",
+			"integrity": "sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==",
 			"dev": true,
 			"dependencies": {
-				"@vitest/pretty-format": "2.1.3",
-				"loupe": "^3.1.1",
+				"@vitest/pretty-format": "2.1.6",
+				"loupe": "^3.1.2",
 				"tinyrainbow": "^1.2.0"
 			},
 			"funding": {
@@ -1719,11 +1757,10 @@
 			}
 		},
 		"node_modules/acorn": {
-			"version": "8.12.1",
-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
-			"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+			"version": "8.14.0",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+			"integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
 			"dev": true,
-			"license": "MIT",
 			"bin": {
 				"acorn": "bin/acorn"
 			},
@@ -1736,7 +1773,6 @@
 			"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
 			"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
 			"dev": true,
-			"license": "MIT",
 			"peerDependencies": {
 				"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
 			}
@@ -2052,7 +2088,6 @@
 			"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
 			"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=6"
 			}
@@ -2139,11 +2174,10 @@
 			"license": "MIT"
 		},
 		"node_modules/cross-spawn": {
-			"version": "7.0.3",
-			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-			"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+			"version": "7.0.6",
+			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+			"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"path-key": "^3.1.0",
 				"shebang-command": "^2.0.0",
@@ -2398,6 +2432,12 @@
 				"node": ">= 0.4"
 			}
 		},
+		"node_modules/es-module-lexer": {
+			"version": "1.5.4",
+			"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
+			"integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+			"dev": true
+		},
 		"node_modules/es-object-atoms": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
@@ -2455,41 +2495,42 @@
 			}
 		},
 		"node_modules/esbuild": {
-			"version": "0.21.5",
-			"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
-			"integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+			"version": "0.24.0",
+			"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz",
+			"integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
 			"dev": true,
 			"hasInstallScript": true,
 			"bin": {
 				"esbuild": "bin/esbuild"
 			},
 			"engines": {
-				"node": ">=12"
+				"node": ">=18"
 			},
 			"optionalDependencies": {
-				"@esbuild/aix-ppc64": "0.21.5",
-				"@esbuild/android-arm": "0.21.5",
-				"@esbuild/android-arm64": "0.21.5",
-				"@esbuild/android-x64": "0.21.5",
-				"@esbuild/darwin-arm64": "0.21.5",
-				"@esbuild/darwin-x64": "0.21.5",
-				"@esbuild/freebsd-arm64": "0.21.5",
-				"@esbuild/freebsd-x64": "0.21.5",
-				"@esbuild/linux-arm": "0.21.5",
-				"@esbuild/linux-arm64": "0.21.5",
-				"@esbuild/linux-ia32": "0.21.5",
-				"@esbuild/linux-loong64": "0.21.5",
-				"@esbuild/linux-mips64el": "0.21.5",
-				"@esbuild/linux-ppc64": "0.21.5",
-				"@esbuild/linux-riscv64": "0.21.5",
-				"@esbuild/linux-s390x": "0.21.5",
-				"@esbuild/linux-x64": "0.21.5",
-				"@esbuild/netbsd-x64": "0.21.5",
-				"@esbuild/openbsd-x64": "0.21.5",
-				"@esbuild/sunos-x64": "0.21.5",
-				"@esbuild/win32-arm64": "0.21.5",
-				"@esbuild/win32-ia32": "0.21.5",
-				"@esbuild/win32-x64": "0.21.5"
+				"@esbuild/aix-ppc64": "0.24.0",
+				"@esbuild/android-arm": "0.24.0",
+				"@esbuild/android-arm64": "0.24.0",
+				"@esbuild/android-x64": "0.24.0",
+				"@esbuild/darwin-arm64": "0.24.0",
+				"@esbuild/darwin-x64": "0.24.0",
+				"@esbuild/freebsd-arm64": "0.24.0",
+				"@esbuild/freebsd-x64": "0.24.0",
+				"@esbuild/linux-arm": "0.24.0",
+				"@esbuild/linux-arm64": "0.24.0",
+				"@esbuild/linux-ia32": "0.24.0",
+				"@esbuild/linux-loong64": "0.24.0",
+				"@esbuild/linux-mips64el": "0.24.0",
+				"@esbuild/linux-ppc64": "0.24.0",
+				"@esbuild/linux-riscv64": "0.24.0",
+				"@esbuild/linux-s390x": "0.24.0",
+				"@esbuild/linux-x64": "0.24.0",
+				"@esbuild/netbsd-x64": "0.24.0",
+				"@esbuild/openbsd-arm64": "0.24.0",
+				"@esbuild/openbsd-x64": "0.24.0",
+				"@esbuild/sunos-x64": "0.24.0",
+				"@esbuild/win32-arm64": "0.24.0",
+				"@esbuild/win32-ia32": "0.24.0",
+				"@esbuild/win32-x64": "0.24.0"
 			}
 		},
 		"node_modules/escape-string-regexp": {
@@ -2506,31 +2547,31 @@
 			}
 		},
 		"node_modules/eslint": {
-			"version": "9.13.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz",
-			"integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==",
+			"version": "9.15.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz",
+			"integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.2.0",
-				"@eslint-community/regexpp": "^4.11.0",
-				"@eslint/config-array": "^0.18.0",
-				"@eslint/core": "^0.7.0",
-				"@eslint/eslintrc": "^3.1.0",
-				"@eslint/js": "9.13.0",
-				"@eslint/plugin-kit": "^0.2.0",
-				"@humanfs/node": "^0.16.5",
+				"@eslint-community/regexpp": "^4.12.1",
+				"@eslint/config-array": "^0.19.0",
+				"@eslint/core": "^0.9.0",
+				"@eslint/eslintrc": "^3.2.0",
+				"@eslint/js": "9.15.0",
+				"@eslint/plugin-kit": "^0.2.3",
+				"@humanfs/node": "^0.16.6",
 				"@humanwhocodes/module-importer": "^1.0.1",
-				"@humanwhocodes/retry": "^0.3.1",
+				"@humanwhocodes/retry": "^0.4.1",
 				"@types/estree": "^1.0.6",
 				"@types/json-schema": "^7.0.15",
 				"ajv": "^6.12.4",
 				"chalk": "^4.0.0",
-				"cross-spawn": "^7.0.2",
+				"cross-spawn": "^7.0.5",
 				"debug": "^4.3.2",
 				"escape-string-regexp": "^4.0.0",
-				"eslint-scope": "^8.1.0",
-				"eslint-visitor-keys": "^4.1.0",
-				"espree": "^10.2.0",
+				"eslint-scope": "^8.2.0",
+				"eslint-visitor-keys": "^4.2.0",
+				"espree": "^10.3.0",
 				"esquery": "^1.5.0",
 				"esutils": "^2.0.2",
 				"fast-deep-equal": "^3.1.3",
@@ -2544,8 +2585,7 @@
 				"lodash.merge": "^4.6.2",
 				"minimatch": "^3.1.2",
 				"natural-compare": "^1.4.0",
-				"optionator": "^0.9.3",
-				"text-table": "^0.2.0"
+				"optionator": "^0.9.3"
 			},
 			"bin": {
 				"eslint": "bin/eslint.js"
@@ -2683,11 +2723,10 @@
 			}
 		},
 		"node_modules/eslint-scope": {
-			"version": "8.1.0",
-			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz",
-			"integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==",
+			"version": "8.2.0",
+			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
+			"integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
 			"dev": true,
-			"license": "BSD-2-Clause",
 			"dependencies": {
 				"esrecurse": "^4.3.0",
 				"estraverse": "^5.2.0"
@@ -2700,11 +2739,10 @@
 			}
 		},
 		"node_modules/eslint-visitor-keys": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz",
-			"integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==",
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+			"integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
 			"dev": true,
-			"license": "Apache-2.0",
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
@@ -2796,15 +2834,14 @@
 			}
 		},
 		"node_modules/espree": {
-			"version": "10.2.0",
-			"resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz",
-			"integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==",
+			"version": "10.3.0",
+			"resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
+			"integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
 			"dev": true,
-			"license": "BSD-2-Clause",
 			"dependencies": {
-				"acorn": "^8.12.0",
+				"acorn": "^8.14.0",
 				"acorn-jsx": "^5.3.2",
-				"eslint-visitor-keys": "^4.1.0"
+				"eslint-visitor-keys": "^4.2.0"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2831,7 +2868,6 @@
 			"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
 			"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
 			"dev": true,
-			"license": "BSD-2-Clause",
 			"dependencies": {
 				"estraverse": "^5.2.0"
 			},
@@ -2868,6 +2904,15 @@
 				"node": ">=0.10.0"
 			}
 		},
+		"node_modules/expect-type": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz",
+			"integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==",
+			"dev": true,
+			"engines": {
+				"node": ">=12.0.0"
+			}
+		},
 		"node_modules/fast-deep-equal": {
 			"version": "3.1.3",
 			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -3186,7 +3231,6 @@
 			"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
 			"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=18"
 			},
@@ -3346,7 +3390,6 @@
 			"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
 			"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"parent-module": "^1.0.0",
 				"resolve-from": "^4.0.0"
@@ -3773,7 +3816,6 @@
 			"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
 			"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"argparse": "^2.0.1"
 			},
@@ -3785,8 +3827,7 @@
 			"version": "2.0.1",
 			"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
 			"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-			"dev": true,
-			"license": "Python-2.0"
+			"dev": true
 		},
 		"node_modules/json-buffer": {
 			"version": "3.0.1",
@@ -3898,11 +3939,10 @@
 			"license": "ISC"
 		},
 		"node_modules/magic-string": {
-			"version": "0.30.11",
-			"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
-			"integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
+			"version": "0.30.14",
+			"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz",
+			"integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"@jridgewell/sourcemap-codec": "^1.5.0"
 			}
@@ -4005,9 +4045,9 @@
 			"license": "MIT"
 		},
 		"node_modules/nanoid": {
-			"version": "3.3.7",
-			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
-			"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+			"version": "3.3.8",
+			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+			"integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
 			"dev": true,
 			"funding": [
 				{
@@ -4185,7 +4225,6 @@
 			"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
 			"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
 			"dev": true,
-			"license": "MIT",
 			"dependencies": {
 				"callsites": "^3.0.0"
 			},
@@ -4281,9 +4320,9 @@
 			}
 		},
 		"node_modules/postcss": {
-			"version": "8.4.47",
-			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
-			"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+			"version": "8.4.49",
+			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
+			"integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
 			"dev": true,
 			"funding": [
 				{
@@ -4301,7 +4340,7 @@
 			],
 			"dependencies": {
 				"nanoid": "^3.3.7",
-				"picocolors": "^1.1.0",
+				"picocolors": "^1.1.1",
 				"source-map-js": "^1.2.1"
 			},
 			"engines": {
@@ -4399,7 +4438,6 @@
 			"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
 			"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
 			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=4"
 			}
@@ -4415,9 +4453,9 @@
 			}
 		},
 		"node_modules/rollup": {
-			"version": "4.24.0",
-			"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz",
-			"integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
+			"version": "4.27.4",
+			"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz",
+			"integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==",
 			"dev": true,
 			"dependencies": {
 				"@types/estree": "1.0.6"
@@ -4430,22 +4468,24 @@
 				"npm": ">=8.0.0"
 			},
 			"optionalDependencies": {
-				"@rollup/rollup-android-arm-eabi": "4.24.0",
-				"@rollup/rollup-android-arm64": "4.24.0",
-				"@rollup/rollup-darwin-arm64": "4.24.0",
-				"@rollup/rollup-darwin-x64": "4.24.0",
-				"@rollup/rollup-linux-arm-gnueabihf": "4.24.0",
-				"@rollup/rollup-linux-arm-musleabihf": "4.24.0",
-				"@rollup/rollup-linux-arm64-gnu": "4.24.0",
-				"@rollup/rollup-linux-arm64-musl": "4.24.0",
-				"@rollup/rollup-linux-powerpc64le-gnu": "4.24.0",
-				"@rollup/rollup-linux-riscv64-gnu": "4.24.0",
-				"@rollup/rollup-linux-s390x-gnu": "4.24.0",
-				"@rollup/rollup-linux-x64-gnu": "4.24.0",
-				"@rollup/rollup-linux-x64-musl": "4.24.0",
-				"@rollup/rollup-win32-arm64-msvc": "4.24.0",
-				"@rollup/rollup-win32-ia32-msvc": "4.24.0",
-				"@rollup/rollup-win32-x64-msvc": "4.24.0",
+				"@rollup/rollup-android-arm-eabi": "4.27.4",
+				"@rollup/rollup-android-arm64": "4.27.4",
+				"@rollup/rollup-darwin-arm64": "4.27.4",
+				"@rollup/rollup-darwin-x64": "4.27.4",
+				"@rollup/rollup-freebsd-arm64": "4.27.4",
+				"@rollup/rollup-freebsd-x64": "4.27.4",
+				"@rollup/rollup-linux-arm-gnueabihf": "4.27.4",
+				"@rollup/rollup-linux-arm-musleabihf": "4.27.4",
+				"@rollup/rollup-linux-arm64-gnu": "4.27.4",
+				"@rollup/rollup-linux-arm64-musl": "4.27.4",
+				"@rollup/rollup-linux-powerpc64le-gnu": "4.27.4",
+				"@rollup/rollup-linux-riscv64-gnu": "4.27.4",
+				"@rollup/rollup-linux-s390x-gnu": "4.27.4",
+				"@rollup/rollup-linux-x64-gnu": "4.27.4",
+				"@rollup/rollup-linux-x64-musl": "4.27.4",
+				"@rollup/rollup-win32-arm64-msvc": "4.27.4",
+				"@rollup/rollup-win32-ia32-msvc": "4.27.4",
+				"@rollup/rollup-win32-x64-msvc": "4.27.4",
 				"fsevents": "~2.3.2"
 			}
 		},
@@ -4658,11 +4698,10 @@
 			"license": "MIT"
 		},
 		"node_modules/std-env": {
-			"version": "3.7.0",
-			"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz",
-			"integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==",
-			"dev": true,
-			"license": "MIT"
+			"version": "3.8.0",
+			"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz",
+			"integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==",
+			"dev": true
 		},
 		"node_modules/string-argv": {
 			"version": "0.3.2",
@@ -4930,13 +4969,6 @@
 				"url": "https://github.com/sponsors/isaacs"
 			}
 		},
-		"node_modules/text-table": {
-			"version": "0.2.0",
-			"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-			"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
-			"dev": true,
-			"license": "MIT"
-		},
 		"node_modules/tinybench": {
 			"version": "2.9.0",
 			"resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
@@ -4945,9 +4977,9 @@
 			"license": "MIT"
 		},
 		"node_modules/tinyexec": {
-			"version": "0.3.0",
-			"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz",
-			"integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==",
+			"version": "0.3.1",
+			"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz",
+			"integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==",
 			"dev": true
 		},
 		"node_modules/tinypool": {
@@ -5002,9 +5034,9 @@
 			}
 		},
 		"node_modules/ts-api-utils": {
-			"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==",
+			"version": "1.4.2",
+			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.2.tgz",
+			"integrity": "sha512-ZF5gQIQa/UmzfvxbHZI3JXN0/Jt+vnAfAviNRAMc491laiK6YCLpCW9ft8oaCRFOTxCZtUTE6XB0ZQAe3olntw==",
 			"dev": true,
 			"engines": {
 				"node": ">=16"
@@ -5161,9 +5193,9 @@
 			}
 		},
 		"node_modules/typescript": {
-			"version": "5.6.3",
-			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
-			"integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+			"version": "5.7.2",
+			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
+			"integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
 			"dev": true,
 			"bin": {
 				"tsc": "bin/tsc",
@@ -5174,14 +5206,14 @@
 			}
 		},
 		"node_modules/typescript-eslint": {
-			"version": "8.11.0",
-			"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.11.0.tgz",
-			"integrity": "sha512-cBRGnW3FSlxaYwU8KfAewxFK5uzeOAp0l2KebIlPDOT5olVi65KDG/yjBooPBG0kGW/HLkoz1c/iuBFehcS3IA==",
+			"version": "8.16.0",
+			"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.16.0.tgz",
+			"integrity": "sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/eslint-plugin": "8.11.0",
-				"@typescript-eslint/parser": "8.11.0",
-				"@typescript-eslint/utils": "8.11.0"
+				"@typescript-eslint/eslint-plugin": "8.16.0",
+				"@typescript-eslint/parser": "8.16.0",
+				"@typescript-eslint/utils": "8.16.0"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5190,6 +5222,9 @@
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
+			"peerDependencies": {
+				"eslint": "^8.57.0 || ^9.0.0"
+			},
 			"peerDependenciesMeta": {
 				"typescript": {
 					"optional": true
@@ -5213,9 +5248,9 @@
 			}
 		},
 		"node_modules/undici-types": {
-			"version": "6.19.8",
-			"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
-			"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+			"version": "6.20.0",
+			"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+			"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
 			"dev": true
 		},
 		"node_modules/universalify": {
@@ -5238,16 +5273,15 @@
 			}
 		},
 		"node_modules/uuid": {
-			"version": "10.0.0",
-			"resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
-			"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+			"version": "11.0.3",
+			"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz",
+			"integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==",
 			"funding": [
 				"https://github.com/sponsors/broofa",
 				"https://github.com/sponsors/ctavan"
 			],
-			"license": "MIT",
 			"bin": {
-				"uuid": "dist/bin/uuid"
+				"uuid": "dist/esm/bin/uuid"
 			}
 		},
 		"node_modules/v8-compile-cache-lib": {
@@ -5258,20 +5292,20 @@
 			"license": "MIT"
 		},
 		"node_modules/vite": {
-			"version": "5.4.10",
-			"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz",
-			"integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==",
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/vite/-/vite-6.0.1.tgz",
+			"integrity": "sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==",
 			"dev": true,
 			"dependencies": {
-				"esbuild": "^0.21.3",
-				"postcss": "^8.4.43",
-				"rollup": "^4.20.0"
+				"esbuild": "^0.24.0",
+				"postcss": "^8.4.49",
+				"rollup": "^4.23.0"
 			},
 			"bin": {
 				"vite": "bin/vite.js"
 			},
 			"engines": {
-				"node": "^18.0.0 || >=20.0.0"
+				"node": "^18.0.0 || ^20.0.0 || >=22.0.0"
 			},
 			"funding": {
 				"url": "https://github.com/vitejs/vite?sponsor=1"
@@ -5280,19 +5314,25 @@
 				"fsevents": "~2.3.3"
 			},
 			"peerDependencies": {
-				"@types/node": "^18.0.0 || >=20.0.0",
+				"@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+				"jiti": ">=1.21.0",
 				"less": "*",
 				"lightningcss": "^1.21.0",
 				"sass": "*",
 				"sass-embedded": "*",
 				"stylus": "*",
 				"sugarss": "*",
-				"terser": "^5.4.0"
+				"terser": "^5.16.0",
+				"tsx": "^4.8.1",
+				"yaml": "^2.4.2"
 			},
 			"peerDependenciesMeta": {
 				"@types/node": {
 					"optional": true
 				},
+				"jiti": {
+					"optional": true
+				},
 				"less": {
 					"optional": true
 				},
@@ -5313,70 +5353,78 @@
 				},
 				"terser": {
 					"optional": true
+				},
+				"tsx": {
+					"optional": true
+				},
+				"yaml": {
+					"optional": true
 				}
 			}
 		},
 		"node_modules/vite-node": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.3.tgz",
-			"integrity": "sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==",
+			"version": "2.1.6",
+			"resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.6.tgz",
+			"integrity": "sha512-DBfJY0n9JUwnyLxPSSUmEePT21j8JZp/sR9n+/gBwQU6DcQOioPdb8/pibWfXForbirSagZCilseYIwaL3f95A==",
 			"dev": true,
 			"dependencies": {
 				"cac": "^6.7.14",
-				"debug": "^4.3.6",
+				"debug": "^4.3.7",
+				"es-module-lexer": "^1.5.4",
 				"pathe": "^1.1.2",
-				"vite": "^5.0.0"
+				"vite": "^5.0.0 || ^6.0.0"
 			},
 			"bin": {
 				"vite-node": "vite-node.mjs"
 			},
 			"engines": {
-				"node": "^18.0.0 || >=20.0.0"
+				"node": "^18.0.0 || ^20.0.0 || >=22.0.0"
 			},
 			"funding": {
 				"url": "https://opencollective.com/vitest"
 			}
 		},
 		"node_modules/vitest": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz",
-			"integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==",
-			"dev": true,
-			"dependencies": {
-				"@vitest/expect": "2.1.3",
-				"@vitest/mocker": "2.1.3",
-				"@vitest/pretty-format": "^2.1.3",
-				"@vitest/runner": "2.1.3",
-				"@vitest/snapshot": "2.1.3",
-				"@vitest/spy": "2.1.3",
-				"@vitest/utils": "2.1.3",
-				"chai": "^5.1.1",
-				"debug": "^4.3.6",
-				"magic-string": "^0.30.11",
+			"version": "2.1.6",
+			"resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.6.tgz",
+			"integrity": "sha512-isUCkvPL30J4c5O5hgONeFRsDmlw6kzFEdLQHLezmDdKQHy8Ke/B/dgdTMEgU0vm+iZ0TjW8GuK83DiahBoKWQ==",
+			"dev": true,
+			"dependencies": {
+				"@vitest/expect": "2.1.6",
+				"@vitest/mocker": "2.1.6",
+				"@vitest/pretty-format": "^2.1.6",
+				"@vitest/runner": "2.1.6",
+				"@vitest/snapshot": "2.1.6",
+				"@vitest/spy": "2.1.6",
+				"@vitest/utils": "2.1.6",
+				"chai": "^5.1.2",
+				"debug": "^4.3.7",
+				"expect-type": "^1.1.0",
+				"magic-string": "^0.30.12",
 				"pathe": "^1.1.2",
-				"std-env": "^3.7.0",
+				"std-env": "^3.8.0",
 				"tinybench": "^2.9.0",
-				"tinyexec": "^0.3.0",
-				"tinypool": "^1.0.0",
+				"tinyexec": "^0.3.1",
+				"tinypool": "^1.0.1",
 				"tinyrainbow": "^1.2.0",
-				"vite": "^5.0.0",
-				"vite-node": "2.1.3",
+				"vite": "^5.0.0 || ^6.0.0",
+				"vite-node": "2.1.6",
 				"why-is-node-running": "^2.3.0"
 			},
 			"bin": {
 				"vitest": "vitest.mjs"
 			},
 			"engines": {
-				"node": "^18.0.0 || >=20.0.0"
+				"node": "^18.0.0 || ^20.0.0 || >=22.0.0"
 			},
 			"funding": {
 				"url": "https://opencollective.com/vitest"
 			},
 			"peerDependencies": {
 				"@edge-runtime/vm": "*",
-				"@types/node": "^18.0.0 || >=20.0.0",
-				"@vitest/browser": "2.1.3",
-				"@vitest/ui": "2.1.3",
+				"@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+				"@vitest/browser": "2.1.6",
+				"@vitest/ui": "2.1.6",
 				"happy-dom": "*",
 				"jsdom": "*"
 			},
diff --git a/package.json b/package.json
index 98e058f..a1b241d 100644
--- a/package.json
+++ b/package.json
@@ -33,25 +33,25 @@
 		"prepublishOnly": "node scripts/check-release.mjs"
 	},
 	"devDependencies": {
-		"@eslint/js": "9.13.0",
-		"@microsoft/api-extractor": "7.47.11",
+		"@eslint/js": "9.15.0",
+		"@microsoft/api-extractor": "7.48.0",
 		"@types/eslint__js": "8.42.3",
-		"@types/node": "22.7.9",
+		"@types/node": "22.10.1",
 		"@types/seedrandom": "3.0.8",
 		"@types/uuid": "10.0.0",
-		"@vitest/coverage-v8": "2.1.3",
+		"@vitest/coverage-v8": "2.1.6",
 		"chalk": "5.3.0",
-		"eslint": "9.13.0",
+		"eslint": "9.15.0",
 		"eslint-plugin-import": "2.31.0",
 		"semver": "7.6.3",
 		"ts-node": "10.9.2",
-		"typescript": "5.6.3",
-		"typescript-eslint": "8.11.0",
-		"vitest": "2.1.3"
+		"typescript": "5.7.2",
+		"typescript-eslint": "8.16.0",
+		"vitest": "2.1.6"
 	},
 	"dependencies": {
 		"seedrandom": "3.0.5",
 		"stringz": "2.1.0",
-		"uuid": "10.0.0"
+		"uuid": "11.0.3"
 	}
 }
diff --git a/src/parser/visit.ts b/src/parser/visit.ts
index 36fcf3a..efe878b 100644
--- a/src/parser/visit.ts
+++ b/src/parser/visit.ts
@@ -11,6 +11,7 @@ function visitNodeInner(node: Ast.Node, fn: (node: Ast.Node, ancestors: Ast.Node
 	// nested nodes
 	switch (result.type) {
 		case 'def': {
+			result.attr = result.attr.map((attr) => visitNodeInner(attr, fn, ancestors) as Ast.Attribute);
 			result.expr = visitNodeInner(result.expr, fn, ancestors) as Ast.Definition['expr'];
 			break;
 		}
diff --git a/translations/en/CONTRIBUTING.md b/translations/en/CONTRIBUTING.md
index 60159cc..01699a0 100644
--- a/translations/en/CONTRIBUTING.md
+++ b/translations/en/CONTRIBUTING.md
@@ -8,6 +8,8 @@ When you want to add a feature or fix a bug, first have the design and policy re
 Also, when you start implementation, please assign yourself to the issue in question (if you cannot do it yourself, please ask another member to assign you).
 By indicating that you are going to implement it, you can avoid conflicts.
 
+If your request has changes of language behavior, please update the tests and [documents](https://github.com/aiscript-dev/aiscript-dev.github.io) simultaneously.
+
 ## Tools
 ### Vitest
 In this project, we have introduced [Vitest](https://vitest.dev) as a testing framework.
@@ -51,4 +53,4 @@ Also, be aware of the "review perspective" described below.
     - Is the expected behavior ensured by the test?
     - Are there any loose ends or leaks?
     - Are you able to check for abnormal systems?
-    
\ No newline at end of file
+    
diff --git a/translations/en/README.md b/translations/en/README.md
index 2b8387c..9715d2a 100644
--- a/translations/en/README.md
+++ b/translations/en/README.md
@@ -1,4 +1,4 @@
-<h1><img src="../../aiscript.svg" alt="AiScript" width="300"></h1>
+<h1><img src="../../aiscript.png" alt="AiScript" width="300"></h1>
 
 [![](https://img.shields.io/npm/v/@syuilo/aiscript.svg?style=flat-square)](https://www.npmjs.com/package/@syuilo/aiscript)
 ![](https://github.com/syuilo/aiscript/workflows/ci/badge.svg)
@@ -27,10 +27,10 @@ This repository contains parsers and processors implemented in JavaScript.
 Note: AiScript and [Misskey](https://github.com/syuilo/misskey) are completely independent projects. AiScript does not prescribe any specific host, but Misskey is the largest user of AiScript (today!)
 
 ## Getting started (language)
-[See here](./docs/get-started.md)
+[See here](https://aiscript-dev.github.io/en/guides/get-started.html)
 
 ## Getting started (host implementation)
-todo
+[See here](https://aiscript-dev.github.io/en/guides/implementation.html)
 
 ## Example programs
 ### Hello world
diff --git a/translations/en/docs/README.md b/translations/en/docs/README.md
new file mode 100644
index 0000000..4688ae6
--- /dev/null
+++ b/translations/en/docs/README.md
@@ -0,0 +1,8 @@
+# Documents moved
+The documents that were under this directory have been moved to the new web page.
+
+[issue](https://github.com/aiscript-dev/aiscript/issues/804)
+
+[New Page](https://aiscript-dev.github.io/en/)
+
+[Repository of the New Page](https://github.com/aiscript-dev/aiscript-dev.github.io)
diff --git a/translations/en/docs/builtin-props.md b/translations/en/docs/builtin-props.md
deleted file mode 100644
index d05a3a1..0000000
--- a/translations/en/docs/builtin-props.md
+++ /dev/null
@@ -1,144 +0,0 @@
-A built-in property is a special value or function for specific type that can be called in the same notation as an object property.
-```js
-// example
-'ai kawaii'.len //9
-
-Core:range(0,2).push(4) //[0,1,2,4]
-```
-Currently, built-in properties for types number, string, array, and error are available.  
-The object equivalent is implemented as [std function](std.md#-obj) due to confliction of notation.  
-
-## Format
-> #(_v_: type_name).prop_name
-
-Prefix # indicates it is a primitive property that is not a function.  
-> @(_v_: type_name).prop_name(args): return_type
-
-Prefix @ indicates it is a primitive property that is a function.  
-
-## Number
-### @(_x_: num).to_str(): str
-Gets string representation of the number. 
-
-
-## String
-### #(_v_: str).len
-type: `num`  
-Length of the string.  
-
-### @(_v_: str).to_num(): num | null
-Gets the numeric value that the string represents.  
-
-### @(_v_: str).pick(_index_: num): str | null
-Gets the character at _index_ .  
-
-### @(_v_: str).incl(_keyword_: str): bool
-Checks for the presence of _keyword_ in the string.  
-
-### @(_v_: str).slice(_begin_: num, _end_: num): str
-Obtains specified portion of the string.  
-
-### @(_v_: str).split(_splitter_?: str): arr<str>
-Returns the string separated into array at the point where the _splitter_ is located.  
-
-### @(_v_: str).replace( _old_: str, _new_: str): str
-Returns the string with including _old_ (s) replaced with _new_.  
-
-### @(_v_: str).index_of(_search_: str): num
-Searches for _search_ in the string and returns its index.  
-
-### @(_v_: str).trim(): str
-Returns the string with leading and trailing whitespace removed.  
-
-### @(_v_: str).upper(): str
-Returns the string converted to uppercase.  
-
-### @(_v_: str).lower(): str
-Returns the string converted to lowercase.  
-
-### @(_v_: str).codepoint_at(_index_: num): num | null
-Gets the codepoint of the character at _index_.  
-Returns null if the character does not exist there.
-
-
-## Array
-### #(_v_: arr).len
-type: `num`  
-Number of elements in the array.  
-
-### @(_v_: arr).push(_i_: value): null
-**MODIFIES THE ARRAY**  
-Appends an element to the end of the array.  
-
-### @(_v_: arr).unshift(i: value): null
-**MODIFIES THE ARRAY***  
-Prepends an element to the beginning of the array.
-
-### @(_v_: arr).pop(): value
-**MODIFIES THE ARRAY***  
-Extracts the last element of the array.  
-
-### @(_v_: arr).shift(): value
-**MODIFIES THE ARRAY***  
-Extracts the first element of the array.  
-
-### @(_a_: arr).concat(_b_: arr): arr
-Returns an array concatenating the array and _b_.  
-
-### @(_v_: arr<str>).join(_joiner_?: str): str
-Combines all elements of the string array and returns them as a single string.  
-
-### @(_v_: arr).slice(_begin_: num, _end_: num): arr
-Obtains specified portion of the array.  
-
-### @(_v_: arr).incl(_val_: value): bool
-Checks if there is an element in the array with the value _val_.  
-
-### @(_v_: arr).map(_func_: fn): arr
-Executes _func_ for each element of the array asynchronously.  
-Returns the array of results.  
-
-### @(_v_: arr).filter(_func_: fn): arr
-Executes _func_ for each element of the array asynchronously.  
-Returns only those elements of the array for which _func_ returns true.  
-
-### @(_v_: arr).reduce(_func_: @(_acm_: value, _item_: value, _index_: num): value, _initial_?: value): value
-Executes _func_ for each element in turn.  
-_func_ is given the previous result as _acm_.  
-if _initial_ is given, _func_ is initially called with arguments (_initial_, _v_\[0], 0).  
-Otherwise, (_v_\[0], _v_\[1], 1).  
-
-### @(_v_: arr).find(_func_: @(_item_: value, _index_: num) { bool }): value
-Finds elements in the array such that _func_ returns true.  
-
-### @(_v_: arr).index_of(_val_: value, _fromIndex_?: num): num
-Finds a value that equals to _val_, and returns the index.  
-If _fromIndex_ is given, the search starts from there.
-When _fromIndex_ is negative, index from the end(length of the array + _fromIndex_) is used.
-When not found, returns -1.
-
-### @(_v_: arr).reverse(): null
-**Modifying**
-Reverses the array.  
-
-### @(_v_: arr).copy(): arr
-Generates a copy of the array.  
-
-### @(_v_: arr).sort(_comp_: @(_a_: value, _b_: value)): arr
-**MODIFIES THE ARRAY***
-Sorts the array.  
-_comp_ is the comparison function that returns:
-* negative value if _a_ should precede _b_
-* positive value if _a_ should succeed _b_
-* 0 if either is acceptable
-
-`Str:lt` and `Str:gt` are available as comparison function. See [std.md](./std.md#-Str)
-
-## Error type
-### #(_v_: error).name
-type: `str`  
-Identifier string of the error.
-
-### #(_v_: error).info
-type: `value`  
-Additional information about the error, if any.
diff --git a/translations/en/docs/get-started.md b/translations/en/docs/get-started.md
deleted file mode 100644
index 701ccc2..0000000
--- a/translations/en/docs/get-started.md
+++ /dev/null
@@ -1,240 +0,0 @@
-# Getting started
-## Introduction
-AiScript is a programming language.
-This document assumes that you already have some programming knowledge.
-Therefore, I will only write about the syntax and specifications of AiScript, and leave out the description of programming itself.
-
-## Hello, world!
-In AiScript, it is written as follows:
-```
-print("Hello, world!")
-```
-
-`print( ~ )` is a function call. The name of the function to be called is written before the parentheses, and the arguments are written inside the parentheses.
-If there are multiple arguments, they are listed separated by `,`.
-The details of the function are described later.
-
-`"~"` is a string literal. Anything enclosed in `"` is a string.
-
-Incidentally, `print( ~ )` has a sugar-coated syntax and can be written as follows:
-```
-<: "Hello, world!"
-```
-
-## Comments
-AiScript comments start with `//`.
-Comments do not affect the behavior of the program.
-
-```
-// this is a comment
-```
-
-## Primary object
-<table>
-	<tr><th>Type</th><th>Form</th><th>Example of literal</th></tr>
-	<tr><td>string</td><td><code>str</code></td><td><code>"kawaii"</code></td></tr>
-	<tr><td>numeric</td><td><code>num</code></td><td><code>42</code></td></tr>
-	<tr><td>truth-value</td><td><code>bool</code></td><td><code>true</code>/<code>false</code></td></tr>
-	<tr><td>array</td><td><code>arr</code></td><td><code>["ai" "chan" "cute"]</code></td></tr>
-	<tr><td>object</td><td><code>obj</code></td><td><code>{ foo: "bar"; a: 42; }</code></td></tr>
-	<tr><td>null</td><td><code>null</code></td><td><code>null</code></td></tr>
-	<tr><td>function</td><td><code>fn</code></td><td><code>@(x) { x }</code></td></tr>
-</table>
-
-## Variables
-### Declaration
-The variable declaration is written as follows:
-```
-#message = "Hello"
-```
-
-Write the name of the variable after `let` and the value after `=`.
-
-In AiScript, variables declared in this way are immutable. In other words, you cannot change the value of a variable later.
-To create a variable that can be reassigned, declare the variable with `var` instead of `let`. Example:
-```
-// Declare a mutable variable.
-var message = "Hello"
-
-// reassignment
-message = "Hi"
-
-// Reassigning again
-message = "Yo"
-```
-
-### Reference
-When referring to the value of a variable, simply write the name of the variable:
-```
-print(message)
-```
-
-## Array
-Enumerate expressions in an array `[]`, separated by spaces.
-```
-["ai" "chan" "kawaii"]
-```
-
-To access an element of an array, write `[<index>]`. The index starts at 0.
-```
-let arr = ["ai" "chan" "kawaii"]
-<: arr[0] // "ai"
-```
-
-## Object
-```
-{
-	foo: "bar"
-	answer: 42
-	nested: {
-		some: "thing"
-	}
-}
-```
-
-## Arithmetic operation
-The operation is
-```
-(1 + 1)
-```
-This is a sugar-coated syntax for function calls. This is the sugar-coated syntax for function calls, and is actually interpreted as such:
-```
-Core:add(1, 1)
-```
-
-All of the functions listed below can be used as sugar-coated syntax such as `(1 + 1)`.
-
-<table>
-	<tr><th>Function</th><th>Operator</th><th>Meaning</th></tr>
-	<tr><td><code>Core:add</code></td><td><code>+</code></td><td>addition</td></tr>
-	<tr><td><code>Core:sub</code></td><td><code>-</code></td><td>subtraction</td></tr>
-	<tr><td><code>Core:mul</code></td><td><code>*</code></td><td>multiplication</td></tr>
-	<tr><td><code>Core:pow</code></td><td><code>^</code></td><td>exponentiation</td></tr>
-	<tr><td><code>Core:div</code></td><td><code>/</code></td><td>division</td></tr>
-	<tr><td><code>Core:mod</code></td><td><code>%</code></td><td>remainder</td></tr>
-	<tr><td><code>Core:eq</code></td><td><code>==</code></td><td>equal</td></tr>
-	<tr><td><code>Core:and</code></td><td><code>&&</code></td><td>and</td></tr>
-	<tr><td><code>Core:or</code></td><td><code>||</code></td><td>or</td></tr>
-	<tr><td><code>Core:gt</code></td><td><code>></code></td><td>greater than</td></tr>
-	<tr><td><code>Core:lt</code></td><td><code><</code></td><td>less than</td></tr>
-</table>
-
-## Block
-A block is a collection of processes, written as `eval { ~ }`.
-The expression written at the end of the block will be returned as the value of the block.
-```
-let foo = eval {
-	let a = 1
-	let b = 2
-	(a + b)
-}
-
-<: foo // 3
-```
-
-The block itself is also a formula.
-
-## Conditional branching
-The conditional branch in AiScript is written as follows:
-```
-if (a == b) {
-	<: "a is equal to b"
-}
-```
-
-After `if`, write an expression (condition) that returns a bool, followed by an expression (then clause) that will be evaluated if the condition is met.
-You can add `else` after the `then' clause and add an expression to handle the case when the condition is not met:
-```
-if (a == b) {
-	<: "a is equal to b"
-} else {
-	<: "a is not equal to b"
-}
-```
-
-You can also write conditional expressions after `elif` to make multiple conditional decisions:
-```
-if (a == b) {
-	<: "a is equal to b"
-} elif (a > b) {
-	<: "a is grater than b"
-} else {
-	<: "a is less than b"
-}
-```
-
-Since these conditional branches are expressions, they can return a value in the block:
-```
-<: if (a == b) {
-	"a is equal to b"
-} elif (a > b) {
-	"a is grater than b"
-} else {
-	"a is less than b"
-}
-```
-
-## Loop
-To iterate in AiScript, write the following:
-```
-for (let i, 100) {
-	<: i
-}
-```
-After `for`, write the name of the iterator variable, and after `,` write an expression that returns the number of iterations. Write the process to be repeated in the block that follows.
-The iterator variable can also be omitted:
-```
-for (100) {
-	<: "yo"
-}
-```
-
-## Loop (array)
-You can use `each` to repeat items in an array:
-```
-let items = ["a" "b" "c"]
-each (let item, items) {
-	<: item
-}
-```
-
-## Function
-### Function definition
-Write the following:
-```
-@fn(x) {
-	(x * 2)
-}
-```
-
-Write the function name after `@` and the argument definition in parentheses. After that, the block becomes the process of the function.
-
-### return
-The value of the expression written at the end of the function will be the return value of the function, but if you want to return a value in the middle of the function, use `return`.
-
-## Template
-You can embed variables and expressions in a string:
-```
-let ai = "kawaii"
-<: `Hello, {ai} world!`
-```
-
-## Metadata
-This function allows you to embed metadata in AiScript files.
-```
-### {
-	name: "example"
-	version: 42
-	keywords: ["foo" "bar" "baz"]
-}
-```
-# Examples
-## FizzBuzz
-```
-for (let i, 100) {
-	<: if (i % 15 == 0) "FizzBuzz"
-		elif (i % 3 == 0) "Fizz"
-		elif (i % 5 == 0) "Buzz"
-		else i
-}
-```
diff --git a/translations/en/docs/std.md b/translations/en/docs/std.md
deleted file mode 100644
index 32098a9..0000000
--- a/translations/en/docs/std.md
+++ /dev/null
@@ -1,227 +0,0 @@
-## Std constants & functions
-Refers to constants and functions that are defined during initialization of the AiScript interpreter and can be used anywhere in script.
-
-## Format
-> #Core:v
-
-A prefix `#` indicates a std constant.  
-In this case, the name is `Core:v`.
-> @Core:type(_v_: value): str
-
-A prefix `@` indicates a std function.  
-The example shown is a function called `Core:type`,
-it takes one argument of type `value` (i.e., any type) named `v` and returns a value of type `str` (string type).
-
-# List
-
-## std
-### @print(message: str): void
-Outputs a string. (In most cases the string will be displayed on screen, but behavior is up to the host implementation.)  
-
-### @readline(message: str): str
-Accepts input of character strings.  
-
-## :: Core
-### #Core:v
-Type: `str`.  
-AiScript version.
-
-### @Core:type(v: value): str
-Gets the type name of the value.  
-
-### @Core:to_str(v: value): str
-Gets a string representation of a value.  
-
-### @Core:sleep(_time_: value): void
-Waits for the specified time (milliseconds).  
-
-## :: Util
-### @Util:uuid(): str
-Generates a new UUID.
-
-## :: Json
-### @Json:stringify(v: value): str
-Generates JSON from a value.
-
-### @Json:parse(json: str): value
-Parses JSON into value.  
-Returns an error type value (`name`=`'not_json'`) if given string is not parsable as JSON.  
-
-### @Json:parsable(_str_: str): bool
-Determines if a string can be parsed as JSON. Exists for historical reasons.  
-
-## :: Date
-### @Date:now(): num
-Gets the current time as a number for use in the functions below.  Technically, the value is the same as when you use `Date.now()` in Javascript.
-
-### @Date:year(_date_?: num): num
-### @Date:month(_date_?: num): num
-### @Date:day(_date_?: num): num
-### @Date:hour(_date_?: num): num
-### @Date:minute(_date_?: num): num
-### @Date:second(_date_?: num): num
-Gets the current value of the corresponding unit of time.  
-If a value obtained with `Date:now()` is passed as an argument, it returns the value corresponding to that time.  
-
-### @Date:parse(date: str): num
-If the string can be interpreted as a time, converts into the same format as `Date:now()`.  
-For conversion, it uses the JavaScript Date constructor internally.
-
-## :: Math
-### #Math:PI
-Type: `num`.  
-It's pi.
-
-### @Math:sin(x: num): num
-Calculate the sine.  
-
-### @Math:cos(x: num): num
-Calculate the cosine.  
-
-### @Math:abs(x: num): num
-Calculate the absolute value.  
-
-### @Math:sqrt(x: num): num
-Calculate the square root.  
-
-### @Math:round(x: num): num
-
-### @Math:ceil(x: num): num
-
-### @Math:floor(x: num): num
-
-### @Math:min(a: num, b: num): num
-Get the smaller value.  
-
-### @Math:max(a: num, b: num): num
-Get the larger value.  
-
-### @Math:rnd(min?: num, max?: num): num
-Generate a random number.  
-
-### @Math:gen_rng(seed: num | str): fn
-
-## :: Num
-### @Num:to_hex(x: num): str
-Generates a hexadecimal string from a number.  
-
-### @Num:from_hex(hex: str): num
-Generates a numeric value from a hexadecimal string.  
-
-## :: Str
-### #Str:lf
-Type: `str`.  
-Newline code (LF).
-
-### @Str:lt(a: str, b: str): num
-Returns -1 if a < b,  
-0 if a == b,  
-or 1 if a > b.  
-Using this as a comparison function for `arr.sort`, the array is sorted in ascending lexicographic order.  
-
-### @Str:gt(a: str, b: str): num
-Returns -1 if a > b,  
-0 if a == b,  
-or 1 if a < b.  
-Using this as the comparison function for `arr.sort`, the array is sorted in descending lexicographic order.  
-
-### @Str:from_codepoint(codepoint: num): str
-Generates character from unicode code point.   
-_codepoint_ must be greater than or equal to 0 and less than or equal to 10FFFFFF<sub>16</sub>.
-Multiple arguments are not supported yet.  
-
-### @Str:to_num(v: num | str): num | null
-
-### @Str:len(v: str): num
-Get the length of a string.
-
-### @Str:pick(v: str, i: num): str | null
-
-### @Str:incl(v: str, keyword: str): bool
-
-### @Str:slice(v: str, begin: num, end: num): str
-Get the specified portion of a string.  
-
-### @Str:split(v: str, splitter?: str): arr<str>
-
-### @Str:replace(v: str, old: str, new: str): str
-
-### @Str:index_of(v: str, search: str): num
-
-### @Str:trim(v: str): str
-
-### @Str:upper(v: str): str
-
-### @Str:lower(v: str): str
-
-## :: Arr
-
-### @Arr:len(v: arr): num
-Get the number of array elements.  
-
-### @Arr:push(v: arr, i: value): null
-Adds an element to the end of an array.  
-
-### @Arr:unshift(v: arr, i: value): null
-
-### @Arr:pop(v: arr): value
-Extracts the last element of an array.  
-
-### @Arr:shift(v: arr): value
-
-### @Arr:concat(a: arr, b: arr): arr
-Concatenate the arrays.
-
-### @Arr:join(v: arr<str>, joiner?: str): str
-Concatenates an array of strings and returns them as a single string.  
-
-### @Arr:slice(v: arr, begin: num, end: num): arr
-
-### @Arr:incl(v: arr, i: str | num | bool | null): bool
-Returns whether the array contains the specified value or not.  
-
-### @Arr:map(v: arr, f: fn): arr
-
-### @Arr:filter(v: arr, f: fn): arr
-
-### @Arr:reduce(v: arr, f: @(acm: value, item: value, index: num) { value }, initial: value): value
-
-### @Arr:find(v: arr, f: @(item: value, index: num) { bool }): value
-Searches for an element in an array.  
-
-### @Arr:reverse(v: arr): null
-Invert the array.  
-
-### @Arr:copy(v: arr): arr
-Generate a copy of the array.  
-
-## :: Obj
-
-### @Obj:keys(v: obj): arr
-### @Obj:vals(v: obj): arr
-### @Obj:kvs(v: obj): arr
-Returns an array of object keys, values, and key/value pairs, respectively.  
-
-### @Obj:get(v: obj, key: str): value
-Gets the value corresponding to the given key of the object.  
-Equivalent to `obj[key]`.  
-
-### @Obj:set(v: obj, key: str, val: value): null
-Sets the value corresponding to the given key of the object.  
-Equivalent to `obj[key] = val`.  
-
-### @Obj:has(v: obj, key: str): bool
-Checks if `obj[key]` exists.  
-
-### @Obj:copy(v: obj): obj
-Generate a copy of the object.  
-
-## :: Async
-
-### @Async:interval(interval: num, callback: fn, immediate?: bool): fn
-Calls the callback function at the specified period.  
-Returns the stop function as a return value.  
-
-### @Async:timeout(delay: num, callback: fn):
-Calls the callback function after the specified time has elapsed.  
-Returns the stop function as a return value.  
diff --git a/translations/en/docs/syntax.md b/translations/en/docs/syntax.md
deleted file mode 100644
index f25d413..0000000
--- a/translations/en/docs/syntax.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# Syntax
-## Comments
-Lines that begin with `//` are comments and do not affect the behavior of the program.
-
-```
-// this is a comment
-```
-
-## Variable declaration
-```
-let answer = 42
-```
-
-## if
-```
-if answer == 42 {
-	print("correct answer")
-}
-```
-
-else:
-```
-if answer == 42 {
-	print("correct answer")
-} elif {
-	print("wrong answer")
-}
-```
-
-else if:
-```
-if answer == "bebeyo" {
-	print("correct answer")
-} elif answer == "ai" {
-	print("kawaii")
-} else {
-	print("wrong answer")
-}
-```
-
-as expression:
-```
-let result =
-	if answer == "bebeyo" { "correct answer" }
-	elif answer == "ai" { "kawaii" }
-	else { "wrong answer" }
-
-print(result)
-```
-
-## for
-```
-for let i, 10 {
-	print(i)
-}
-```
-
-## Block
-```
-let foo = eval {
-	let x = 1
-	let y = 2
-	x + y
-}
-
-print(foo) // 3
-```
-
-## Function
-```
-@inc(x) {
-	x + 1
-}
-
-print(inc(42)) // 43
-```


Test patch:
diff --git a/test/keywords.ts b/test/keywords.ts
index 1311fd4..ca9fca1 100644
--- a/test/keywords.ts
+++ b/test/keywords.ts
@@ -1,9 +1,9 @@
 import { describe, expect, test } from 'vitest';
-import { Parser, Interpreter } from '../src';
+import { Parser } from '../src';
 import { AiScriptSyntaxError } from '../src/error';
-import { exe } from './testutils';
 
 const reservedWords = [
+	// 使用中の語
 	'null',
 	'true',
 	'false',
@@ -25,9 +25,55 @@ const reservedWords = [
 	'var',
 	'let',
 	'exists',
+
+	// 使用予定の語
+	// 文脈キーワードは識別子に利用できるため除外
+	'as',
+	'async',
+	'attr',
+	'attribute',
+	'await',
+	'catch',
+	'class',
+	// 'const',
+	'component',
+	'constructor',
+	// 'def',
+	'dictionary',
+	'enum',
+	'export',
+	'finally',
+	'fn',
+	// 'func',
+	// 'function',
+	'hash',
+	'in',
+	'interface',
+	'out',
+	'private',
+	'public',
+	'ref',
+	'static',
+	'struct',
+	'table',
+	'this',
+	'throw',
+	'trait',
+	'try',
+	'undefined',
+	'use',
+	'using',
+	'when',
+	'yield',
+	'import',
+	'is',
+	'meta',
+	'module',
+	'namespace',
+	'new',
 ] as const;
 
-const sampleCodes = Object.entries({
+const sampleCodes = Object.entries<(word: string) => string>({
 	variable: word =>
 	`
 	let ${word} = "ai"
@@ -66,24 +112,22 @@ const sampleCodes = Object.entries({
 	`,
 });
 
-function pickRandom<T>(arr: T[]): T {
-	return arr[Math.floor(Math.random() * arr.length)];
-}
+const parser = new Parser();
 
 describe.each(
 	sampleCodes
 )('reserved word validation on %s', (_, sampleCode) => {
 
 	test.concurrent.each(
-		[pickRandom(reservedWords)]
+		reservedWords
 	)('%s must be rejected', (word) => {
-		return expect(exe(sampleCode(word))).rejects.toThrow(AiScriptSyntaxError);
+		expect(() => parser.parse(sampleCode(word))).toThrow(AiScriptSyntaxError);
 	});
 
 	test.concurrent.each(
-		[pickRandom(reservedWords)]
+		reservedWords
 	)('%scat must be allowed', (word) => {
-		return exe(sampleCode(word+'cat'));
+		parser.parse(sampleCode(word+'cat'));
 	});
 
 });