<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sindre Aarsaether</title>
    <description>The latest articles on DEV Community by Sindre Aarsaether (@somebee).</description>
    <link>https://dev.to/somebee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F66159%2Fa0d498fc-54c6-4f8b-8e4e-a707bd583599.png</url>
      <title>DEV Community: Sindre Aarsaether</title>
      <link>https://dev.to/somebee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/somebee"/>
    <language>en</language>
    <item>
      <title>Global Type Augmentations with automagic IntelliSense</title>
      <dc:creator>Sindre Aarsaether</dc:creator>
      <pubDate>Thu, 01 Jul 2021 12:38:32 +0000</pubDate>
      <link>https://dev.to/somebee/global-type-augmentations-with-automagic-intellisense-4aka</link>
      <guid>https://dev.to/somebee/global-type-augmentations-with-automagic-intellisense-4aka</guid>
      <description>&lt;h1&gt;
  
  
  Automatic global type augmentations with intellisense
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CFTlJaEB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://user-images.githubusercontent.com/8467/124123922-1cdb5900-da78-11eb-8e61-2b0e7e6358de.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CFTlJaEB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://user-images.githubusercontent.com/8467/124123922-1cdb5900-da78-11eb-8e61-2b0e7e6358de.gif" alt="extend-number"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you ever wanted to add methods to a built-in type like &lt;code&gt;Number&lt;/code&gt; or &lt;code&gt;String&lt;/code&gt; in JavaScript, you could extend the prototype directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Add helper function to number&lt;/span&gt;
&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defineProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;clamp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;

    &lt;span class="na"&gt;enumerable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Add setter to allow defining shortcuts for dom elements&lt;/span&gt;
&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defineProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;HTMLElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shortcut&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;
    &lt;span class="na"&gt;enumerable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_shortcut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="c1"&gt;// register key-bindings etc&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, if we try to use these functions, the type-checker will flag it as errors, and intellisense will not work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Property 'clamp' does not exist on type number&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;shortcut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ctrl+a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Property 'shortcut' does not exist on type HTMLElement&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To enable type-checking and intellisense you will have to create a separate file where you declare the added methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// types/extensions.d.ts&lt;/span&gt;
&lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="nb"&gt;global&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;HTMLElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="nx"&gt;shortcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, if you make sure the &lt;code&gt;.d.ts&lt;/code&gt; file is referenced in your project, the squiggly lines should disappear, and completions should start to work!&lt;/p&gt;

&lt;p&gt;It is not considered good practice to extend global types like this anyways, but extending (re-opening) your own classes, and augmenting interfaces of external libraries is even more clunky, and there might be good reasons for you to do it.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://imba.io"&gt;Imba&lt;/a&gt;, where dom elements are first-class citizens and it is rather easy to create large projects that do not depend on a bunch of external web components and libraries, extending the functionality of tags and objects is not discouraged. This is how you would do it in imba:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;extend class Number
    def clamp(min\number, max\number)
        return Math.min(Math.max(min,self),max)

extend tag element
    set shortcut value
        # register key-bindings etc

let el = &amp;lt;div shortcut='ctrl+a'&amp;gt; &amp;lt;span&amp;gt; 10.clamp(5,15)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is all you need. Imba generates the correct typescript declarations (with type inference). Type-checking, goto definitions, auto-completions etc just works. If your project includes a mix of imba, js, and typescript it will work across all your files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;shortcut&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'ctrl+a'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is even better than it seems. Imba also does type inference from your actual declarations, which makes things &lt;em&gt;a lot&lt;/em&gt; less verbose. Let's allow all custom components to easily access a shared api:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import API from './api'
const api = new API

extend tag component
    get api
        api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, all components Imba will have direct access to the api. Again, with intellisense.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# define a custom button
tag edit-user-button &amp;lt; button
    &amp;lt;self @click=api.editUser(data)&amp;gt; 'edit user'

# use it in another custom component
tag user-modal
    &amp;lt;self&amp;gt;
        &amp;lt;h1&amp;gt; "User"
        &amp;lt;.actions&amp;gt;
            &amp;lt;edit-user-button data=user&amp;gt;
            ...

# No need to pass the api down into children, or import it from every file.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to add functionality to your api without writing it all in one file, you can simply extend the class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import API from './api'

extend class API
    def broadcast event\string, data = {}
        # do something here ...
        self
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you would like to know more about Imba, read the latest &lt;a href="https://dev.to/somebee/imba-a-javascript-alternative-for-increased-developer-productivity-49c9"&gt;dev.to post&lt;/a&gt; or go to &lt;a href="https://imba.io"&gt;imba.io&lt;/a&gt; :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RwdZcJHh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://user-images.githubusercontent.com/8467/124124120-5b711380-da78-11eb-92d6-af1a862d9102.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RwdZcJHh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://user-images.githubusercontent.com/8467/124124120-5b711380-da78-11eb-92d6-af1a862d9102.gif" alt="extend-element"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>imba</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Imba - a JavaScript alternative for increased developer productivity</title>
      <dc:creator>Sindre Aarsaether</dc:creator>
      <pubDate>Thu, 10 Jun 2021 13:39:46 +0000</pubDate>
      <link>https://dev.to/somebee/imba-a-javascript-alternative-for-increased-developer-productivity-49c9</link>
      <guid>https://dev.to/somebee/imba-a-javascript-alternative-for-increased-developer-productivity-49c9</guid>
      <description>&lt;p&gt;I'm Sindre, CTO at &lt;a href="https://scrimba.com" rel="noopener noreferrer"&gt;Scrimba.com&lt;/a&gt;. We're about to launch a major overhaul of &lt;a href="http://imba.io" rel="noopener noreferrer"&gt;Imba&lt;/a&gt;, the programming language we use for everything here at Scrimba. The language has been developed over many years, and it powers &lt;strong&gt;both the frontend and backend&lt;/strong&gt; of Scrimba (100K+ monthly users). Imba is &lt;em&gt;not an academic exercise or a toy project&lt;/em&gt;. Check out &lt;a href="https://imba.io" rel="noopener noreferrer"&gt;https://imba.io&lt;/a&gt; for more details!&lt;/p&gt;

&lt;p&gt;Since we've been flying under the radar for several years I thought I should post about it here now that we are approaching beta of this &lt;em&gt;major&lt;/em&gt; update.&lt;/p&gt;

&lt;p&gt;The main benefit of Imba is &lt;strong&gt;speed.&lt;/strong&gt; Both in development and performance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Imba's Memoized DOM approach is &lt;strong&gt;an order of magnitude&lt;/strong&gt; faster than Virtual DOMs (Vue, React). See &lt;a href="https://www.freecodecamp.org/news/the-virtual-dom-is-slow-meet-the-memoized-dom-bb19f546cc52/" rel="noopener noreferrer"&gt;this article&lt;/a&gt; for a short introduction to the approach.&lt;/li&gt;
&lt;li&gt;Imba's time-saving syntax with built-in tags and styles results in &lt;strong&gt;less typing and switching files&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Imba works with node and the npm ecosystem, and integrates tightly with both js and typescript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some of the features worth mentioning 👇&lt;/p&gt;

&lt;h3&gt;
  
  
  Minimal syntax
&lt;/h3&gt;

&lt;p&gt;Imba's syntax is minimal, beautiful, and packed with clever features. It combines logic, markup and styling in a powerful way. Less keystrokes, and less switching files means you'll be able to build things fast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8467%2F121170829-074a8900-c856-11eb-88d9-d4a922c24893.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8467%2F121170829-074a8900-c856-11eb-88d9-d4a922c24893.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Runs on both server and client
&lt;/h3&gt;

&lt;p&gt;Imba powers both the frontend and the backend of Scrimba.com, our learning platform with 100K+ monthly active users. On the frontend, Imba replaces e.g. Vue or React, and on the backend, it works with the Node ecosystem (e.g. npm).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8467%2F121170852-0fa2c400-c856-11eb-8aab-322d4b6a875d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8467%2F121170852-0fa2c400-c856-11eb-8aab-322d4b6a875d.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrated styling
&lt;/h3&gt;

&lt;p&gt;Inspired by tailwind, Imba brings styles directly into your code. Styles can be scoped to files, components, and even parts of your tag trees. Style modifiers like @hover, &lt;a class="mentioned-user" href="https://dev.to/lg"&gt;@lg&lt;/a&gt;, @landscape and &lt;a class="mentioned-user" href="https://dev.to/dark"&gt;@dark&lt;/a&gt; can be used for extremely concise yet powerful styling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8467%2F121170905-1e897680-c856-11eb-8b67-2014f0c508e6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8467%2F121170905-1e897680-c856-11eb-8b67-2014f0c508e6.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Blazing fast, Zero config
&lt;/h3&gt;

&lt;p&gt;Imba comes with a built-in bundler based on the blazing fast esbuild. Import stylesheets, images, typescript, html, workers and more without any configuration. Bundling is so fast that there is no difference between production and development mode - it all happens on-demand.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8467%2F121170927-247f5780-c856-11eb-95bf-fa09ca5f8cff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8467%2F121170927-247f5780-c856-11eb-95bf-fa09ca5f8cff.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you run your app with the &lt;code&gt;imba&lt;/code&gt; command it automatically bundles and compiles your imba code, along with typescript, css and many other file types. It provides automatic reloading of both the server and client.&lt;/p&gt;

&lt;h3&gt;
  
  
  Typing and tooling
&lt;/h3&gt;

&lt;p&gt;The tooling is implemented as a typescript server plugin giving us great intellisense, diagnostics, and even cross-file refactorings that works with js/ts files in the same project. You can import types just like in typescript, and annotate variables, parameters and expressions. Like the language, the tooling is still in alpha, but improving every day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8467%2F121170940-29440b80-c856-11eb-82bb-ac821d0d0c36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8467%2F121170940-29440b80-c856-11eb-82bb-ac821d0d0c36.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Get involved!
&lt;/h2&gt;

&lt;p&gt;If you'd like to learn more about Imba, please join our &lt;a href="https://discord.com/invite/mkcbkRw" rel="noopener noreferrer"&gt;Discord server.&lt;/a&gt; We also host community meetings (watch recordings of &lt;a href="https://www.youtube.com/playlist?list=PLf1a9PYKGPdl3OMBHV72Oz23eFy9q51jJ" rel="noopener noreferrer"&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Imba has been under active development for 6+ years now, and activity is only ramping up. We're looking for contributors who would like to help improve documentation and the ecosystem around Imba.&lt;/p&gt;

&lt;p&gt;We really think Imba will add a lot of value in an already crowded space of languages and frameworks. if you're the type who loves to tinker with new things, I'd wholeheartedly recommend you to check it out :)&lt;/p&gt;

</description>
      <category>imba</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
