<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Eslint on Haseeb Majid</title>
    <link>https://haseebmajid.dev/tags/eslint/</link>
    <description>Recent content in Eslint on Haseeb Majid</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Sun, 09 Apr 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://haseebmajid.dev/tags/eslint/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>TIL: How to Get VSCode ESLint to Sort Imports</title>
      <link>https://haseebmajid.dev/posts/2023-04-09--til-how-to-get-vscode-eslint-to-sort-imports-/</link>
      <pubDate>Sun, 09 Apr 2023 00:00:00 +0000</pubDate>
      <author>Me</author>
      <guid>https://haseebmajid.dev/posts/2023-04-09--til-how-to-get-vscode-eslint-to-sort-imports-/</guid>
      <description>&lt;p&gt;I use VS Code as my text editor, one of the features I really like about VS Code is that it will format our file on save.
Which saves needing to run a CLI tool to do it. For example, running &lt;code&gt;prettier&lt;/code&gt;. As part of the formatting on save you can
set an option to organise your imports as well.&lt;/p&gt;
&lt;p&gt;If you open your &lt;code&gt;settings.json&lt;/code&gt;, you can add a section like this:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I use VS Code as my text editor, one of the features I really like about VS Code is that it will format our file on save.
Which saves needing to run a CLI tool to do it. For example, running <code>prettier</code>. As part of the formatting on save you can
set an option to organise your imports as well.</p>
<p>If you open your <code>settings.json</code>, you can add a section like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;eslint.validate&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;javascript&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;svelte&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;javascriptreact&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;typescript&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;typescriptreact&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;[typescript]&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;editor.defaultFormatter&#34;</span><span class="p">:</span> <span class="s2">&#34;esbenp.prettier-vscode&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;editor.tabSize&#34;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;editor.codeActionsOnSave&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;source.organizeImports&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;source.fixAll&#34;</span><span class="p">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Now this format our typescript files automatically when we save it, including organising our imports.
Now this is all well and good, except when we add the following ESLint plugin
<a href="https://github.com/import-js/ESLint-plugin-import"><code>ESLint-plugin-import</code></a>.</p>
<p>This plugin lets us set our own rules for how to sort plugins and how to organise them into groups.
So our ESLint config may look something like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="cl">  <span class="kr">extends</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// ...
</span></span></span><span class="line"><span class="cl">    <span class="s2">&#34;plugin:import/errors&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;plugin:import/warnings&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;plugin:import/typescript&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nx">rules</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// ...
</span></span></span><span class="line"><span class="cl">    <span class="s2">&#34;import/order&#34;</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;warn&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">groups</span><span class="o">:</span> <span class="p">[</span><span class="s2">&#34;builtin&#34;</span><span class="p">,</span> <span class="s2">&#34;external&#34;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&#34;sibling&#34;</span><span class="p">,</span> <span class="s2">&#34;parent&#34;</span><span class="p">],</span> <span class="s2">&#34;index&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">        <span class="nx">pathGroups</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">pattern</span><span class="o">:</span> <span class="s2">&#34;$app/**&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nx">group</span><span class="o">:</span> <span class="s2">&#34;external&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">},</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">pattern</span><span class="o">:</span> <span class="s2">&#34;~/**&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nx">group</span><span class="o">:</span> <span class="s2">&#34;sibling&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">],</span>
</span></span><span class="line"><span class="cl">        <span class="nx">alphabetize</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">order</span><span class="o">:</span> <span class="s2">&#34;asc&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">caseInsensitive</span><span class="o">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;newlines-between&#34;</span><span class="o">:</span> <span class="s2">&#34;always&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>Now this will conflict with the way VS Code will format our imports, it will format them incorrectly according to the settings we have
just set up in our ESLint config. To stop this from happening it&rsquo;s very simple we need to remove the <code>&quot;source.organizeImports&quot;: true,</code>
line from our config. Now VS Code will use just ESLint to format our imports 🎉.</p>
<p>There is one downside to this approach I have noticed, which is unused imports no longer get removed automatically, which used to happen.
But this will get fixed by pre-commit hooks.</p>
<details
  class="notice info"
  open="true"
>
    <summary class="notice-title">Remove Unused Imports</summary>
  
  EDIT: I found this option which will hopefully fix the above issue <code>&quot;source.removeUnusedImports&quot;: true</code>
</details>

<h2 id="appendix">Appendix</h2>
<ul>
<li><a href="https://gitlab.com/bookmarkey/gui/-/blob/7ce4d9326b610ae16840691d16fbb82a6ec4f5ee/.ESLintrc.cjs">Example Repo</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>How to Autosort our SvelteKit Imports</title>
      <link>https://haseebmajid.dev/posts/2023-01-10-how-to-autosort-our-sveltekit-imports/</link>
      <pubDate>Tue, 10 Jan 2023 00:00:00 +0000</pubDate>
      <author>Me</author>
      <guid>https://haseebmajid.dev/posts/2023-01-10-how-to-autosort-our-sveltekit-imports/</guid>
      <description>&lt;p&gt;In this post, we will go over how we can auto-sort our imports in our svelte files. To do this we will be using eslint and the
&lt;a href=&#34;https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/order.md&#34;&gt;&lt;code&gt;eslint-import-plugin&lt;/code&gt; plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re anything like me you like have ordered imports, rather than random imports that can be hard to make sense of.
In Python we have &lt;code&gt;isort&lt;/code&gt; in golang we have &lt;code&gt;goimports&lt;/code&gt;. In JavaScript we can use eslint with the above plugin. However,
we need to set up some specific configuration.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In this post, we will go over how we can auto-sort our imports in our svelte files. To do this we will be using eslint and the
<a href="https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/order.md"><code>eslint-import-plugin</code> plugin</a>.</p>
<p>If you&rsquo;re anything like me you like have ordered imports, rather than random imports that can be hard to make sense of.
In Python we have <code>isort</code> in golang we have <code>goimports</code>. In JavaScript we can use eslint with the above plugin. However,
we need to set up some specific configuration.</p>
<h2 id="setup">Setup</h2>
<p>I will create a new SvelteKit application but this should be equally applicable to existing applications and should
work with both SvelteKit and Svelte. As all we are going to do is organise our imports.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm create svelte@latest example
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> example
</span></span><span class="line"><span class="cl">npm install
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Output</span>
</span></span><span class="line"><span class="cl"><span class="c1"># create-svelte version 2.1.0</span>
</span></span><span class="line"><span class="cl"><span class="c1"># </span>
</span></span><span class="line"><span class="cl"><span class="c1"># Welcome to SvelteKit!</span>
</span></span><span class="line"><span class="cl"><span class="c1"># </span>
</span></span><span class="line"><span class="cl"><span class="c1"># ✔ Which Svelte app template? › SvelteKit demo app</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ✔ Add type checking with TypeScript? › Yes, using TypeScript syntax</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ✔ Add ESLint for code linting? … No / Yes</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ✔ Add Prettier for code formatting? … No / Yes</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ✔ Add Playwright for browser testing? … No / Yes</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ✔ Add Vitest for unit testing? … No / Yes</span>
</span></span></code></pre></div><h2 id="eslint">eslint</h2>
<p>Now onto the main part of this post let us edit our <code>.eslintrc.cjs</code> file which looks like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">root</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="nx">parser</span><span class="o">:</span> <span class="s1">&#39;@typescript-eslint/parser&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="kr">extends</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;eslint:recommended&#39;</span><span class="p">,</span> <span class="s1">&#39;plugin:@typescript-eslint/recommended&#39;</span><span class="p">,</span> <span class="s1">&#39;prettier&#39;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">	<span class="nx">plugins</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;svelte3&#39;</span><span class="p">,</span> <span class="s1">&#39;@typescript-eslint&#39;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">	<span class="nx">ignorePatterns</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;*.cjs&#39;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">	<span class="nx">overrides</span><span class="o">:</span> <span class="p">[{</span> <span class="nx">files</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;*.svelte&#39;</span><span class="p">],</span> <span class="nx">processor</span><span class="o">:</span> <span class="s1">&#39;svelte3/svelte3&#39;</span> <span class="p">}],</span>
</span></span><span class="line"><span class="cl">	<span class="nx">settings</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;svelte3/typescript&#39;</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;typescript&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">parserOptions</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">sourceType</span><span class="o">:</span> <span class="s1">&#39;module&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">ecmaVersion</span><span class="o">:</span> <span class="mi">2020</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">env</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">browser</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">es2017</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">node</span><span class="o">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><h3 id="eslint-plugin-svelte">eslint-plugin-svelte</h3>
<p>First, we need to use an &ldquo;unofficial&rdquo; plugin for Svelte which also comes with an eslint parser (I think).
See the relevant thread <a href="https://github.com/import-js/eslint-plugin-import/issues/2407#issuecomment-1223394415">here</a>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm install eslint-plugin-svelte --save-dev
</span></span></code></pre></div><p>Then we edit our eslint config file so it looks like this now:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">root</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line hl"><span class="cl">	<span class="nx">parser</span><span class="o">:</span> <span class="s1">&#39;@typescript-eslint/parser&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="nx">parserOptions</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">project</span><span class="o">:</span> <span class="s1">&#39;./tsconfig.json&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">extraFileExtensions</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;.svelte&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="kr">extends</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;eslint:recommended&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;plugin:svelte/recommended&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;plugin:@typescript-eslint/recommended&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;prettier&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="p">],</span>
</span></span><span class="line"><span class="cl">	<span class="nx">plugins</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;@typescript-eslint&#39;</span><span class="p">],</span>
</span></span><span class="line hl"><span class="cl">	<span class="nx">ignorePatterns</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;*.cjs&#39;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">	<span class="nx">overrides</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">		<span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nx">files</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;*.svelte&#39;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">			<span class="nx">parser</span><span class="o">:</span> <span class="s1">&#39;svelte-eslint-parser&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="nx">parserOptions</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="nx">parser</span><span class="o">:</span> <span class="s1">&#39;@typescript-eslint/parser&#39;</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">],</span>
</span></span><span class="line"><span class="cl">	<span class="nx">settings</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;svelte3/typescript&#39;</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;typescript&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">parserOptions</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">sourceType</span><span class="o">:</span> <span class="s1">&#39;module&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">ecmaVersion</span><span class="o">:</span> <span class="mi">2020</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">env</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">browser</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">es2017</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">node</span><span class="o">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><h3 id="eslint-import-plugin">eslint-import-plugin</h3>
<p>Now let&rsquo;s add the plugin that will actually update our imports.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm install eslint-plugin-import --save-dev
</span></span></code></pre></div><p>Now we want to edit our eslint config file so it looks like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">root</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="nx">parser</span><span class="o">:</span> <span class="s1">&#39;@typescript-eslint/parser&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="nx">parserOptions</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">project</span><span class="o">:</span> <span class="s1">&#39;./tsconfig.json&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">extraFileExtensions</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;.svelte&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="kr">extends</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;eslint:recommended&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;plugin:svelte/recommended&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;plugin:@typescript-eslint/recommended&#39;</span><span class="p">,</span>
</span></span><span class="line hl"><span class="cl">		<span class="s1">&#39;prettier&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s1">&#39;plugin:import/errors&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;plugin:import/warnings&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s1">&#39;plugin:import/typescript&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="p">],</span>
</span></span><span class="line"><span class="cl">	<span class="nx">plugins</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;@typescript-eslint&#39;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">	<span class="nx">ignorePatterns</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;*.cjs&#39;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">	<span class="nx">overrides</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">		<span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nx">files</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;*.svelte&#39;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">			<span class="nx">parser</span><span class="o">:</span> <span class="s1">&#39;svelte-eslint-parser&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="nx">parserOptions</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="nx">parser</span><span class="o">:</span> <span class="s1">&#39;@typescript-eslint/parser&#39;</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">],</span>
</span></span><span class="line hl"><span class="cl">	<span class="nx">rules</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;import/order&#39;</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">			<span class="s1">&#39;warn&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="nx">alphabetize</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">					<span class="nx">order</span><span class="o">:</span> <span class="s1">&#39;asc&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">					<span class="nx">caseInsensitive</span><span class="o">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">				<span class="p">},</span>
</span></span><span class="line"><span class="cl">				<span class="s1">&#39;newlines-between&#39;</span><span class="o">:</span> <span class="s1">&#39;always&#39;</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>
</span></span><span class="line"><span class="cl">		<span class="p">]</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">settings</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="s1">&#39;svelte3/typescript&#39;</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;typescript&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">parserOptions</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">sourceType</span><span class="o">:</span> <span class="s1">&#39;module&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">ecmaVersion</span><span class="o">:</span> <span class="mi">2020</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">env</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">browser</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">es2017</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">node</span><span class="o">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><h4 id="importorder">import/order</h4>
<p>The most interesting change we did is to add a bunch of rules. We want to add rules for import/order which is what is used to sort our imports.
In the example below we are setting any incorrectly ordered imports to warn us rather than throw an error. Then we are telling it to sort
our imports alphabetically. We are also setting it to create new lines between the various groups. Where a group would be something like:
<code>builtin</code>, <code>external</code>, <code>parent</code>, you can read more about it <a href="https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/order.md#importorder">here</a>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">rules</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="s1">&#39;import/order&#39;</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s1">&#39;warn&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">alphabetize</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">order</span><span class="o">:</span> <span class="s1">&#39;asc&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nx">caseInsensitive</span><span class="o">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">            <span class="p">},</span>
</span></span><span class="line"><span class="cl">            <span class="s1">&#39;newlines-between&#39;</span><span class="o">:</span> <span class="s1">&#39;always&#39;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span>
</span></span></code></pre></div><p>We can auto fix imports if we run <code>eslint</code> with the <code>--fix</code> argument i.e. <code>eslint --fix .</code>. We can also our IDE auto sort our imports on save
in VS Code add the following option to your <code>settings.json</code> file:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;eslint.codeActionsOnSave.mode&#34;</span><span class="p">:</span> <span class="s2">&#34;all&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>This will attempt to fix all the issues raised by eslint for our file when we save it (you will need the eslint extension, <a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)">https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)</a>.</p>
<h2 id="appendix">Appendix</h2>
<ul>
<li><a href="https://gitlab.com/hmajid2301/blog/-/tree/main/content/posts/2023-01-10-how-to-autosort-our-sveltekit-imports/source_code">Example source code</a></li>
<li><a href="https://gitlab.com/bookmarkey/gui/-/commit/db184d8ddd427e81d8884e65c6a5f013bb30ab2c">Example commit adding import order</a></li>
<li><a href="https://gitlab.com/bookmarkey/gui/-/blob/886f230e0c6c75b6f5f7f9e445205fd90b6fbf33/.eslintrc.cjs">Example eslint confif file</a></li>
</ul>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
