<?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: Marceau "XioRcaL" Lacroix</title>
    <description>The latest articles on DEV Community by Marceau "XioRcaL" Lacroix (@xiorcal).</description>
    <link>https://dev.to/xiorcal</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%2F261143%2F352c1082-2e17-47fb-8c12-a464661649bb.jpeg</url>
      <title>DEV Community: Marceau "XioRcaL" Lacroix</title>
      <link>https://dev.to/xiorcal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xiorcal"/>
    <language>en</language>
    <item>
      <title>Setting up a typescript project in 2021</title>
      <dc:creator>Marceau "XioRcaL" Lacroix</dc:creator>
      <pubDate>Wed, 28 Apr 2021 07:48:50 +0000</pubDate>
      <link>https://dev.to/avalon-lab/setting-up-a-typescript-project-in-2021-4cfg</link>
      <guid>https://dev.to/avalon-lab/setting-up-a-typescript-project-in-2021-4cfg</guid>
      <description>&lt;p&gt;This post will describe how to create a project in typescript from scratch. The final project include some basic code, tests, commit hooks to enforce code formating, automatic tests on push and more ! I hope you'll enjoy it :)&lt;/p&gt;

&lt;h1&gt;
  
  
  TL; DR
&lt;/h1&gt;

&lt;p&gt;find the code &lt;a href="https://github.com/xiorcal/ts-demo"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Basics
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Before you start
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;you should have node/npm (latest lts should do the trick)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm init&lt;/code&gt; was run. So you have a &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting up typescript
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Typescript itself
&lt;/h3&gt;

&lt;p&gt;Pretty straight-forward : &lt;code&gt;npm install typescript --save-dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now check if that worked ; create a file &lt;code&gt;src/demo.ts&lt;/code&gt; and fill it with&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;greeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person&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="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;greeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And run... Wait... what should I run ? Meh that JS, a &lt;code&gt;node src/demo.ts&lt;/code&gt; will do it !&lt;br&gt;
...&lt;br&gt;
Oh no... Why does it complains about some unexpected ':' ?&lt;br&gt;
:-/&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuring typescript itself
&lt;/h3&gt;

&lt;p&gt;I like to use a recommended default setting for tsc (typescript compiler) : &lt;code&gt;npm install --save-dev @tsconfig/recommended&lt;/code&gt; then create a file named &lt;code&gt;tsconfig.json&lt;/code&gt; and fill it with :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@tsconfig/recommended/tsconfig.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"outDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"include"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/**/*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"exclude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node_modules"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in your package.json add a script for build : &lt;code&gt;"build": "tsc",&lt;/code&gt;&lt;br&gt;
you should be able to run &lt;code&gt;npm run build&lt;/code&gt; then &lt;code&gt;node dist/demo.js&lt;/code&gt;&lt;br&gt;
Nice !&lt;/p&gt;
&lt;h3&gt;
  
  
  Speeding things up
&lt;/h3&gt;

&lt;p&gt;well I'm the kind of person that does not like to have to type 2 commands everytime my code changes. So lets spend some time automating it a bit&lt;/p&gt;

&lt;p&gt;first add tsc-watch to the project: &lt;code&gt;npm install tsc-watch --save-dev&lt;/code&gt;&lt;br&gt;
then add a watch script to the package:&lt;br&gt;
&lt;code&gt;"watch": "tsc-watch --onSuccess \"node ./dist/demo.js\"",&lt;/code&gt;&lt;br&gt;
now you can run &lt;code&gt;npm watch&lt;/code&gt; and every change you made will imediately be complied and run ! &lt;/p&gt;
&lt;h2&gt;
  
  
  Enforce the "2 spaces or GTFO" law !
&lt;/h2&gt;

&lt;p&gt;formatting will be done with eslint and prettier, enforcing formatting will be done with husky and its pre-commit hooks &lt;/p&gt;
&lt;h3&gt;
  
  
  configuring style tools
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-config-prettier eslint-plugin-import prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;in &lt;code&gt;.eslintrc.js&lt;/code&gt; file :&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint/parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;parserOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tsconfig.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;sourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint/eslint-plugin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eslint:recommended&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;plugin:@typescript-eslint/recommended&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;prettier&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;in &lt;code&gt;.eslintignore&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
dist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in &lt;code&gt;.prettierrc.js&lt;/code&gt; :&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;trailingComma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;all&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tabWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;singleQuote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;add a &lt;code&gt;lint&lt;/code&gt; script to package.json :&lt;br&gt;
&lt;code&gt;"lint": "eslint src --ext .js,.jsx,.ts,.tsx"&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Automate it
&lt;/h3&gt;

&lt;p&gt;Once again, I'm lazy, so I need those tools to run automatically for me. That's where husky commes to play!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; husky pretty-quick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;add a prepare script : &lt;code&gt;"prepare": "husky install"&lt;/code&gt;&lt;br&gt;
run it : &lt;code&gt;npm run prepare&lt;/code&gt;&lt;br&gt;
you should see a .husky directory now.&lt;br&gt;
create a file nammed &lt;code&gt;pre-commit&lt;/code&gt; in this directory and fill it with :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/_/husky.sh"&lt;/span&gt;

npx &lt;span class="nt"&gt;--no-install&lt;/span&gt; pretty-quick &lt;span class="nt"&gt;--staged&lt;/span&gt;
npm run lint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now your formatting will be fixed on commit \o/&lt;/p&gt;

&lt;h2&gt;
  
  
  enforce the "meaningful commit or GTFO" law !
&lt;/h2&gt;

&lt;p&gt;this will be done with commit-lint &lt;br&gt;
&lt;code&gt;npm install --save-dev @commitlint/config-conventional @commitlint/cli&lt;/code&gt;&lt;br&gt;
then create a &lt;code&gt;commit-msg&lt;/code&gt; file in .husky directory with :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/_/husky.sh"&lt;/span&gt;

npx &lt;span class="nt"&gt;--no-install&lt;/span&gt; commitlint &lt;span class="nt"&gt;--edit&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;and a &lt;code&gt;commitlint.config.js&lt;/code&gt; with &lt;code&gt;module.exports = {extends: ['@commitlint/config-conventional']}&lt;/code&gt; in it.&lt;br&gt;
Now your commit messages are force to obey the law !&lt;/p&gt;
&lt;h2&gt;
  
  
  Prevent your friends to break the law
&lt;/h2&gt;

&lt;p&gt;husky take care of that for you :)&lt;/p&gt;
&lt;h2&gt;
  
  
  These are not the tests you are looking for
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Set-up
&lt;/h3&gt;

&lt;p&gt;I use jest so we need to install it first: &lt;code&gt;npm install -D jest ts-jest @types/jest&lt;/code&gt;&lt;br&gt;
then config, &lt;code&gt;jest.config.js&lt;/code&gt; :&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;preset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ts-jest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;testEnvironment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node&lt;/span&gt;&lt;span class="dl"&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;add a test script : &lt;code&gt;"test": "jest"&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Your very first test
&lt;/h3&gt;

&lt;p&gt;in &lt;code&gt;demo.spec.ts&lt;/code&gt; we are going to ensure that our greeter is really polite:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;greeter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./demo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;greeter function&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a greet should start with Hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;greeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&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;try it with &lt;code&gt;npm run test&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Guess what...? AUTOMATION
&lt;/h3&gt;

&lt;p&gt;This time no external deps nor manual tweaking ! jest took care of that for us. simply run &lt;code&gt;jest --watch&lt;/code&gt; ! Your tests should run on source edit. Alternatively you can use an extension in your ide to do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up your dev env
&lt;/h2&gt;

&lt;p&gt;I'm using vscode so this is the one that will be covered by this section.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extensions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=Orta.vscode-jest"&gt;Jest (orta.vscode-jest)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint"&gt;ESLint (dbaeumer.vscode-eslint)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode"&gt;Prettier - Code formatter (esbenp.prettier-vscode)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I suggest enabling code coverage overlay for jest (io.orta.jest.coverage.toggle).&lt;br&gt;
Using prettier as formatter directly in editor will instantanely format your code correctly rather than on commit.&lt;/p&gt;
&lt;h2&gt;
  
  
  Time for release ?
&lt;/h2&gt;

&lt;p&gt;Ok so your greeter is now ready for its first release ! Lets take advantage of our strict commit message policy to have a nice changelog ! standard-version will help us do so &lt;br&gt;
&lt;code&gt;npm i --save-dev standard-version&lt;/code&gt;&lt;br&gt;
and a release script : &lt;code&gt;"release": "standard-version"&lt;/code&gt;&lt;br&gt;
finally run &lt;code&gt;npm run release -- --first-release&lt;/code&gt; to do your... first release !&lt;/p&gt;
&lt;h1&gt;
  
  
  automate it, noob !
&lt;/h1&gt;

&lt;p&gt;using github actions because those are pretty neat. create a &lt;code&gt;.github/workflows/&lt;/code&gt; directory to setup those actions.&lt;/p&gt;
&lt;h2&gt;
  
  
  auto test on commit
&lt;/h2&gt;

&lt;p&gt;This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node&lt;br&gt;
&lt;a href="https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions"&gt;For more information&lt;/a&gt;&lt;br&gt;
&lt;code&gt;node.js.yml&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Node.js CI&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;12.x&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;14.x&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use Node.js ${{ matrix.node-version }}&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v1&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ matrix.node-version }}&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run build --if-present&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  auto publish on release
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npmPublish.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish package on npm&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;release&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;created&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;publish-npm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v1&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;
          &lt;span class="na"&gt;registry-url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://registry.npmjs.org/&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cache node modules&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/cache@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~/.npm&lt;/span&gt; &lt;span class="c1"&gt;# npm cache files are stored in `~/.npm` on Linux/macOS&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}&lt;/span&gt;
          &lt;span class="na"&gt;restore-keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;${{ runner.os }}-build-${{ env.cache-name }}-&lt;/span&gt;
            &lt;span class="s"&gt;${{ runner.os }}-build-&lt;/span&gt;
            &lt;span class="s"&gt;${{ runner.os }}-&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;if [ ${{ github.event.release.action }} = "prereleased" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;npm publish --tag beta&lt;/span&gt;
          &lt;span class="s"&gt;else&lt;/span&gt;
            &lt;span class="s"&gt;npm publish&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;NODE_AUTH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{secrets.npm_token}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;NPM_TOKEN&lt;/code&gt; is a &lt;strong&gt;repository secret&lt;/strong&gt; holding an access token with publish rights from npm. get your own at &lt;a href="https://www.npmjs.com/settings/%7BYOUR_USER%7D/tokens"&gt;https://www.npmjs.com/settings/{YOUR_USER}/tokens&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  fun stuff
&lt;/h1&gt;

&lt;p&gt;haha you whish&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Premiers pas avec AutoHotkey</title>
      <dc:creator>Marceau "XioRcaL" Lacroix</dc:creator>
      <pubDate>Wed, 06 Nov 2019 14:58:13 +0000</pubDate>
      <link>https://dev.to/avalon-lab/premiers-pas-avec-autohotkey-4ffg</link>
      <guid>https://dev.to/avalon-lab/premiers-pas-avec-autohotkey-4ffg</guid>
      <description>&lt;h2&gt;
  
  
  Trop long / Pas lu
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Avalon-Lab/tooling/tree/master/akh_scripts/show_my_console"&gt;le code est là&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Problématique de base
&lt;/h2&gt;

&lt;p&gt;Suite à changement d'environnement de boulot (poste de dev linux -&amp;gt; windows) j'ai besoin de retrouver certaines habitudes et notamment&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6jk9ZbaF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://extensions.gnome.org/extension-data/screenshots/screenshot_1411_8MWYILj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6jk9ZbaF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://extensions.gnome.org/extension-data/screenshots/screenshot_1411_8MWYILj.png" alt="Tilix quake like console"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oui je fais partie de ces gens qui ont besoin d'un terminal à portée d'une touche de clavier. Sauf qu’apparemment sous Windows ce fonctionnement n'existe pas. Depuis j'ai appris que c'était plus ou moins possible, voir la section alternative en bas de l'article.&lt;/p&gt;

&lt;h2&gt;
  
  
  C'est quoi AutoHotkey ?
&lt;/h2&gt;

&lt;p&gt;D'après leur site web c'est &lt;code&gt;The ultimate automation scripting language for Windows&lt;/code&gt;. Ça a l'air plutôt cool présenté comme ça ! Et effectivement ahk permet aussi bien de simuler un clic souris que d'utiliser des dll windows. Sur le papier ça devrait permettre de résoudre le problème.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le script
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cibler la touche de déclenchement
&lt;/h3&gt;

&lt;p&gt;En temps normal c'est assez facile avec akh, il suffit d'écrire &lt;code&gt;Matouche::&lt;/code&gt; pour déclencher une action&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;j::
MsgBox, "vous avez appuyé sur 'j'"
return
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Sauf que moi j'ai envie d'utiliser ma touche ². Naïvement j'ai essayé&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;²::
MsgBox, "vous avez appuyé sur '²'"
return
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;qui produit un joli &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HWfMUT5y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2cu25efrbfjpvz5rchkj.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HWfMUT5y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2cu25efrbfjpvz5rchkj.PNG" alt="Erreur"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il faut donc trouver un moyen d'identifier le code correspondant à la touche; la &lt;a href="https://www.autohotkey.com/docs/KeyList.htm#SpecialKeys"&gt;doc ahk&lt;/a&gt; sur le sujet est assez claire; il suffit d'ajouter &lt;code&gt;#InstallKeybdHook&lt;/code&gt; dans mon script et de regarder les logs. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f-0CNUtk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/29csvafmd7jkcv26my0c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f-0CNUtk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/29csvafmd7jkcv26my0c.png" alt="capture des frappes clavier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le code de la touche ² est donc &lt;code&gt;SC029&lt;/code&gt;; essayons ça :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SC029::
MsgBox, "vous avez appuyé sur '²'"
return
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;et ça marche! (il faut utiliser un encodage utf8 avec BOM pour avoir les caractères spéciaux affichés correctement)&lt;/p&gt;

&lt;h3&gt;
  
  
  La base : basculer sur une fenêtre existante
&lt;/h3&gt;

&lt;p&gt;Maintenant il faut identifier la fenêtre cible et la rendre active. Pour ça le mode 'Window Spy' est très pratique, il permet d'afficher le titre, la classe, l'executable et le pid de la fenêtre active.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CUj4or5t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/y2jkit0jtg69daz2npcr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CUj4or5t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/y2jkit0jtg69daz2npcr.png" alt="window spy du terminal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L'algo qu'on cherche à implémenter en pseudo code donnerait quelque chose comme&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Si fenêtre active = terminal
  minimiser
  réactiver ancienne fenêtre
sinon
  sauvegarder ancienne fenêtre
  activer la fenêtre terminal

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



&lt;p&gt;Pour ça on va se servir des fonctions ahk suivantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.autohotkey.com/docs/commands/WinActive.htm"&gt;WinActive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.autohotkey.com/docs/commands/WinMinimize.htm"&gt;WinMinimize&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.autohotkey.com/docs/commands/WinActivate.htm"&gt;WinActivate&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;previous_active := ""

SC029::
  if WinActive("ahk_exe WindowsTerminal.exe") {
      WinMinimize, ahk_exe WindowsTerminal.exe
      if (previous_active) {
          WinActivate, ahk_id %previous_active%
      }
  } else {
      previous_active := WinExist("A")
      WinActivate, ahk_exe WindowsTerminal.exe
  }
return
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Et si mon terminal est fermé ?
&lt;/h3&gt;

&lt;p&gt;Là encore c'est assez simple, &lt;code&gt;run, C:\PATH_TO_MY_APP\app.exe&lt;/code&gt; devrait faire le job. Mais comme mon terminal vient du &lt;a href="https://www.microsoft.com/fr-fr/p/windows-terminal-preview/9n0dx20hk701"&gt;windows store&lt;/a&gt;, je n'ai pas de lien direct pour l’exécutable. J'ai trouvé une astuce qui consiste à créer un raccourci pour l'appli en question et référencer le raccourci dans le script. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Win + R &lt;code&gt;shell:appsFolder&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;clic droit créer un raccourci&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run, path\to\raccourci&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;previous_active := ""

SC029::
if WinExist("ahk_exe WindowsTerminal.exe") {
    if WinActive("ahk_exe WindowsTerminal.exe") {
        WinMinimize, ahk_exe WindowsTerminal.exe
        if (previous_active) {
            WinActivate, ahk_id %previous_active%
        }
    } else {
        previous_active := WinExist("A")
        WinActivate, ahk_exe WindowsTerminal.exe
    }
} else{
    previous_active := WinExist("A")
    run, C:\PATH_TO\terminal_shortcut
}
return
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Pratique, mais si j'ai besoin de taper un ² ?
&lt;/h3&gt;

&lt;p&gt;Ajoutons un deuxième raccourci : Maj + ²&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+SC029::
Send ²
return
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;La liste des modificateurs est &lt;a href="https://www.autohotkey.com/docs/Tutorial.htm#s21"&gt;ici&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;une icône plus jolie :
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I_Icon = C:\PATH_TO\icon.ico
IfExist, %I_Icon%
  Menu, Tray, Icon, %I_Icon%
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Alernatives
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;En épinglant une appli à la barre des taches il est possible de reproduire l'ouverture/basculement. Il suffit d'appuyer sur Win + 1..9 correspondant au "numéro" de l'app dans la barre des taches&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>autohotkey</category>
      <category>beginners</category>
      <category>french</category>
    </item>
  </channel>
</rss>
