# Review no. 1 I didn't touch Imba for a while and I'm really happy with what it became. CSS syntax totally nails it! I played a bit with Imba2 and here are my notes: ## require / import I used to write: ```coffee let helpers = method1: require('lodash.method2') method2: require('lodash.method2') ... method9: require('somelib.method9') ``` There's no `inline` import equivalent and I need to write it like this: ```coffee import method1 from 'lodash.method1' import method2 from 'lodash.method2' ... import method9 from 'somelib.method9' let helpers = { method1, method2 ... method9 } ``` Not terrible. `require` was more predictable though and if it's not a big deal it would be nice to have both - `require` and `import`. There's a chance it would be just an alias in existing implementation. Also with `import` syntax it would be nice to have syntax like this: ```coffee import { method1, method2 ... method3 } as helpers from 'lodash' ``` _Side note:_ Actually I had random issues with importing from `lodash` and I finished with using `lodash-es` library. [Issue](https://github.com/imba/imba/issues/793) ## assigning attributes to self There's neat syntax in Coffeescript for a thing which is repeatable in any object oriented program. I mean assigning attributes to the object without any modification. ```coffee class Dog constructor: (@name) -> # is equal to: class Dog constructor: (name) -> this.name = name ``` And I miss it here even Imba was forked from Coffeescript years ago. It could be `@` or `$` prefix or `!` postfix to tell that argument should be assigned to `self`. [Issue](https://github.com/imba/imba/issues/795) ## No errors in browser while having syntax error in imba file I've been few times confused what happen after having a typo in source file. Then I find through browser tools that the file is simply not attached to the bundle. It would be much faster for a developer to have an error notice displayed in browser. [Issue](https://github.com/imba/imba/issues/796) ## I miss pseudo :symbols from Imba1 ```coffee :symbol # => 'symbol' ``` It was really small feature but I loved to use it. Why to drop it? [Issue](https://github.com/imba/imba/issues/797) ## one-word webcomponents I had an issue described [here](https://discord.com/channels/682180555286380545/1019638724188979250/threads/1062282410542239765). Looks like you can't name a tag starting with a small letter if it's one word. The problem is - I have read whole documentation before writing anything and didn't notice it - even it's written there. It could be more emphasised. - It doesn't break program immediately. Many things worked normally before I occured a situation it doesn't work as expected. - There are examples in documentation which use such naming themselves. - Some templates after imba create produce such names. - Historical examples will have such naming as it was totally fine before. Considering above I suggest allow such naming and implicitly convert it to web-component name, like `x-name`. [Issue](https://github.com/imba/imba/issues/798) ## one line variable or prop declarations Proposal: ```coffee let a, b, c # is equal to: let a let b let c prop a, b, c # is equal to: prop a prop b prop c let a, b, c = 1 # is equal to: let a let b let c = 1 # and so on... ``` [Issue](https://github.com/imba/imba/issues/799) ## short form of loops By skipping var name declaration and giving them default values (`el`, `i`, `key`, `v`) and also by skipping `for` keyword we could have a short syntax for `for` loops. Examples accordingly after documentation[link](https://imba.io/docs/basic-syntax/control-flow#forin-loops): ```coffee el * 2 in [1,2,3] # num * 2 for num in [1,2,3] console.log(el * i) in [1,2,3] # console.log(num * index) for num,index in [1,2,3] el * 2 in [1,2,3] by 2 # num * 2 for num in [1,2,3] by 2 console.log(el) in [1,2,3] when i % 2 # console.log(num) for num,i in [1,2,3] when i % 2 el in [1 .. 3] # num for num in [1 .. 3] console.log(el) of [10,20,30] #console.log(value) for value of [10,20,30] # destructuring up to 2 elements could be implicated just by using key or v in code block # or if it's not possible for imba parser it can have no shortcut let iterable = new Map([['a',1],['b',2],['c',3]]) console.log(v) of iterable # console.log(value) for [key,value] of iterable el * 2 of arguments # arg * 2 for arg of arguments console.log el,i of iterable # console.log entry,idx for entry,idx of iterable console.log key,v,i of iterable # console.log key,value,idx for [key,value],idx of iterable let obj = {a: 1, b: 2, c: 3} console.log "{key} is {v}" of obj # console.log "{key} is {value}" for own key,value of obj ``` [Issue](https://github.com/imba/imba/issues/800) ## [bug] no .gitignore in Vite template (after imba create) I didn't noticed and added whole node\_modules in initial commit to the repo. [PR](https://github.com/imba/imba/pull/794) ### Pro-router integration This is result of my short play with Imba2: [pro-router-imba2](https://router.maniak.pro/imba2). I'm thinking about introducing syntax `?` for operating with url params: ```coffee # url: /books/id/1 ?id # => 1 ?id = 2 # => url: /books/id/2 # advanced ??focus = 'title' # => url: /books/id/2/#/focus/title ??focus # => 'title' ???feature = 'selloff' # => url: /books/id/2/#/focus/title?feature=selloff ???feature # => 'selloff' ``` Both keeps router getters and setters in loop. Also I give you for consideration to introduce such syntax in Imba by default. [Issue](https://github.com/imba/imba/issues/801)