Repository: elm-tooling/elm-language-server
Pull request #933 (2023-04-10 23:57:27)

Bump jest-diff from 29.3.1 to 29.5.0
Bumps [jest-diff](https://github.com/facebook/jest/tree/HEAD/packages/jest-diff) from 29.3.1 to 29.5.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/facebook/jest/releases">jest-diff's releases</a>.</em></p>
<blockquote>
<h2>v29.5.0</h2>
<h2>Features</h2>
<ul>
<li><code>[jest-changed-files]</code> Support Sapling (<a href="https://redirect.github.com/facebook/jest/pull/13941">#13941</a>)</li>
<li><code>[jest-circus, @jest/cli, jest-config]</code> Add feature to randomize order of tests via CLI flag or through the config file(<a href="https://redirect.github.com/facebook/jest/pull/12922">#12922</a>)</li>
<li><code>[jest-cli, jest-config, @jest/core, jest-haste-map, @jest/reporters, jest-runner, jest-runtime, @jest/types]</code> Add <code>workerThreads</code> configuration option to allow using <a href="https://nodejs.org/dist/latest/docs/api/worker_threads.html">worker threads</a> for parallelization (<a href="https://redirect.github.com/facebook/jest/pull/13939">#13939</a>)</li>
<li><code>[jest-cli]</code> Export <code>yargsOptions</code> (<a href="https://redirect.github.com/facebook/jest/pull/13970">#13970</a>)</li>
<li><code>[jest-config]</code> Add <code>openHandlesTimeout</code> option to configure possible open handles warning. (<a href="https://redirect.github.com/facebook/jest/pull/13875">#13875</a>)</li>
<li><code>[@jest/create-cache-key-function]</code> Allow passing <code>length</code> argument to <code>createCacheKey()</code> function and set its default value to <code>16</code> on Windows (<a href="https://redirect.github.com/facebook/jest/pull/13827">#13827</a>)</li>
<li><code>[jest-message-util]</code> Add support for <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError">AggregateError</a> (<a href="https://redirect.github.com/facebook/jest/pull/13946">#13946</a> &amp; <a href="https://redirect.github.com/facebook/jest/pull/13947">#13947</a>)</li>
<li><code>[jest-message-util]</code> Add support for <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause">Error causes</a> in <code>test</code> and <code>it</code> (<a href="https://redirect.github.com/facebook/jest/pull/13935">#13935</a> &amp; <a href="https://redirect.github.com/facebook/jest/pull/13966">#13966</a>)</li>
<li><code>[jest-reporters]</code> Add <code>summaryThreshold</code> option to summary reporter to allow overriding the internal threshold that is used to print the summary of all failed tests when the number of test suites surpasses it (<a href="https://redirect.github.com/facebook/jest/pull/13895">#13895</a>)</li>
<li><code>[jest-runtime]</code> Expose <code>@sinonjs/fake-timers</code> async APIs functions <code>advanceTimersByTimeAsync(msToRun)</code> (<code>tickAsync(msToRun)</code>), <code>advanceTimersToNextTimerAsync(steps)</code> (<code>nextAsync</code>), <code>runAllTimersAsync</code> (<code>runAllAsync</code>), and <code>runOnlyPendingTimersAsync</code> (<code>runToLastAsync</code>) (<a href="https://redirect.github.com/facebook/jest/pull/13981">#13981</a>)</li>
<li><code>[jest-runtime, @jest/transform]</code> Allow V8 coverage provider to collect coverage from files which were not loaded explicitly (<a href="https://redirect.github.com/facebook/jest/pull/13974">#13974</a>)</li>
<li><code>[jest-snapshot]</code> Add support to <code>cts</code> and <code>mts</code> TypeScript files to inline snapshots (<a href="https://redirect.github.com/facebook/jest/pull/13975">#13975</a>)</li>
<li><code>[jest-worker]</code> Add <code>start</code> method to worker farms (<a href="https://redirect.github.com/facebook/jest/pull/13937">#13937</a>)</li>
<li><code>[jest-worker]</code> Support passing a URL as path to worker (<a href="https://redirect.github.com/facebook/jest/pull/13982">#13982</a>)</li>
</ul>
<h2>Fixes</h2>
<ul>
<li><code>[babel-plugin-jest-hoist]</code> Fix unwanted hoisting of nested <code>jest</code> usages (<a href="https://redirect.github.com/facebook/jest/pull/13952">#13952</a>)</li>
<li><code>[jest-circus]</code> Send test case results for <code>todo</code> tests (<a href="https://redirect.github.com/facebook/jest/pull/13915">#13915</a>)</li>
<li><code>[jest-circus]</code> Update message printed on test timeout (<a href="https://redirect.github.com/facebook/jest/pull/13830">#13830</a>)</li>
<li><code>[jest-circus]</code> Avoid creating the word &quot;testfalse&quot; when <code>takesDoneCallback</code> is <code>false</code> in the message printed on test timeout AND updated timeouts test (<a href="https://redirect.github.com/facebook/jest/pull/13954">#13954</a>)</li>
<li><code>[jest-environment-jsdom]</code> Stop setting <code>document</code> to <code>null</code> on teardown (<a href="https://redirect.github.com/facebook/jest/pull/13972">#13972</a>)</li>
<li><code>[@jest/expect-utils]</code> Update <code>toStrictEqual()</code> to be able to check <code>jest.fn().mock.calls</code> (<a href="https://redirect.github.com/facebook/jest/pull/13960">#13960</a>)</li>
<li><code>[@jest/test-result]</code> Allow <code>TestResultsProcessor</code> type to return a Promise (<a href="https://redirect.github.com/facebook/jest/pull/13950">#13950</a>)</li>
</ul>
<h2>Chore &amp; Maintenance</h2>
<ul>
<li><code>[jest-snapshot]</code> Remove dependency on <code>jest-haste-map</code> (<a href="https://redirect.github.com/facebook/jest/pull/13977">#13977</a>)</li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/frosas"><code>@​frosas</code></a> made their first contribution in <a href="https://redirect.github.com/facebook/jest/pull/13932">facebook/jest#13932</a></li>
<li><a href="https://github.com/akshitsinha"><code>@​akshitsinha</code></a> made their first contribution in <a href="https://redirect.github.com/facebook/jest/pull/13915">facebook/jest#13915</a></li>
<li><a href="https://github.com/trajano"><code>@​trajano</code></a> made their first contribution in <a href="https://redirect.github.com/facebook/jest/pull/13827">facebook/jest#13827</a></li>
<li><a href="https://github.com/DercilioFontes"><code>@​DercilioFontes</code></a> made their first contribution in <a href="https://redirect.github.com/facebook/jest/pull/13954">facebook/jest#13954</a></li>
<li><a href="https://github.com/jsnajdr"><code>@​jsnajdr</code></a> made their first contribution in <a href="https://redirect.github.com/facebook/jest/pull/13952">facebook/jest#13952</a></li>
<li><a href="https://github.com/SteveFlames"><code>@​SteveFlames</code></a> made their first contribution in <a href="https://redirect.github.com/facebook/jest/pull/13895">facebook/jest#13895</a></li>
<li><a href="https://github.com/willc001"><code>@​willc001</code></a> made their first contribution in <a href="https://redirect.github.com/facebook/jest/pull/13970">facebook/jest#13970</a></li>
<li><a href="https://github.com/benjaminhobbs"><code>@​benjaminhobbs</code></a> made their first contribution in <a href="https://redirect.github.com/facebook/jest/pull/13901">facebook/jest#13901</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/facebook/jest/compare/v29.4.3...v29.5.0">https://github.com/facebook/jest/compare/v29.4.3...v29.5.0</a></p>
<h2>v29.4.3</h2>
<h2>Features</h2>
<ul>
<li><code>[expect]</code> Update <code>toThrow()</code> to be able to use error <code>cause</code>s (<a href="https://redirect.github.com/facebook/jest/pull/13606">#13606</a>)</li>
<li><code>[jest-core]</code> allow to use <code>workerIdleMemoryLimit</code> with only 1 worker or <code>runInBand</code> option (<a href="https://redirect.github.com/facebook/jest/pull/13846">#13846</a>)</li>
<li><code>[jest-message-util]</code> Add support for <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause">error <code>cause</code>s</a> (<a href="https://redirect.github.com/facebook/jest/pull/13868">#13868</a> &amp; <a href="https://redirect.github.com/facebook/jest/pull/13912">#13912</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/facebook/jest/blob/main/CHANGELOG.md">jest-diff's changelog</a>.</em></p>
<blockquote>
<h2>29.5.0</h2>
<h3>Features</h3>
<ul>
<li><code>[jest-changed-files]</code> Support Sapling (<a href="https://redirect.github.com/facebook/jest/pull/13941">#13941</a>)</li>
<li><code>[jest-circus, @jest/cli, jest-config]</code> Add feature to randomize order of tests via CLI flag or through the config file(<a href="https://redirect.github.com/facebook/jest/pull/12922">#12922</a>)</li>
<li><code>[jest-cli, jest-config, @jest/core, jest-haste-map, @jest/reporters, jest-runner, jest-runtime, @jest/types]</code> Add <code>workerThreads</code> configuration option to allow using <a href="https://nodejs.org/dist/latest/docs/api/worker_threads.html">worker threads</a> for parallelization (<a href="https://redirect.github.com/facebook/jest/pull/13939">#13939</a>)</li>
<li><code>[jest-cli]</code> Export <code>yargsOptions</code> (<a href="https://redirect.github.com/facebook/jest/pull/13970">#13970</a>)</li>
<li><code>[jest-config]</code> Add <code>openHandlesTimeout</code> option to configure possible open handles warning. (<a href="https://redirect.github.com/facebook/jest/pull/13875">#13875</a>)</li>
<li><code>[@jest/create-cache-key-function]</code> Allow passing <code>length</code> argument to <code>createCacheKey()</code> function and set its default value to <code>16</code> on Windows (<a href="https://redirect.github.com/facebook/jest/pull/13827">#13827</a>)</li>
<li><code>[jest-message-util]</code> Add support for <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError">AggregateError</a> (<a href="https://redirect.github.com/facebook/jest/pull/13946">#13946</a> &amp; <a href="https://redirect.github.com/facebook/jest/pull/13947">#13947</a>)</li>
<li><code>[jest-message-util]</code> Add support for <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause">Error causes</a> in <code>test</code> and <code>it</code> (<a href="https://redirect.github.com/facebook/jest/pull/13935">#13935</a> &amp; <a href="https://redirect.github.com/facebook/jest/pull/13966">#13966</a>)</li>
<li><code>[jest-reporters]</code> Add <code>summaryThreshold</code> option to summary reporter to allow overriding the internal threshold that is used to print the summary of all failed tests when the number of test suites surpasses it (<a href="https://redirect.github.com/facebook/jest/pull/13895">#13895</a>)</li>
<li><code>[jest-runtime]</code> Expose <code>@sinonjs/fake-timers</code> async APIs functions <code>advanceTimersByTimeAsync(msToRun)</code> (<code>tickAsync(msToRun)</code>), <code>advanceTimersToNextTimerAsync(steps)</code> (<code>nextAsync</code>), <code>runAllTimersAsync</code> (<code>runAllAsync</code>), and <code>runOnlyPendingTimersAsync</code> (<code>runToLastAsync</code>) (<a href="https://redirect.github.com/facebook/jest/pull/13981">#13981</a>)</li>
<li><code>[jest-runtime, @jest/transform]</code> Allow V8 coverage provider to collect coverage from files which were not loaded explicitly (<a href="https://redirect.github.com/facebook/jest/pull/13974">#13974</a>)</li>
<li><code>[jest-snapshot]</code> Add support to <code>cts</code> and <code>mts</code> TypeScript files to inline snapshots (<a href="https://redirect.github.com/facebook/jest/pull/13975">#13975</a>)</li>
<li><code>[jest-worker]</code> Add <code>start</code> method to worker farms (<a href="https://redirect.github.com/facebook/jest/pull/13937">#13937</a>)</li>
<li><code>[jest-worker]</code> Support passing a URL as path to worker (<a href="https://redirect.github.com/facebook/jest/pull/13982">#13982</a>)</li>
</ul>
<h3>Fixes</h3>
<ul>
<li><code>[babel-plugin-jest-hoist]</code> Fix unwanted hoisting of nested <code>jest</code> usages (<a href="https://redirect.github.com/facebook/jest/pull/13952">#13952</a>)</li>
<li><code>[jest-circus]</code> Send test case results for <code>todo</code> tests (<a href="https://redirect.github.com/facebook/jest/pull/13915">#13915</a>)</li>
<li><code>[jest-circus]</code> Update message printed on test timeout (<a href="https://redirect.github.com/facebook/jest/pull/13830">#13830</a>)</li>
<li><code>[jest-circus]</code> Avoid creating the word &quot;testfalse&quot; when <code>takesDoneCallback</code> is <code>false</code> in the message printed on test timeout AND updated timeouts test (<a href="https://redirect.github.com/facebook/jest/pull/13954">#13954</a>)</li>
<li><code>[jest-environment-jsdom]</code> Stop setting <code>document</code> to <code>null</code> on teardown (<a href="https://redirect.github.com/facebook/jest/pull/13972">#13972</a>)</li>
<li><code>[@jest/expect-utils]</code> Update <code>toStrictEqual()</code> to be able to check <code>jest.fn().mock.calls</code> (<a href="https://redirect.github.com/facebook/jest/pull/13960">#13960</a>)</li>
<li><code>[@jest/test-result]</code> Allow <code>TestResultsProcessor</code> type to return a Promise (<a href="https://redirect.github.com/facebook/jest/pull/13950">#13950</a>)</li>
</ul>
<h3>Chore &amp; Maintenance</h3>
<ul>
<li><code>[jest-snapshot]</code> Remove dependency on <code>jest-haste-map</code> (<a href="https://redirect.github.com/facebook/jest/pull/13977">#13977</a>)</li>
</ul>
<h2>29.4.3</h2>
<h3>Features</h3>
<ul>
<li><code>[expect]</code> Update <code>toThrow()</code> to be able to use error <code>cause</code>s (<a href="https://redirect.github.com/facebook/jest/pull/13606">#13606</a>)</li>
<li><code>[jest-core]</code> allow to use <code>workerIdleMemoryLimit</code> with only 1 worker or <code>runInBand</code> option (<a href="https://redirect.github.com/facebook/jest/pull/13846">#13846</a>)</li>
<li><code>[jest-message-util]</code> Add support for <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause">error <code>cause</code>s</a> (<a href="https://redirect.github.com/facebook/jest/pull/13868">#13868</a> &amp; <a href="https://redirect.github.com/facebook/jest/pull/13912">#13912</a>)</li>
<li><code>[jest-runtime]</code> Revert <code>import assertions</code> for JSON modules as it's been relegated to Stage 2 (<a href="https://redirect.github.com/facebook/jest/pull/13911">#13911</a>)</li>
</ul>
<h3>Fixes</h3>
<ul>
<li><code>[@jest/expect-utils]</code> <code>subsetEquality</code> should consider also an object's inherited string keys (<a href="https://redirect.github.com/facebook/jest/pull/13824">#13824</a>)</li>
<li><code>[jest-mock]</code> Clear mock state when <code>jest.restoreAllMocks()</code> is called (<a href="https://redirect.github.com/facebook/jest/pull/13867">#13867</a>)</li>
<li><code>[jest-mock]</code> Prevent <code>mockImplementationOnce</code> and <code>mockReturnValueOnce</code> bleeding into <code>withImplementation</code> (<a href="https://redirect.github.com/facebook/jest/pull/13888">#13888</a>)</li>
<li><code>[jest-mock]</code> Do not restore mocks when <code>jest.resetAllMocks()</code> is called (<a href="https://redirect.github.com/facebook/jest/pull/13866">#13866</a>)</li>
</ul>
<h2>29.4.2</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/facebook/jest/commit/39f3beda6b396665bebffab94e8d7c45be30454c"><code>39f3bed</code></a> v29.5.0</li>
<li><a href="https://github.com/facebook/jest/commit/a49c88610e49a3242576160740a32a2fe11161e1"><code>a49c886</code></a> v29.4.3</li>
<li><a href="https://github.com/facebook/jest/commit/6d2632adae0f0fa1fe116d3b475fd9783d0de1b5"><code>6d2632a</code></a> Update copyrights with Meta Platforms, restore original license in Jasmine fo...</li>
<li><a href="https://github.com/facebook/jest/commit/f0fc92e8443f09546c7ec0472bf9bce44fe5898f"><code>f0fc92e</code></a> v29.4.2</li>
<li><a href="https://github.com/facebook/jest/commit/ffe2352c781703b427fab10777043fb76d0d4267"><code>ffe2352</code></a> chore: move <code>@jest/test-utils</code> reference (<a href="https://github.com/facebook/jest/tree/HEAD/packages/jest-diff/issues/13468">#13468</a>)</li>
<li><a href="https://github.com/facebook/jest/commit/bc7b20c9d4f6c399477b5a2b955dc0e1b736cd9b"><code>bc7b20c</code></a> chore: make sure to exclude .eslintcache from published module (<a href="https://github.com/facebook/jest/tree/HEAD/packages/jest-diff/issues/13832">#13832</a>)</li>
<li><a href="https://github.com/facebook/jest/commit/bc84c8a15649aaaefdd624dc83824518c17467ed"><code>bc84c8a</code></a> v29.4.1</li>
<li><a href="https://github.com/facebook/jest/commit/4bc0e8acaf990e6618a7bed1dca67760c20bb12a"><code>4bc0e8a</code></a> v29.4.0</li>
<li>See full diff in <a href="https://github.com/facebook/jest/commits/v29.5.0/packages/jest-diff">compare view</a></li>
</ul>
</details>
<br />


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

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

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

---

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

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


</details>

socket-security[bot]: **New dependency changes detected.** Learn more about [Socket for GitHub ↗︎](https://socket.dev)

***
👍 No new dependency issues detected in pull request

<details>
<summary>
<strong>Bot Commands</strong>
</summary>
<p>To ignore an alert, reply with a comment starting with <code>@SocketSecurity ignore</code> followed by a space separated list of <code>package-name@version</code> specifiers. e.g. <code>@SocketSecurity ignore foo@1.0.0 bar@*</code> or ignore all packages with <code>@SocketSecurity ignore-all</code></p>
<ul>
</ul>

</details>
<details>
<summary>
<strong>Pull request alert summary</strong>
</summary>
<table>
<thead>
<tr>
<th>Issue</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href='https://socket.dev/npm/issue/installScripts'>Install scripts</a></td>
<td>✅ 0 issues</td>
</tr>
<tr>
<td><a href='https://socket.dev/npm/issue/hasNativeCode'>Native code</a></td>
<td>✅ 0 issues</td>
</tr>
<tr>
<td><a href='https://socket.dev/npm/issue/shellScriptOverride'>Bin script shell injection</a></td>
<td>✅ 0 issues</td>
</tr>
<tr>
<td><a href='https://socket.dev/npm/issue/unresolvedRequire'>Unresolved require</a></td>
<td>✅ 0 issues</td>
</tr>
<tr>
<td><a href='https://socket.dev/npm/issue/invalidPackageJSON'>Invalid package.json</a></td>
<td>✅ 0 issues</td>
</tr>
<tr>
<td><a href='https://socket.dev/npm/issue/httpDependency'>HTTP dependency</a></td>
<td>✅ 0 issues</td>
</tr>
<tr>
<td><a href='https://socket.dev/npm/issue/gitDependency'>Git dependency</a></td>
<td>✅ 0 issues</td>
</tr>
<tr>
<td><a href='https://socket.dev/npm/issue/didYouMean'>Potential typo squat</a></td>
<td>✅ 0 issues</td>
</tr>
<tr>
<td><a href='https://socket.dev/npm/issue/malware'>Known Malware</a></td>
<td>✅ 0 issues</td>
</tr>
<tr>
<td><a href='https://socket.dev/npm/issue/telemetry'>Telemetry</a></td>
<td>✅ 0 issues</td>
</tr>
<tr>
<td><a href='https://socket.dev/npm/issue/troll'>Protestware/Troll package</a></td>
<td>✅ 0 issues</td>
</tr>
</tbody>
</table>
</details>



***


**📊 Modified Dependency Overview:**



| ⬆️ Updated Package | Version Diff | Added Capability Access | `+/-` Transitive Count | Publisher |
| --- | --- | --- | --- | --- |
| [jest-diff@29.5.0](https://socket.dev/npm/package/jest-diff/overview/29.5.0) | [29.3.1...29.5.0](https://socket.dev/npm/package/jest-diff/diff/29.5.0?from=29.3.1) | None | `+5/-5` | [simenb](https://socket.dev/npm/user/simenb) |

Patch:
diff --git a/package-lock.json b/package-lock.json
index f926a18..51c0f77 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1381,15 +1381,15 @@
       "dev": true
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "5.57.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.1.tgz",
-      "integrity": "sha512-1MeobQkQ9tztuleT3v72XmY0XuKXVXusAhryoLuU5YZ+mXoYKZP9SQ7Flulh1NX4DTjpGTc2b/eMu4u7M7dhnQ==",
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz",
+      "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==",
       "dev": true,
       "dependencies": {
         "@eslint-community/regexpp": "^4.4.0",
-        "@typescript-eslint/scope-manager": "5.57.1",
-        "@typescript-eslint/type-utils": "5.57.1",
-        "@typescript-eslint/utils": "5.57.1",
+        "@typescript-eslint/scope-manager": "5.59.1",
+        "@typescript-eslint/type-utils": "5.59.1",
+        "@typescript-eslint/utils": "5.59.1",
         "debug": "^4.3.4",
         "grapheme-splitter": "^1.0.4",
         "ignore": "^5.2.0",
@@ -1414,15 +1414,62 @@
         }
       }
     },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz",
+      "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.1",
+        "@typescript-eslint/visitor-keys": "5.59.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz",
+      "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz",
+      "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.1",
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
     "node_modules/@typescript-eslint/parser": {
-      "version": "5.57.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.1.tgz",
-      "integrity": "sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA==",
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz",
+      "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "5.57.1",
-        "@typescript-eslint/types": "5.57.1",
-        "@typescript-eslint/typescript-estree": "5.57.1",
+        "@typescript-eslint/scope-manager": "5.59.1",
+        "@typescript-eslint/types": "5.59.1",
+        "@typescript-eslint/typescript-estree": "5.59.1",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -1441,6 +1488,80 @@
         }
       }
     },
+    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz",
+      "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.1",
+        "@typescript-eslint/visitor-keys": "5.59.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz",
+      "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz",
+      "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.1",
+        "@typescript-eslint/visitor-keys": "5.59.1",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz",
+      "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.1",
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
     "node_modules/@typescript-eslint/scope-manager": {
       "version": "5.57.1",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz",
@@ -1459,13 +1580,13 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "5.57.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz",
-      "integrity": "sha512-/RIPQyx60Pt6ga86hKXesXkJ2WOS4UemFrmmq/7eOyiYjYv/MUSHPlkhU6k9T9W1ytnTJueqASW+wOmW4KrViw==",
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz",
+      "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "5.57.1",
-        "@typescript-eslint/utils": "5.57.1",
+        "@typescript-eslint/typescript-estree": "5.59.1",
+        "@typescript-eslint/utils": "5.59.1",
         "debug": "^4.3.4",
         "tsutils": "^3.21.0"
       },
@@ -1485,6 +1606,63 @@
         }
       }
     },
+    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz",
+      "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz",
+      "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.1",
+        "@typescript-eslint/visitor-keys": "5.59.1",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz",
+      "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.1",
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
     "node_modules/@typescript-eslint/types": {
       "version": "5.57.1",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz",
@@ -1526,17 +1704,17 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "5.57.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.1.tgz",
-      "integrity": "sha512-kN6vzzf9NkEtawECqze6v99LtmDiUJCVpvieTFA1uL7/jDghiJGubGZ5csicYHU1Xoqb3oH/R5cN5df6W41Nfg==",
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz",
+      "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@types/json-schema": "^7.0.9",
         "@types/semver": "^7.3.12",
-        "@typescript-eslint/scope-manager": "5.57.1",
-        "@typescript-eslint/types": "5.57.1",
-        "@typescript-eslint/typescript-estree": "5.57.1",
+        "@typescript-eslint/scope-manager": "5.59.1",
+        "@typescript-eslint/types": "5.59.1",
+        "@typescript-eslint/typescript-estree": "5.59.1",
         "eslint-scope": "^5.1.1",
         "semver": "^7.3.7"
       },
@@ -1551,6 +1729,80 @@
         "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
       }
     },
+    "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz",
+      "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.1",
+        "@typescript-eslint/visitor-keys": "5.59.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz",
+      "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz",
+      "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.1",
+        "@typescript-eslint/visitor-keys": "5.59.1",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": {
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz",
+      "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.59.1",
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
     "node_modules/@typescript-eslint/visitor-keys": {
       "version": "5.57.1",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz",
@@ -2202,9 +2454,9 @@
       }
     },
     "node_modules/diff-sequences": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz",
-      "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
+      "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
       "dev": true,
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -3555,36 +3807,36 @@
       }
     },
     "node_modules/jest-diff": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz",
-      "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
+      "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
-        "diff-sequences": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "pretty-format": "^29.3.1"
+        "diff-sequences": "^29.4.3",
+        "jest-get-type": "^29.4.3",
+        "pretty-format": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-diff/node_modules/@jest/schemas": {
-      "version": "29.0.0",
-      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz",
-      "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
+      "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==",
       "dev": true,
       "dependencies": {
-        "@sinclair/typebox": "^0.24.1"
+        "@sinclair/typebox": "^0.25.16"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-diff/node_modules/@sinclair/typebox": {
-      "version": "0.24.51",
-      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
-      "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
+      "version": "0.25.24",
+      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
+      "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==",
       "dev": true
     },
     "node_modules/jest-diff/node_modules/ansi-styles": {
@@ -3600,21 +3852,21 @@
       }
     },
     "node_modules/jest-diff/node_modules/jest-get-type": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz",
-      "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
+      "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
       "dev": true,
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-diff/node_modules/pretty-format": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz",
-      "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz",
+      "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==",
       "dev": true,
       "dependencies": {
-        "@jest/schemas": "^29.0.0",
+        "@jest/schemas": "^29.4.3",
         "ansi-styles": "^5.0.0",
         "react-is": "^18.0.0"
       },
@@ -4996,9 +5248,9 @@
       }
     },
     "node_modules/prettier": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz",
-      "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==",
+      "version": "2.8.8",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
       "dev": true,
       "bin": {
         "prettier": "bin-prettier.js"
@@ -5636,9 +5888,9 @@
       "dev": true
     },
     "node_modules/tree-sitter-cli": {
-      "version": "0.20.7",
-      "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.20.7.tgz",
-      "integrity": "sha512-MHABT8oCPr4D0fatsPo6ATQ9H4h9vHpPRjlxkxJs80tpfAEKGn6A1zU3eqfCKBcgmfZDe9CiL3rKOGMzYHwA3w==",
+      "version": "0.20.8",
+      "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.20.8.tgz",
+      "integrity": "sha512-XjTcS3wdTy/2cc/ptMLc/WRyOLECRYcMTrSWyhZnj1oGSOWbHLTklgsgRICU3cPfb0vy+oZCC33M43u6R1HSCA==",
       "dev": true,
       "hasInstallScript": true,
       "bin": {
@@ -5983,31 +6235,31 @@
       }
     },
     "node_modules/vscode-jsonrpc": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz",
-      "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==",
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz",
+      "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==",
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/vscode-languageserver": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz",
-      "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==",
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz",
+      "integrity": "sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==",
       "dependencies": {
-        "vscode-languageserver-protocol": "3.17.2"
+        "vscode-languageserver-protocol": "3.17.3"
       },
       "bin": {
         "installServerIntoExtension": "bin/installServerIntoExtension"
       }
     },
     "node_modules/vscode-languageserver-protocol": {
-      "version": "3.17.2",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz",
-      "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==",
+      "version": "3.17.3",
+      "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz",
+      "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==",
       "dependencies": {
-        "vscode-jsonrpc": "8.0.2",
-        "vscode-languageserver-types": "3.17.2"
+        "vscode-jsonrpc": "8.1.0",
+        "vscode-languageserver-types": "3.17.3"
       }
     },
     "node_modules/vscode-languageserver-textdocument": {
@@ -6016,9 +6268,9 @@
       "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q=="
     },
     "node_modules/vscode-languageserver-types": {
-      "version": "3.17.2",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz",
-      "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA=="
+      "version": "3.17.3",
+      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz",
+      "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA=="
     },
     "node_modules/vscode-uri": {
       "version": "3.0.7",
@@ -7259,33 +7511,104 @@
       "dev": true
     },
     "@typescript-eslint/eslint-plugin": {
-      "version": "5.57.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.1.tgz",
-      "integrity": "sha512-1MeobQkQ9tztuleT3v72XmY0XuKXVXusAhryoLuU5YZ+mXoYKZP9SQ7Flulh1NX4DTjpGTc2b/eMu4u7M7dhnQ==",
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz",
+      "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==",
       "dev": true,
       "requires": {
         "@eslint-community/regexpp": "^4.4.0",
-        "@typescript-eslint/scope-manager": "5.57.1",
-        "@typescript-eslint/type-utils": "5.57.1",
-        "@typescript-eslint/utils": "5.57.1",
+        "@typescript-eslint/scope-manager": "5.59.1",
+        "@typescript-eslint/type-utils": "5.59.1",
+        "@typescript-eslint/utils": "5.59.1",
         "debug": "^4.3.4",
         "grapheme-splitter": "^1.0.4",
         "ignore": "^5.2.0",
         "natural-compare-lite": "^1.4.0",
         "semver": "^7.3.7",
         "tsutils": "^3.21.0"
+      },
+      "dependencies": {
+        "@typescript-eslint/scope-manager": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz",
+          "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.59.1",
+            "@typescript-eslint/visitor-keys": "5.59.1"
+          }
+        },
+        "@typescript-eslint/types": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz",
+          "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==",
+          "dev": true
+        },
+        "@typescript-eslint/visitor-keys": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz",
+          "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.59.1",
+            "eslint-visitor-keys": "^3.3.0"
+          }
+        }
       }
     },
     "@typescript-eslint/parser": {
-      "version": "5.57.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.1.tgz",
-      "integrity": "sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA==",
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz",
+      "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/scope-manager": "5.57.1",
-        "@typescript-eslint/types": "5.57.1",
-        "@typescript-eslint/typescript-estree": "5.57.1",
+        "@typescript-eslint/scope-manager": "5.59.1",
+        "@typescript-eslint/types": "5.59.1",
+        "@typescript-eslint/typescript-estree": "5.59.1",
         "debug": "^4.3.4"
+      },
+      "dependencies": {
+        "@typescript-eslint/scope-manager": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz",
+          "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.59.1",
+            "@typescript-eslint/visitor-keys": "5.59.1"
+          }
+        },
+        "@typescript-eslint/types": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz",
+          "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==",
+          "dev": true
+        },
+        "@typescript-eslint/typescript-estree": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz",
+          "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.59.1",
+            "@typescript-eslint/visitor-keys": "5.59.1",
+            "debug": "^4.3.4",
+            "globby": "^11.1.0",
+            "is-glob": "^4.0.3",
+            "semver": "^7.3.7",
+            "tsutils": "^3.21.0"
+          }
+        },
+        "@typescript-eslint/visitor-keys": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz",
+          "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.59.1",
+            "eslint-visitor-keys": "^3.3.0"
+          }
+        }
       }
     },
     "@typescript-eslint/scope-manager": {
@@ -7299,15 +7622,48 @@
       }
     },
     "@typescript-eslint/type-utils": {
-      "version": "5.57.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz",
-      "integrity": "sha512-/RIPQyx60Pt6ga86hKXesXkJ2WOS4UemFrmmq/7eOyiYjYv/MUSHPlkhU6k9T9W1ytnTJueqASW+wOmW4KrViw==",
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz",
+      "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/typescript-estree": "5.57.1",
-        "@typescript-eslint/utils": "5.57.1",
+        "@typescript-eslint/typescript-estree": "5.59.1",
+        "@typescript-eslint/utils": "5.59.1",
         "debug": "^4.3.4",
         "tsutils": "^3.21.0"
+      },
+      "dependencies": {
+        "@typescript-eslint/types": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz",
+          "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==",
+          "dev": true
+        },
+        "@typescript-eslint/typescript-estree": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz",
+          "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.59.1",
+            "@typescript-eslint/visitor-keys": "5.59.1",
+            "debug": "^4.3.4",
+            "globby": "^11.1.0",
+            "is-glob": "^4.0.3",
+            "semver": "^7.3.7",
+            "tsutils": "^3.21.0"
+          }
+        },
+        "@typescript-eslint/visitor-keys": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz",
+          "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.59.1",
+            "eslint-visitor-keys": "^3.3.0"
+          }
+        }
       }
     },
     "@typescript-eslint/types": {
@@ -7332,19 +7688,62 @@
       }
     },
     "@typescript-eslint/utils": {
-      "version": "5.57.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.1.tgz",
-      "integrity": "sha512-kN6vzzf9NkEtawECqze6v99LtmDiUJCVpvieTFA1uL7/jDghiJGubGZ5csicYHU1Xoqb3oH/R5cN5df6W41Nfg==",
+      "version": "5.59.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz",
+      "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==",
       "dev": true,
       "requires": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@types/json-schema": "^7.0.9",
         "@types/semver": "^7.3.12",
-        "@typescript-eslint/scope-manager": "5.57.1",
-        "@typescript-eslint/types": "5.57.1",
-        "@typescript-eslint/typescript-estree": "5.57.1",
+        "@typescript-eslint/scope-manager": "5.59.1",
+        "@typescript-eslint/types": "5.59.1",
+        "@typescript-eslint/typescript-estree": "5.59.1",
         "eslint-scope": "^5.1.1",
         "semver": "^7.3.7"
+      },
+      "dependencies": {
+        "@typescript-eslint/scope-manager": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz",
+          "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.59.1",
+            "@typescript-eslint/visitor-keys": "5.59.1"
+          }
+        },
+        "@typescript-eslint/types": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz",
+          "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==",
+          "dev": true
+        },
+        "@typescript-eslint/typescript-estree": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz",
+          "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.59.1",
+            "@typescript-eslint/visitor-keys": "5.59.1",
+            "debug": "^4.3.4",
+            "globby": "^11.1.0",
+            "is-glob": "^4.0.3",
+            "semver": "^7.3.7",
+            "tsutils": "^3.21.0"
+          }
+        },
+        "@typescript-eslint/visitor-keys": {
+          "version": "5.59.1",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz",
+          "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==",
+          "dev": true,
+          "requires": {
+            "@typescript-eslint/types": "5.59.1",
+            "eslint-visitor-keys": "^3.3.0"
+          }
+        }
       }
     },
     "@typescript-eslint/visitor-keys": {
@@ -7820,9 +8219,9 @@
       "dev": true
     },
     "diff-sequences": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz",
-      "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
+      "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
       "dev": true
     },
     "dir-glob": {
@@ -8782,30 +9181,30 @@
       }
     },
     "jest-diff": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz",
-      "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
+      "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==",
       "dev": true,
       "requires": {
         "chalk": "^4.0.0",
-        "diff-sequences": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "pretty-format": "^29.3.1"
+        "diff-sequences": "^29.4.3",
+        "jest-get-type": "^29.4.3",
+        "pretty-format": "^29.5.0"
       },
       "dependencies": {
         "@jest/schemas": {
-          "version": "29.0.0",
-          "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz",
-          "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==",
+          "version": "29.4.3",
+          "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
+          "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==",
           "dev": true,
           "requires": {
-            "@sinclair/typebox": "^0.24.1"
+            "@sinclair/typebox": "^0.25.16"
           }
         },
         "@sinclair/typebox": {
-          "version": "0.24.51",
-          "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
-          "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
+          "version": "0.25.24",
+          "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
+          "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==",
           "dev": true
         },
         "ansi-styles": {
@@ -8815,18 +9214,18 @@
           "dev": true
         },
         "jest-get-type": {
-          "version": "29.2.0",
-          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz",
-          "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==",
+          "version": "29.4.3",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
+          "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
           "dev": true
         },
         "pretty-format": {
-          "version": "29.3.1",
-          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz",
-          "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==",
+          "version": "29.5.0",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz",
+          "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==",
           "dev": true,
           "requires": {
-            "@jest/schemas": "^29.0.0",
+            "@jest/schemas": "^29.4.3",
             "ansi-styles": "^5.0.0",
             "react-is": "^18.0.0"
           }
@@ -9882,9 +10281,9 @@
       "dev": true
     },
     "prettier": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz",
-      "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==",
+      "version": "2.8.8",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
       "dev": true
     },
     "prettier-linter-helpers": {
@@ -10350,9 +10749,9 @@
       "dev": true
     },
     "tree-sitter-cli": {
-      "version": "0.20.7",
-      "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.20.7.tgz",
-      "integrity": "sha512-MHABT8oCPr4D0fatsPo6ATQ9H4h9vHpPRjlxkxJs80tpfAEKGn6A1zU3eqfCKBcgmfZDe9CiL3rKOGMzYHwA3w==",
+      "version": "0.20.8",
+      "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.20.8.tgz",
+      "integrity": "sha512-XjTcS3wdTy/2cc/ptMLc/WRyOLECRYcMTrSWyhZnj1oGSOWbHLTklgsgRICU3cPfb0vy+oZCC33M43u6R1HSCA==",
       "dev": true
     },
     "trough": {
@@ -10579,25 +10978,25 @@
       }
     },
     "vscode-jsonrpc": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz",
-      "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ=="
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz",
+      "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw=="
     },
     "vscode-languageserver": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz",
-      "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==",
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz",
+      "integrity": "sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==",
       "requires": {
-        "vscode-languageserver-protocol": "3.17.2"
+        "vscode-languageserver-protocol": "3.17.3"
       }
     },
     "vscode-languageserver-protocol": {
-      "version": "3.17.2",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz",
-      "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==",
+      "version": "3.17.3",
+      "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz",
+      "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==",
       "requires": {
-        "vscode-jsonrpc": "8.0.2",
-        "vscode-languageserver-types": "3.17.2"
+        "vscode-jsonrpc": "8.1.0",
+        "vscode-languageserver-types": "3.17.3"
       }
     },
     "vscode-languageserver-textdocument": {
@@ -10606,9 +11005,9 @@
       "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q=="
     },
     "vscode-languageserver-types": {
-      "version": "3.17.2",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz",
-      "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA=="
+      "version": "3.17.3",
+      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz",
+      "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA=="
     },
     "vscode-uri": {
       "version": "3.0.7",
diff --git a/src/compiler/imports.ts b/src/compiler/imports.ts
index 83262a6..0a72b08 100644
--- a/src/compiler/imports.ts
+++ b/src/compiler/imports.ts
@@ -67,6 +67,10 @@ export class Imports {
     return this.modules.get(name);
   }
 
+  public getModules(): IImport[] {
+    return [...this.modules.values()];
+  }
+
   public forEach(callbackfn: (value: IImport) => void): void {
     this.vars.forEach(callbackfn);
     this.types.forEach(callbackfn);
diff --git a/src/compiler/patternMatches.ts b/src/compiler/patternMatches.ts
index 2afa54c..35b3ef7 100644
--- a/src/compiler/patternMatches.ts
+++ b/src/compiler/patternMatches.ts
@@ -52,7 +52,9 @@ type CanCtor = {
 function nodeToCanCtor(node: SyntaxNode): CanCtor {
   return {
     name: node.firstNamedChild!.text,
-    arity: node.namedChildren.slice(1).length,
+    arity: node.namedChildren
+      .slice(1)
+      .filter((n) => !n.type.includes("comment")).length,
   };
 }
 
diff --git a/src/compiler/references.ts b/src/compiler/references.ts
index 5ef5c87..dab1a34 100644
--- a/src/compiler/references.ts
+++ b/src/compiler/references.ts
@@ -17,15 +17,21 @@ export class References {
     const checker = program.getTypeChecker();
 
     if (definitionNode) {
-      const refSourceTree = forest.getByUri(definitionNode.node.tree.uri);
+      const definitionSourceFile = forest.getByUri(
+        definitionNode.node.tree.uri,
+      );
 
-      if (refSourceTree) {
+      if (definitionSourceFile) {
         const imports: { [uri: string]: Imports } = {};
         forest.treeMap.forEach((sourceFile) => {
-          imports[sourceFile.uri] = checker.getAllImports(sourceFile);
+          if (sourceFile.writeable) {
+            imports[sourceFile.uri] = checker.getAllImports(sourceFile);
+          }
         });
 
-        const moduleNameNode = TreeUtils.getModuleNameNode(refSourceTree.tree);
+        const moduleNameNode = TreeUtils.getModuleNameNode(
+          definitionSourceFile.tree,
+        );
         switch (definitionNode.type) {
           case "Function":
             {
@@ -34,7 +40,7 @@ export class References {
                   definitionNode.node.parent,
                 )?.childForFieldName("name");
 
-                if (annotationNameNode && refSourceTree.writeable) {
+                if (annotationNameNode && definitionSourceFile.writeable) {
                   references.push({
                     node: annotationNameNode,
                     uri: definitionNode.node.tree.uri,
@@ -51,7 +57,7 @@ export class References {
                   : undefined);
               if (functionNameNode) {
                 const functionName = functionNameNode.text;
-                if (refSourceTree.writeable) {
+                if (definitionSourceFile.writeable) {
                   references.push({
                     node: functionNameNode,
                     uri: definitionNode.node.tree.uri,
@@ -65,11 +71,11 @@ export class References {
                 const localFunctions = letParent
                   ? this.findFunctionCalls(letParent, functionName)
                   : this.findFunctionCalls(
-                      refSourceTree.tree.rootNode,
+                      definitionSourceFile.tree.rootNode,
                       functionName,
                     );
 
-                if (localFunctions && refSourceTree.writeable) {
+                if (localFunctions && definitionSourceFile.writeable) {
                   references.push(
                     ...localFunctions.map((node) => {
                       return { node, uri: definitionNode.node.tree.uri };
@@ -78,12 +84,12 @@ export class References {
                 }
 
                 const isExposedFunction = TreeUtils.isExposedFunctionOrPort(
-                  refSourceTree.tree,
+                  definitionSourceFile.tree,
                   functionName,
                 );
                 if (isExposedFunction && !letParent) {
                   const moduleDeclarationNode = TreeUtils.findModuleDeclaration(
-                    refSourceTree.tree,
+                    definitionSourceFile.tree,
                   );
                   if (moduleDeclarationNode) {
                     const exposedNode = TreeUtils.findExposedFunctionNode(
@@ -91,7 +97,7 @@ export class References {
                       functionName,
                     );
 
-                    if (exposedNode && refSourceTree.writeable) {
+                    if (exposedNode && definitionSourceFile.writeable) {
                       references.push({
                         node: exposedNode,
                         uri: definitionNode.node.tree.uri,
@@ -181,7 +187,7 @@ export class References {
                 );
               if (portNameNode) {
                 const portName = portNameNode.text;
-                if (refSourceTree.writeable) {
+                if (definitionSourceFile.writeable) {
                   references.push({
                     node: portNameNode,
                     uri: definitionNode.node.tree.uri,
@@ -189,11 +195,11 @@ export class References {
                 }
 
                 const localCallsToPort = this.findFunctionCalls(
-                  refSourceTree.tree.rootNode,
+                  definitionSourceFile.tree.rootNode,
                   portName,
                 );
 
-                if (localCallsToPort && refSourceTree.writeable) {
+                if (localCallsToPort && definitionSourceFile.writeable) {
                   references.push(
                     ...localCallsToPort.map((node) => {
                       return { node, uri: definitionNode.node.tree.uri };
@@ -202,12 +208,12 @@ export class References {
                 }
 
                 const isExposedPort = TreeUtils.isExposedFunctionOrPort(
-                  refSourceTree.tree,
+                  definitionSourceFile.tree,
                   portName,
                 );
                 if (isExposedPort) {
                   const moduleDeclarationNode = TreeUtils.findModuleDeclaration(
-                    refSourceTree.tree,
+                    definitionSourceFile.tree,
                   );
                   if (moduleDeclarationNode) {
                     const exposedNode = TreeUtils.findExposedFunctionNode(
@@ -215,7 +221,7 @@ export class References {
                       portName,
                     );
 
-                    if (exposedNode && refSourceTree.writeable) {
+                    if (exposedNode && definitionSourceFile.writeable) {
                       references.push({
                         node: exposedNode,
                         uri: definitionNode.node.tree.uri,
@@ -307,7 +313,7 @@ export class References {
 
               if (typeOrTypeAliasNameNode) {
                 const typeOrTypeAliasName = typeOrTypeAliasNameNode.text;
-                if (refSourceTree.writeable) {
+                if (definitionSourceFile.writeable) {
                   references.push({
                     node: typeOrTypeAliasNameNode,
                     uri: definitionNode.node.tree.uri,
@@ -315,10 +321,10 @@ export class References {
                 }
 
                 const localFunctions = TreeUtils.findTypeOrTypeAliasCalls(
-                  refSourceTree.tree,
+                  definitionSourceFile.tree,
                   typeOrTypeAliasName,
                 );
-                if (localFunctions && refSourceTree.writeable) {
+                if (localFunctions && definitionSourceFile.writeable) {
                   references.push(
                     ...localFunctions.map((node) => {
                       return { node, uri: definitionNode.node.tree.uri };
@@ -327,12 +333,12 @@ export class References {
                 }
 
                 const isExposed = TreeUtils.isExposedTypeOrTypeAlias(
-                  refSourceTree.tree,
+                  definitionSourceFile.tree,
                   typeOrTypeAliasName,
                 );
                 if (isExposed) {
                   const moduleDeclarationNode = TreeUtils.findModuleDeclaration(
-                    refSourceTree.tree,
+                    definitionSourceFile.tree,
                   );
                   if (moduleDeclarationNode) {
                     const exposedNode =
@@ -341,7 +347,7 @@ export class References {
                         typeOrTypeAliasName,
                       );
 
-                    if (exposedNode && refSourceTree.writeable) {
+                    if (exposedNode && definitionSourceFile.writeable) {
                       references.push({
                         node: exposedNode,
                         uri: definitionNode.node.tree.uri,
@@ -424,7 +430,7 @@ export class References {
 
           case "Module":
             if (moduleNameNode) {
-              if (refSourceTree.writeable) {
+              if (definitionSourceFile.writeable) {
                 references.push({
                   node: moduleNameNode,
                   uri: definitionNode.node.tree.uri,
@@ -470,7 +476,7 @@ export class References {
             break;
 
           case "FunctionParameter":
-            if (refSourceTree.writeable) {
+            if (definitionSourceFile.writeable) {
               references.push({
                 node: definitionNode.node,
                 uri: definitionNode.node.tree.uri,
@@ -505,7 +511,7 @@ export class References {
             break;
 
           case "CasePattern":
-            if (refSourceTree.writeable) {
+            if (definitionSourceFile.writeable) {
               references.push({
                 node: definitionNode.node,
                 uri: definitionNode.node.tree.uri,
@@ -537,7 +543,7 @@ export class References {
             break;
 
           case "AnonymousFunctionParameter":
-            if (refSourceTree.writeable) {
+            if (definitionSourceFile.writeable) {
               references.push({
                 node: definitionNode.node,
                 uri: definitionNode.node.tree.uri,
@@ -568,14 +574,14 @@ export class References {
           case "UnionConstructor":
             if (definitionNode.node.firstChild && moduleNameNode) {
               const nameNode = definitionNode.node.firstChild;
-              if (refSourceTree.writeable) {
+              if (definitionSourceFile.writeable) {
                 references.push({
                   node: nameNode,
                   uri: definitionNode.node.tree.uri,
                 });
                 const unionConstructorCalls =
                   TreeUtils.findUnionConstructorCalls(
-                    refSourceTree.tree,
+                    definitionSourceFile.tree,
                     nameNode.text,
                   );
 
@@ -650,35 +656,23 @@ export class References {
                   ...this.getFieldReferences(
                     fieldName.text,
                     definitionNode,
-                    refSourceTree,
+                    definitionSourceFile,
                     program,
                   ),
                 );
 
-                for (const uri in imports) {
-                  if (uri === definitionNode.node.tree.uri) {
-                    continue;
-                  }
-
-                  const needsToBeChecked = forest
-                    .getByUri(uri)
-                    ?.resolvedModules?.get(moduleNameNode?.text ?? "");
-
-                  if (needsToBeChecked) {
-                    const treeToCheck = forest.getByUri(uri);
-
-                    if (treeToCheck && treeToCheck.writeable) {
-                      references.push(
-                        ...this.getFieldReferences(
-                          fieldName.text,
-                          definitionNode,
-                          treeToCheck,
-                          program,
-                        ),
-                      );
-                    }
-                  }
-                }
+                checker
+                  .getImportingModules(definitionSourceFile)
+                  .forEach((sourceFileToCheck) =>
+                    references.push(
+                      ...this.getFieldReferences(
+                        fieldName.text,
+                        definitionNode,
+                        sourceFileToCheck,
+                        program,
+                      ),
+                    ),
+                  );
               }
             }
             break;
diff --git a/src/compiler/typeChecker.ts b/src/compiler/typeChecker.ts
index bf35278..127a862 100644
--- a/src/compiler/typeChecker.ts
+++ b/src/compiler/typeChecker.ts
@@ -72,6 +72,10 @@ export interface TypeChecker {
     sourceFile: ISourceFile,
   ) => DefinitionResult;
   getAllImports: (sourceFile: ISourceFile) => Imports;
+  getImportingModules: (
+    sourceFile: ISourceFile,
+    directImportOnly?: boolean,
+  ) => ISourceFile[];
   getQualifierForName: (
     sourceFile: ISourceFile,
     module: string,
@@ -101,6 +105,7 @@ export interface TypeChecker {
 export function createTypeChecker(program: IProgram): TypeChecker {
   const forest = program.getForest();
   const imports = new Map<string, Imports>();
+  let importModuleGraph: Map<string, ISourceFile[]>;
 
   const diagnostics = new DiagnosticsCollection();
   const suggestionDiagnostics = new DiagnosticsCollection();
@@ -119,6 +124,7 @@ export function createTypeChecker(program: IProgram): TypeChecker {
     findDefinition,
     findDefinitionShallow,
     getAllImports,
+    getImportingModules,
     getQualifierForName,
     typeToString,
     getDiagnostics,
@@ -338,6 +344,49 @@ export function createTypeChecker(program: IProgram): TypeChecker {
     return allImports;
   }
 
+  function getImportingModules(
+    sourceFile: ISourceFile,
+    directImportOnly?: boolean,
+  ): ISourceFile[] {
+    if (!importModuleGraph) {
+      importModuleGraph = new Map<string, ISourceFile[]>();
+
+      forest.treeMap.forEach((sourceFile) => {
+        if (sourceFile.writeable) {
+          getAllImports(sourceFile)
+            .getModules()
+            .forEach((module) => {
+              const existingGraph = importModuleGraph.get(
+                module.fromModule.uri,
+              );
+
+              if (existingGraph) {
+                existingGraph.push(sourceFile);
+              } else {
+                importModuleGraph.set(module.fromModule.uri, [sourceFile]);
+              }
+            });
+        }
+      });
+    }
+
+    if (directImportOnly) {
+      return importModuleGraph.get(sourceFile.uri) ?? [];
+    }
+
+    const getAllDescendantImports = (source: ISourceFile): ISourceFile[] => {
+      const imports = importModuleGraph.get(source.uri) ?? [];
+
+      imports.slice(0).forEach((directImport) => {
+        imports.push(...getAllDescendantImports(directImport));
+      });
+
+      return imports;
+    };
+
+    return getAllDescendantImports(sourceFile);
+  }
+
   function findImport(
     sourceFile: ISourceFile,
     name: string,
diff --git a/src/compiler/utils/expressionTree.ts b/src/compiler/utils/expressionTree.ts
index 7da959c..edde757 100644
--- a/src/compiler/utils/expressionTree.ts
+++ b/src/compiler/utils/expressionTree.ts
@@ -433,6 +433,7 @@ export function mapSyntaxNodeToExpression(
         unionVariant.name = node.childForFieldName("name")?.text ?? "";
         unionVariant.params = node.children
           .slice(1)
+          .filter((n) => !n.type.includes("comment"))
           .map(mapSyntaxNodeToExpression)
           .filter(Utils.notUndefined);
         return unionVariant;
diff --git a/src/providers/codeAction/importCodeAction.ts b/src/providers/codeAction/importCodeAction.ts
index 446baae..138db50 100644
--- a/src/providers/codeAction/importCodeAction.ts
+++ b/src/providers/codeAction/importCodeAction.ts
@@ -34,12 +34,14 @@ CodeActionProvider.registerCodeAction({
 
       const valueToImport = getValueToImport(valueNode, possibleImport);
 
+      const importAlias = edit?.importAlias ? ` as "${edit.importAlias}"` : "";
+
       return CodeActionProvider.getCodeAction(
         params,
         valueToImport
-          ? `Import '${valueToImport}' from module "${possibleImport.module}"`
-          : `Import module "${possibleImport.module}"`,
-        edit ? [edit] : [],
+          ? `Import '${valueToImport}' from module "${possibleImport.module}"${importAlias}`
+          : `Import module "${possibleImport.module}"${importAlias}`,
+        edit ? [edit.edit] : [],
       );
     });
   },
@@ -63,7 +65,7 @@ CodeActionProvider.registerCodeAction({
             params.sourceFile,
             diagnostic.range,
             firstPossibleImport,
-          );
+          )?.edit;
 
           if (edit && !edits.find((e) => e.newText === edit.newText)) {
             edits.push(edit);
@@ -93,19 +95,30 @@ function getPossibleImports(
 
   // Add import quick fixes
   if (valueNode) {
-    return possibleImports.filter(
-      (exposed) =>
-        exposed.value === valueNode.text ||
-        ((valueNode.type === "upper_case_qid" ||
-          valueNode.type === "value_qid") &&
-          exposed.value ===
-            valueNode.namedChildren[valueNode.namedChildren.length - 1].text &&
-          exposed.module ===
-            valueNode.namedChildren
-              .slice(0, valueNode.namedChildren.length - 2) // Dots are also namedNodes
-              .map((a) => a.text)
-              .join("")),
-    );
+    return possibleImports.filter((exposed) => {
+      if (exposed.value === valueNode.text) {
+        return true;
+      }
+
+      if (
+        valueNode.type === "upper_case_qid" ||
+        valueNode.type === "value_qid"
+      ) {
+        const targetValue =
+          valueNode.namedChildren[valueNode.namedChildren.length - 1].text;
+
+        const targetModule = getTargetModule(valueNode);
+
+        return (
+          exposed.value === targetValue &&
+          (targetModule.includes(".")
+            ? exposed.module === targetModule
+            : exposed.module.endsWith(targetModule))
+        );
+      }
+
+      return false;
+    });
   }
 
   return [];
@@ -115,14 +128,24 @@ function getEditFromPossibleImport(
   sourceFile: ISourceFile,
   range: Range,
   possibleImport: IPossibleImport,
-): TextEdit | undefined {
+): { edit: TextEdit; importAlias: string | undefined } | undefined {
   const valueNode = TreeUtils.getNamedDescendantForRange(sourceFile, range);
 
-  return RefactorEditUtils.addImport(
+  const targetModule = getTargetModule(valueNode);
+  const edit = RefactorEditUtils.addImport(
     sourceFile.tree,
     possibleImport.module,
     getValueToImport(valueNode, possibleImport),
+    targetModule,
   );
+
+  if (edit) {
+    return {
+      edit,
+      importAlias:
+        possibleImport.module !== targetModule ? targetModule : undefined,
+    };
+  }
 }
 
 function getValueToImport(
@@ -133,3 +156,10 @@ function getValueToImport(
     ? possibleImport.valueToImport ?? possibleImport.value
     : undefined;
 }
+
+function getTargetModule(valueNode: SyntaxNode): string {
+  return valueNode.namedChildren
+    .slice(0, valueNode.namedChildren.length - 2) // Dots are also namedNodes
+    .map((a) => a.text)
+    .join("");
+}
diff --git a/src/providers/completionProvider.ts b/src/providers/completionProvider.ts
index 0d795c5..2053752 100644
--- a/src/providers/completionProvider.ts
+++ b/src/providers/completionProvider.ts
@@ -1081,7 +1081,7 @@ export class CompletionProvider {
               ...allImportedValues.getVar(possibleImport.value),
               ...allImportedValues.getType(possibleImport.value),
               ...allImportedValues.getConstructor(possibleImport.value),
-            ].filter((imp) => imp.fromModule.name === possibleImport.module)[0],
+            ].some((imp) => imp.fromModule.name === possibleImport.module),
         )
         .sort((a, b) => {
           const aValue = a.value.toLowerCase();
@@ -1164,7 +1164,10 @@ export class CompletionProvider {
         additionalTextEdits: importTextEdit ? [importTextEdit] : undefined,
         labelDescription: possibleImport.module,
       };
-      if (possibleImport.type === "Function") {
+      if (
+        possibleImport.type === "Function" ||
+        possibleImport.type === "Port"
+      ) {
         result.push(this.createFunctionCompletion(completionOptions));
       } else if (possibleImport.type === "TypeAlias") {
         result.push(this.createTypeAliasCompletion(completionOptions));
@@ -1209,9 +1212,7 @@ export class CompletionProvider {
       return result;
     }
 
-    let alreadyImported = false;
-
-    const matchedSourceFiles: ISourceFile[] = [];
+    const matchedSourceFiles: [ISourceFile, boolean][] = [];
 
     const imports =
       sourceFile.symbolLinks
@@ -1226,32 +1227,57 @@ export class CompletionProvider {
             const moduleName =
               imp.node.childForFieldName("moduleName")?.text ?? "";
 
-            return program.getSourceFileOfImportableModule(
+            const importSourceFile = program.getSourceFileOfImportableModule(
               sourceFile,
               moduleName,
             );
+
+            if (importSourceFile) {
+              return [importSourceFile, true] as [ISourceFile, boolean];
+            }
+
+            return undefined;
           })
           .filter(Utils.notUndefined),
       );
-
-      alreadyImported = true;
     } else if (!checker.getAllImports(sourceFile).getModule(targetModule)) {
       // Try to find a module that may not be imported
-      const moduleSourceFile = program.getSourceFileOfImportableModule(
-        sourceFile,
-        targetModule,
-      );
+      // If it incudes a dot then we don't look for an alias, only an exact module
+      if (targetModule.includes(".")) {
+        const moduleSourceFile = program.getSourceFileOfImportableModule(
+          sourceFile,
+          targetModule,
+        );
+
+        if (moduleSourceFile) {
+          matchedSourceFiles.push([moduleSourceFile, false]);
+        }
+      } else {
+        program
+          .getImportableModules(sourceFile)
+          .filter(
+            ({ moduleName }) =>
+              moduleName === targetModule ||
+              moduleName.endsWith(`.${targetModule}`),
+          )
+          .forEach((module) => {
+            const moduleSourceFile = program.getSourceFile(module.uri);
 
-      if (moduleSourceFile) {
-        matchedSourceFiles.push(moduleSourceFile);
-        alreadyImported = false;
+            if (moduleSourceFile) {
+              matchedSourceFiles.push([moduleSourceFile, false]);
+            }
+          });
       }
     }
 
     // Get exposed values
     matchedSourceFiles
-      .flatMap(ImportUtils.getPossibleImportsOfTree.bind(this))
-      .forEach((value) => {
+      .flatMap(([importSourceFile, alreadyImported]) =>
+        ImportUtils.getPossibleImportsOfTree(importSourceFile).map(
+          (value) => [value, alreadyImported] as [IPossibleImport, boolean],
+        ),
+      )
+      .forEach(([value, alreadyImported]) => {
         const type = checker.findType(value.node);
         const typeString = checker.typeToString(type, sourceFile);
 
@@ -1264,11 +1290,18 @@ export class CompletionProvider {
 
         // Add the import text edit if not imported
         if (!alreadyImported) {
-          const importEdit = RefactorEditUtils.addImport(tree, targetModule);
+          const importEdit = RefactorEditUtils.addImport(
+            tree,
+            value.module,
+            undefined,
+            targetModule,
+          );
 
           if (importEdit) {
+            const aliasDetail =
+              targetModule !== value.module ? ` as '${targetModule}'` : "";
             additionalTextEdits = [importEdit];
-            detail = `Auto import module '${targetModule}'`;
+            detail = `Auto import module '${value.module}'${aliasDetail}`;
           }
         }
 
@@ -1283,6 +1316,7 @@ export class CompletionProvider {
 
         switch (value.type) {
           case "Function":
+          case "Port":
             result.push(this.createFunctionCompletion(completionOptions));
             break;
           case "Type":
diff --git a/src/util/importUtils.ts b/src/util/importUtils.ts
index 7b78d26..17180e5 100644
--- a/src/util/importUtils.ts
+++ b/src/util/importUtils.ts
@@ -65,9 +65,9 @@ export class ImportUtils {
   public static getPossibleImportsOfTree(tree: ISourceFile): IPossibleImport[] {
     const exposedValues: IPossibleImport[] = [];
 
-    tree.exposing?.forEach((exposed) => {
-      const module = tree.moduleName;
-      if (module) {
+    const module = tree.moduleName;
+    if (module) {
+      tree.exposing?.forEach((exposed) => {
         exposedValues.push({
           module,
           value: exposed.name,
@@ -92,8 +92,8 @@ export class ImportUtils {
             }
           }
         });
-      }
-    });
+      });
+    }
 
     return exposedValues;
   }
diff --git a/src/util/refactorEditUtils.ts b/src/util/refactorEditUtils.ts
index a620a6f..b3f50e5 100644
--- a/src/util/refactorEditUtils.ts
+++ b/src/util/refactorEditUtils.ts
@@ -206,12 +206,16 @@ export class RefactorEditUtils {
     tree: Tree,
     moduleName: string,
     valueName?: string,
+    moduleAlias?: string,
   ): TextEdit | undefined {
     const lastImportNode =
       TreeUtils.getLastImportNode(tree) ??
       TreeUtils.getModuleNameCommentNode(tree) ??
       TreeUtils.getModuleNameNode(tree)?.parent;
 
+    const aliasText =
+      moduleAlias && moduleAlias !== moduleName ? ` as ${moduleAlias}` : "";
+
     return TextEdit.insert(
       Position.create(
         lastImportNode?.endPosition.row
@@ -220,8 +224,8 @@ export class RefactorEditUtils {
         0,
       ),
       valueName
-        ? `import ${moduleName} exposing (${valueName})\n`
-        : `import ${moduleName}\n`,
+        ? `import ${moduleName}${aliasText} exposing (${valueName})\n`
+        : `import ${moduleName}${aliasText}\n`,
     );
   }
 
diff --git a/src/util/treeUtils.ts b/src/util/treeUtils.ts
index b1e6b8e..e08e827 100644
--- a/src/util/treeUtils.ts
+++ b/src/util/treeUtils.ts
@@ -337,7 +337,7 @@ export class TreeUtils {
       node.parent.parent.parent.previousNamedSibling.lastNamedChild
     ) {
       const functionParameterNodes = TreeUtils.findAllNamedChildrenOfType(
-        ["pattern", "lower_pattern"],
+        ["pattern", "lower_pattern", "record_pattern"],
         node.parent.parent,
       );
       if (functionParameterNodes) {


Test patch:
diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index 6fa29dc..fde0103 100644
--- a/.github/workflows/test.yaml
+++ b/.github/workflows/test.yaml
@@ -33,7 +33,7 @@ jobs:
         env:
           CI: true
       - name: Coveralls GitHub Action
-        uses: coverallsapp/github-action@v2.0.0
+        uses: coverallsapp/github-action@v2.1.2
         with:
           github-token: ${{ secrets.github_token }}
       - name: run and print version
diff --git a/test/codeActionTests/importCodeAction.test.ts b/test/codeActionTests/importCodeAction.test.ts
index 0c1edbc..80e74a2 100644
--- a/test/codeActionTests/importCodeAction.test.ts
+++ b/test/codeActionTests/importCodeAction.test.ts
@@ -47,6 +47,54 @@ foo = ""
     await testCodeAction(source2, [{ title: `Import module "App"` }]);
   });
 
+  test("add import alias of qualified value", async () => {
+    const source = `
+--@ Test.elm
+module Test exposing (..)
+
+func = Foo.foo
+          --^
+
+--@ App/Foo.elm
+module App.Foo exposing (foo)
+
+foo = ""
+`;
+    await testCodeAction(source, [
+      { title: `Import module "App.Foo" as "Foo"` },
+    ]);
+
+    const source2 = `
+--@ Test.elm
+module Test exposing (..)
+
+func = Bar.foo
+      --^
+
+--@ App/Foo/Bar.elm
+module App.Foo.Bar exposing (foo)
+
+foo = ""
+`;
+    await testCodeAction(source2, [
+      { title: `Import module "App.Foo.Bar" as "Bar"` },
+    ]);
+
+    const source3 = `
+--@ Test.elm
+module Test exposing (..)
+
+func = Foo.foo
+      --^
+
+--@ App/Foo/Bar.elm
+module App.Foo.Bar exposing (foo)
+
+foo = ""
+    `;
+    await testCodeAction(source3, []);
+  });
+
   test("add all missing imports", async () => {
     const source = `
 --@ Test.elm
@@ -64,4 +112,20 @@ bar = ""
 `;
     await testCodeAction(source, [{ title: `Add all missing imports` }]);
   });
+
+  test("add import of port", async () => {
+    const source = `
+--@ Test.elm
+module Test exposing (..)
+
+func = foo
+      --^
+
+--@ App.elm
+port module App exposing (foo)
+
+port foo : String -> Cmd msg
+`;
+    await testCodeAction(source, [{ title: `Import 'foo' from module "App"` }]);
+  });
 });
diff --git a/test/completionProvider.test.ts b/test/completionProvider.test.ts
index 58beb66..27b427c 100644
--- a/test/completionProvider.test.ts
+++ b/test/completionProvider.test.ts
@@ -694,7 +694,7 @@ testFunc msg =
   it("There should be auto import completions from other modules", async () => {
     const source = `
 --@ OtherModule.elm
-module OtherModule exposing (testFunction, TestType)
+module OtherModule exposing (testFunction, TestType, testInPort, testOutPort)
 
 testFunction : String
 testFunction =
@@ -702,6 +702,10 @@ testFunction =
 
 type alias TestType = {prop : String}
 
+port testOutPort : String -> Cmd msg
+
+port testInPort : (String -> msg) -> Sub msg
+
 --@ Test.elm
 module Test exposing (..)
 
@@ -721,6 +725,27 @@ testFunc =
           ),
         ],
       },
+
+      {
+        label: "testInPort",
+        detail: "Auto import from module 'OtherModule'",
+        additionalTextEdits: [
+          TextEdit.insert(
+            Position.create(1, 0),
+            "import OtherModule exposing (testInPort)\n",
+          ),
+        ],
+      },
+      {
+        label: "testOutPort",
+        detail: "Auto import from module 'OtherModule'",
+        additionalTextEdits: [
+          TextEdit.insert(
+            Position.create(1, 0),
+            "import OtherModule exposing (testOutPort)\n",
+          ),
+        ],
+      },
       {
         label: "TestType",
         detail: "Auto import from module 'OtherModule'",
@@ -1177,13 +1202,15 @@ test = Module.{-caret-}
   it("Non imported qualified modules should have value completions with auto imports", async () => {
     const source = `
 --@ Module.elm
-module Module exposing (..)
+port module Module exposing (..)
 testFunc = ""
 
 type Msg = Msg1 | Msg2
 
 type alias Model = { field : String }
 
+port testPort : String -> Cmd msg
+
 --@ Test.elm
 module Test exposing (..)
 test = div [] [ Module.{-caret-} ]
@@ -1228,10 +1255,179 @@ test = div [] [ Module.{-caret-} ]
             TextEdit.insert(Position.create(1, 0), "import Module\n"),
           ],
         },
+        {
+          label: "testPort",
+          detail: "Auto import module 'Module'",
+          additionalTextEdits: [
+            TextEdit.insert(Position.create(1, 0), "import Module\n"),
+          ],
+        },
+      ],
+      "exactMatch",
+      "triggeredByDot",
+    );
+  });
+
+  it("Non imported qualified modules with aliases should have value completions with auto imports", async () => {
+    const source = `
+--@ Module/Foo.elm
+module Module.Foo exposing (..)
+testFunc = ""
+
+type Msg = Msg1 | Msg2
+
+type alias Model = { field : String }
+
+--@ Test.elm
+module Test exposing (..)
+test = div [] [ Foo.{-caret-} ]
+`;
+
+    await testCompletions(
+      source,
+      [
+        {
+          label: "Model",
+          detail: "Auto import module 'Module.Foo' as 'Foo'",
+          additionalTextEdits: [
+            TextEdit.insert(
+              Position.create(1, 0),
+              "import Module.Foo as Foo\n",
+            ),
+          ],
+        },
+        {
+          label: "Msg",
+          detail: "Auto import module 'Module.Foo' as 'Foo'",
+          additionalTextEdits: [
+            TextEdit.insert(
+              Position.create(1, 0),
+              "import Module.Foo as Foo\n",
+            ),
+          ],
+        },
+        {
+          label: "Msg1",
+          detail: "Auto import module 'Module.Foo' as 'Foo'",
+          additionalTextEdits: [
+            TextEdit.insert(
+              Position.create(1, 0),
+              "import Module.Foo as Foo\n",
+            ),
+          ],
+        },
+        {
+          label: "Msg2",
+          detail: "Auto import module 'Module.Foo' as 'Foo'",
+          additionalTextEdits: [
+            TextEdit.insert(
+              Position.create(1, 0),
+              "import Module.Foo as Foo\n",
+            ),
+          ],
+        },
+        {
+          label: "testFunc",
+          detail: "Auto import module 'Module.Foo' as 'Foo'",
+          additionalTextEdits: [
+            TextEdit.insert(
+              Position.create(1, 0),
+              "import Module.Foo as Foo\n",
+            ),
+          ],
+        },
+      ],
+      "exactMatch",
+      "triggeredByDot",
+    );
+
+    const source2 = `
+--@ Module/Foo/Bar.elm
+module Module.Foo.Bar exposing (..)
+testFunc = ""
+
+type Msg = Msg1 | Msg2
+
+type alias Model = { field : String }
+
+--@ Test.elm
+module Test exposing (..)
+test = div [] [ Bar.{-caret-} ]
+`;
+
+    await testCompletions(
+      source2,
+      [
+        {
+          label: "Model",
+          detail: "Auto import module 'Module.Foo.Bar' as 'Bar'",
+          additionalTextEdits: [
+            TextEdit.insert(
+              Position.create(1, 0),
+              "import Module.Foo.Bar as Bar\n",
+            ),
+          ],
+        },
+        {
+          label: "Msg",
+          detail: "Auto import module 'Module.Foo.Bar' as 'Bar'",
+          additionalTextEdits: [
+            TextEdit.insert(
+              Position.create(1, 0),
+              "import Module.Foo.Bar as Bar\n",
+            ),
+          ],
+        },
+        {
+          label: "Msg1",
+          detail: "Auto import module 'Module.Foo.Bar' as 'Bar'",
+          additionalTextEdits: [
+            TextEdit.insert(
+              Position.create(1, 0),
+              "import Module.Foo.Bar as Bar\n",
+            ),
+          ],
+        },
+        {
+          label: "Msg2",
+          detail: "Auto import module 'Module.Foo.Bar' as 'Bar'",
+          additionalTextEdits: [
+            TextEdit.insert(
+              Position.create(1, 0),
+              "import Module.Foo.Bar as Bar\n",
+            ),
+          ],
+        },
+        {
+          label: "testFunc",
+          detail: "Auto import module 'Module.Foo.Bar' as 'Bar'",
+          additionalTextEdits: [
+            TextEdit.insert(
+              Position.create(1, 0),
+              "import Module.Foo.Bar as Bar\n",
+            ),
+          ],
+        },
       ],
       "exactMatch",
       "triggeredByDot",
     );
+
+    const source3 = `
+--@ Module/Foo/Bar.elm
+module Module.Foo.Bar exposing (..)
+testFunc = ""
+
+type Msg = Msg1 | Msg2
+
+type alias Model = { field : String }
+
+--@ Test.elm
+module Test exposing (..)
+test = div [] [ Foo.{-caret-} ]
+`;
+
+    await testCompletions(source3, [], "exactMatch", "triggeredByDot");
   });
 
   it("Non imported qualified modules should have value completions with auto imports after module docs", async () => {
@@ -1827,4 +2023,27 @@ view model =
       "partialMatch",
     );
   });
+
+  it("Completions for record fields after a record pattern", async () => {
+    const source = `
+--@ Test.elm
+module Test exposing (..)
+
+type alias Foo = { prop : String }
+
+type alias Model =
+  { prop1: String
+  , prop2: Int
+  }
+
+view : Foo -> Model -> String
+view { prop } model =
+    let
+        x = model.p{-caret-}
+    in
+    ""
+`;
+
+    await testCompletions(source, ["prop1", "prop2"], "exactMatch");
+  });
 });
diff --git a/test/diagnosticTests/elmDiagnostics.test.ts b/test/diagnosticTests/elmDiagnostics.test.ts
index 4d5b37b..08cc183 100644
--- a/test/diagnosticTests/elmDiagnostics.test.ts
+++ b/test/diagnosticTests/elmDiagnostics.test.ts
@@ -1587,4 +1587,27 @@ test =
       [],
     );
   });
+
+  // https://github.com/elm-tooling/elm-language-server/issues/945
+  it("should not have an error when there is a comment in between type paramaters", async () => {
+    const source = `
+--@ Test.elm
+module Test exposing (..)
+
+type MyType
+    = MyType
+        -- First comment
+        -- Second comment
+        -- Third comment
+        Int
+
+
+someFunction : MyType -> Bool
+someFunction mytype =
+    case mytype of
+        MyType _ ->
+            True
+`;
+    await testTypeInference(basicsSources + source, [], true);
+  });
 });
diff --git a/test/referencesProviderTests/patternReferences.test.ts b/test/referencesProviderTests/patternReferences.test.ts
index bc8da94..8a93caa 100644
--- a/test/referencesProviderTests/patternReferences.test.ts
+++ b/test/referencesProviderTests/patternReferences.test.ts
@@ -1,6 +1,6 @@
 import { ReferencesProviderTestBase } from "./referencesProviderTestBase";
 
-describe("functionReferences", () => {
+describe("patternReferences", () => {
   const testBase = new ReferencesProviderTestBase();
 
   it(`let destructured patterns should have references`, async () => {
diff --git a/test/referencesProviderTests/recordFieldReferences.test.ts b/test/referencesProviderTests/recordFieldReferences.test.ts
new file mode 100644
index 0000000..78df41b
--- /dev/null
+++ b/test/referencesProviderTests/recordFieldReferences.test.ts
@@ -0,0 +1,188 @@
+import { ReferencesProviderTestBase } from "./referencesProviderTestBase";
+
+describe("recordFieldReferences", () => {
+  const testBase = new ReferencesProviderTestBase();
+
+  it(`record used in the same module`, async () => {
+    const source = `
+--@ Module.elm
+module Module exposing (foo)
+
+type alias Foo = { field : String }
+                   --^
+
+foo : Foo -> String
+foo arg  =
+    arg.field
+        --X
+
+update : Foo -> Foo
+update arg =
+    { arg | field = "" }
+            --X
+
+test : Foo
+test =
+    { field = "" }
+      --X
+
+destructure : Foo -> String
+destructure { field } =
+              --X
+    field
+    --X
+`;
+    await testBase.testReferences(source);
+  });
+
+  it(`record used in another module`, async () => {
+    const source = `
+--@ Module.elm
+module Module exposing (Foo)
+
+type alias Foo = { field : String }
+                   --^
+
+foo : Foo -> String
+foo arg  =
+    arg.field
+        --X
+
+update : Foo -> Foo
+update arg =
+    { arg | field = "" }
+            --X
+
+test : Foo
+test =
+    { field = "" }
+      --X
+
+destructure : Foo -> String
+destructure { field } =
+              --X
+    field
+    --X
+
+--@ Bar.elm
+module Bar exposing (..)
+
+import Module exposing (Foo)
+
+foo : Foo -> String
+foo arg  =
+    arg.field
+        --X
+
+update : Foo -> Foo
+update arg =
+    { arg | field = "" }
+            --X
+
+test : Foo
+test =
+    { field = "" }
+      --X
+
+destructure : Foo -> String
+destructure { field } =
+              --X
+    field
+    --X
+
+`;
+    await testBase.testReferences(source);
+  });
+
+  it(`record used in another module indirectly`, async () => {
+    const source = `
+--@ Module.elm
+module Module exposing (Foo)
+
+type alias Foo = { field : String }
+                   --^
+
+foo : Foo -> String
+foo arg  =
+    arg.field
+        --X
+
+update : Foo -> Foo
+update arg =
+    { arg | field = "" }
+            --X
+
+test : Foo
+test =
+    { field = "" }
+      --X
+
+destructure : Foo -> String
+destructure { field } =
+              --X
+    field
+    --X
+
+--@ Bar.elm
+module Bar exposing (Bar)
+
+import Module exposing (Foo)
+
+type alias Bar = { foo : Foo }
+
+foo : Foo -> String
+foo arg  =
+    arg.field
+        --X
+
+update : Foo -> Foo
+update arg =
+    { arg | field = "" }
+            --X
+
+test : Foo
+test =
+    { field = "" }
+      --X
+
+destructure : Foo -> String
+destructure { field } =
+              --X
+    field
+    --X
+
+--@ Indirect.elm
+module Indirect exposing (..)
+
+import Bar exposing (Bar)
+
+foo : Bar -> String
+foo arg  =
+    arg.foo.field
+           --X
+
+update : Bar -> Bar
+update arg =
+    let
+      foo = arg.foo
+    in
+    { arg | foo = { foo | field = "" } }
+                          --X
+
+test : Bar
+test =
+    { foo = { field = "" } }
+              --X
+
+destructure : Bar -> String
+destructure { foo } =
+    let
+      { field } = foo
+        --X
+
+    in
+    field
+`;
+    await testBase.testReferences(source);
+  });
+});