<?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: Titouan B</title>
    <description>The latest articles on DEV Community by Titouan B (@nightbr).</description>
    <link>https://dev.to/nightbr</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%2F192584%2Feaa50b9a-e2b7-4cd7-bf73-ddd8d07a92e0.jpg</url>
      <title>DEV Community: Titouan B</title>
      <link>https://dev.to/nightbr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nightbr"/>
    <language>en</language>
    <item>
      <title>🐯 Local HTTPS for NestJS app (api) in Nx workspace</title>
      <dc:creator>Titouan B</dc:creator>
      <pubDate>Thu, 08 Oct 2020 16:02:39 +0000</pubDate>
      <link>https://dev.to/nightbr/local-https-for-nestjs-app-api-in-nx-workspace-54n2</link>
      <guid>https://dev.to/nightbr/local-https-for-nestjs-app-api-in-nx-workspace-54n2</guid>
      <description>&lt;p&gt;Hey, welcome back in this post series where we will see how to setup a &lt;strong&gt;full HTTPS development environment&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;In this post, we will setup local HTTPS for NestJS app (api) in Nx workspace.&lt;/p&gt;

&lt;p&gt;If you don't have generated your certificate with &lt;a href="https://mkcert.dev" rel="noopener noreferrer"&gt;mkcert&lt;/a&gt;, I recommand you read the first post of this series. → &lt;a href="https://dev.to/nightbr/full-https-ssl-development-environment-4dam"&gt;link&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Nx?
&lt;/h2&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyadzz24jpk1553jjb0bk.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyadzz24jpk1553jjb0bk.png" alt="nx"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://nx.dev/" rel="noopener noreferrer"&gt;Nx&lt;/a&gt;&lt;/strong&gt; is a set of extensible dev tools for monorepos, which helps you manage your projects at any scale. It provides great integration with major framework such as Angular, React, Nestframework, Express, ionic, ...&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Nx&lt;/strong&gt; use the &lt;code&gt;angular-cli&lt;/code&gt; under the hood!&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the project workspace
&lt;/h2&gt;

&lt;p&gt;Creating a new empty workspace&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="nv"&gt;$ &lt;/span&gt;npx create-nx-workspace
npx : 179 installé&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; en 7.547s
? Workspace name &lt;span class="o"&gt;(&lt;/span&gt;e.g., org name&lt;span class="o"&gt;)&lt;/span&gt;     myorg
? What to create &lt;span class="k"&gt;in &lt;/span&gt;the new workspace empty             &lt;span class="o"&gt;[&lt;/span&gt;an empty workspace with a layout tha
t works best &lt;span class="k"&gt;for &lt;/span&gt;building apps]
? CLI to power the Nx workspace       Nx           &lt;span class="o"&gt;[&lt;/span&gt;Recommended &lt;span class="k"&gt;for &lt;/span&gt;all applications &lt;span class="o"&gt;(&lt;/span&gt;React, 
Node, etc..&lt;span class="o"&gt;)]&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;🗒️ If you already have an Nx workspace, you can skip these steps.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then, we will install the NestJS schematics:&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;-D&lt;/span&gt; @nrwl/nest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now, we will generate a new NestJS application called &lt;code&gt;nest-api&lt;/code&gt; (change the name with your api name).&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nx generate @nrwl/nest:application &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nest-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Start serving your app with &lt;code&gt;nx serve nest-api&lt;/code&gt; 🎉&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fd8iiqj6ja0smurhfaddo.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fd8iiqj6ja0smurhfaddo.png" alt="http"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🗒️ Look at the NestJS Nx plugin documentation to see more options → &lt;a href="https://nx.dev/latest/angular/plugins/nest/overview" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting up HTTPS
&lt;/h2&gt;

&lt;p&gt;From the first post of this series, I will assume that you have generated your certificate at location &lt;code&gt;myorg/dev-stack/certs/local-cert.pem&lt;/code&gt; &amp;amp; &lt;code&gt;myorg/dev-stack/certs/local-key.pem&lt;/code&gt;. Don't hesitate to go back to the first post to use mkcert and generate your certificate.&lt;/p&gt;

&lt;p&gt;We will edit the NestJS server to handle HTTPS requests.&lt;/p&gt;

&lt;p&gt;Open and edit &lt;code&gt;myorg/apps/nest-api/src/main.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;Logger&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;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NestFactory&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;@nestjs/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;fs&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;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;path&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;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AppModule&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;./app/app.module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ssl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SSL&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;'&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="kc"&gt;false&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;httpsOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;keyPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SSL_KEY_PATH&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;certPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SSL_CERT_PATH&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;httpsOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;keyPath&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="na"&gt;cert&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;certPath&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;NestFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AppModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;httpsOptions&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HOSTNAME&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;hostname&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ssl&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;s&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="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;://&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;Logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Listening at &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;address&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="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We will now add &lt;code&gt;.local.env&lt;/code&gt; with the configuration.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3334&lt;/span&gt;
&lt;span class="nx"&gt;HOSTNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;
&lt;span class="nx"&gt;SSL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;SSL_KEY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../../dev-stack/certs/local-key.pem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;SSL_CERT_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../../dev-stack/certs/local-cert.pem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;🗒️ Here is some magic tricks done by Nx which will inject automatically &lt;code&gt;.local.env&lt;/code&gt; when we will run the serve command. &lt;/p&gt;

&lt;p&gt;By default, Nx will load any environment variables you place in the following files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;workspaceRoot/apps/my-app/.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workspaceRoot/apps/my-app/.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workspaceRoot/.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workspaceRoot/.env&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can see more on how Nx manage environment variables → &lt;a href="https://nx.dev/latest/angular/cli/overview#loading-environment-variables" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠️ IMPORTANT: the relative path to the certificate is from the dist folder (i.e. &lt;code&gt;dist/apps/nest-api&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Now serve the app with the new configuration:&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="nv"&gt;$ &lt;/span&gt;nx serve nest-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can open &lt;a href="https://dev.local:3334/" rel="noopener noreferrer"&gt;https://dev.local:3334/&lt;/a&gt; which is secured with a valid certificate 🔐🎉&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0p49kv14qewmb8i924zq.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0p49kv14qewmb8i924zq.png" alt="https"&gt;&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwxleecpettdzkubx8l5b.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwxleecpettdzkubx8l5b.png" alt="certificate"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to change any configuration in environment variables, but don't forget to regenerate a new certificate with mkcert of you change the domain name ⚠️&lt;/p&gt;

&lt;p&gt;See you in the next post!&lt;/p&gt;
&lt;h1&gt;
  
  
  Github repository
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Nightbr" rel="noopener noreferrer"&gt;
        Nightbr
      &lt;/a&gt; / &lt;a href="https://github.com/Nightbr/full-https-development-environment" rel="noopener noreferrer"&gt;
        full-https-development-environment
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A full development environment in HTTPS with a valid certificate for your local development domain with mkcert, Nx workspace, angular, reactjs, nestjs, express, docker, traefik.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Myorg&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This project was generated using &lt;a href="https://nx.dev" rel="nofollow noopener noreferrer"&gt;Nx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-logo.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnrwl%2Fnx%2Fmaster%2Fimages%2Fnx-logo.png" width="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔎 &lt;strong&gt;Nx is a set of Extensible Dev Tools for Monorepos.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Adding capabilities to your workspace&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Nx supports many plugins which add capabilities for developing different types of applications and different tools.&lt;/p&gt;

&lt;p&gt;These capabilities include generating applications, libraries, etc as well as the devtools to test, and build projects as well.&lt;/p&gt;

&lt;p&gt;Below are our core plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://reactjs.org" rel="nofollow noopener noreferrer"&gt;React&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/react&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Web (no framework frontends)

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/web&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://angular.io" rel="nofollow noopener noreferrer"&gt;Angular&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/angular&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://nestjs.com" rel="nofollow noopener noreferrer"&gt;Nest&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/nest&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://expressjs.com" rel="nofollow noopener noreferrer"&gt;Express&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/express&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://nodejs.org" rel="nofollow noopener noreferrer"&gt;Node&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/node&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;There are also many &lt;a href="https://nx.dev/nx-community" rel="nofollow noopener noreferrer"&gt;community plugins&lt;/a&gt; you could add.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Generate an application&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;nx g @nrwl/react:app my-app&lt;/code&gt; to generate an application.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can use any of the plugins above to generate applications as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When using Nx, you can create multiple applications and libraries in the same workspace.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Generate a library&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;nx&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Nightbr/full-https-development-environment" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>monorepo</category>
      <category>nx</category>
      <category>security</category>
      <category>nestjs</category>
    </item>
    <item>
      <title>⏩ Local HTTPS for Express app (api) in Nx workspace</title>
      <dc:creator>Titouan B</dc:creator>
      <pubDate>Thu, 08 Oct 2020 15:45:52 +0000</pubDate>
      <link>https://dev.to/nightbr/local-https-for-express-app-api-in-nx-workspace-4gk0</link>
      <guid>https://dev.to/nightbr/local-https-for-express-app-api-in-nx-workspace-4gk0</guid>
      <description>&lt;p&gt;Hey, welcome back in this post series where we will see how to setup a &lt;strong&gt;full HTTPS development environment&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;In this post, we will setup local HTTPS for Express app (api) in Nx workspace.&lt;/p&gt;

&lt;p&gt;If you don't have generated your certificate with &lt;a href="https://mkcert.dev" rel="noopener noreferrer"&gt;mkcert&lt;/a&gt;, I recommand you read the first post of this series. → &lt;a href="https://dev.to/nightbr/full-https-ssl-development-environment-4dam"&gt;link&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Nx?
&lt;/h2&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1tj6eb5sgw977llxq4zh.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1tj6eb5sgw977llxq4zh.png" alt="nx"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://nx.dev/" rel="noopener noreferrer"&gt;Nx&lt;/a&gt;&lt;/strong&gt; is a set of extensible dev tools for monorepos, which helps you manage your projects at any scale. It provides great integration with major framework such as Angular, React, Nestframework, Express, ionic, ...&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Nx&lt;/strong&gt; use the &lt;code&gt;angular-cli&lt;/code&gt; under the hood!&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the project workspace
&lt;/h2&gt;

&lt;p&gt;Creating a new empty workspace&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="nv"&gt;$ &lt;/span&gt;npx create-nx-workspace
npx : 179 installé&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; en 7.547s
? Workspace name &lt;span class="o"&gt;(&lt;/span&gt;e.g., org name&lt;span class="o"&gt;)&lt;/span&gt;     myorg
? What to create &lt;span class="k"&gt;in &lt;/span&gt;the new workspace empty             &lt;span class="o"&gt;[&lt;/span&gt;an empty workspace with a layout tha
t works best &lt;span class="k"&gt;for &lt;/span&gt;building apps]
? CLI to power the Nx workspace       Nx           &lt;span class="o"&gt;[&lt;/span&gt;Recommended &lt;span class="k"&gt;for &lt;/span&gt;all applications &lt;span class="o"&gt;(&lt;/span&gt;React, 
Node, etc..&lt;span class="o"&gt;)]&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;🗒️ If you already have an Nx workspace, you can skip these steps.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then, we will install the Express schematics:&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;-D&lt;/span&gt; @nrwl/express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now, we will generate a new Express application called &lt;code&gt;express-api&lt;/code&gt; (change the name with your api name).&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nx generate @nrwl/express:application &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;express-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Start serving your app with &lt;code&gt;nx serve express-api&lt;/code&gt; 🎉&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff4rfwidkfl8s8zjkfgt8.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff4rfwidkfl8s8zjkfgt8.png" alt="http"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🗒️ Look at the Express Nx plugin documentation to see more options → &lt;a href="https://nx.dev/latest/node/plugins/express/overview" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting up HTTPS
&lt;/h2&gt;

&lt;p&gt;From the first post of this series, I will assume that you have generated your certificate at location &lt;code&gt;myorg/dev-stack/certs/local-cert.pem&lt;/code&gt; &amp;amp; &lt;code&gt;myorg/dev-stack/certs/local-key.pem&lt;/code&gt;. Don't hesitate to go back to the first post to use mkcert and generate your certificate.&lt;/p&gt;

&lt;p&gt;We will edit the express server to handle HTTPS requests.&lt;/p&gt;

&lt;p&gt;Open and edit &lt;code&gt;myorg/apps/express-api/src/main.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;express&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;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;https&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;https&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;fs&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;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;path&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;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api&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;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Welcome to express-api!&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HOSTNAME&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ssl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SSL&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;'&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="kc"&gt;false&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;keyPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SSL_KEY_PATH&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;certPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SSL_CERT_PATH&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;httpsOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;keyPath&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="na"&gt;cert&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;certPath&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;httpsOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening at https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api`&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening at http://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api`&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="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&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;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We will now add &lt;code&gt;.local.env&lt;/code&gt; with the configuration.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3333&lt;/span&gt;
&lt;span class="nx"&gt;HOSTNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;
&lt;span class="nx"&gt;SSL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;SSL_KEY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../../dev-stack/certs/local-key.pem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;SSL_CERT_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../../dev-stack/certs/local-cert.pem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;🗒️ Here is some magic tricks done by Nx which will inject automatically &lt;code&gt;.local.env&lt;/code&gt; when we will run the serve command. &lt;/p&gt;

&lt;p&gt;By default, Nx will load any environment variables you place in the following files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;workspaceRoot/apps/my-app/.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workspaceRoot/apps/my-app/.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workspaceRoot/.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workspaceRoot/.env&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can see more on how Nx manage environment variables → &lt;a href="https://nx.dev/latest/angular/cli/overview#loading-environment-variables" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠️ IMPORTANT: the relative path to the certificate is from the dist folder (i.e. &lt;code&gt;dist/apps/express-api&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Now serve the app with the new configuration:&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="nv"&gt;$ &lt;/span&gt;nx serve express-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can open &lt;a href="https://dev.local:3333/api" rel="noopener noreferrer"&gt;https://dev.local:3333/api&lt;/a&gt; which is secured with a valid certificate 🔐🎉&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffwolpbrt8jdn4dr7elvi.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffwolpbrt8jdn4dr7elvi.png" alt="https"&gt;&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fep9pjwgbno3g8bzbh7tw.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fep9pjwgbno3g8bzbh7tw.png" alt="certificate"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to change any configuration in environment variables, but don't forget to regenerate a new certificate with mkcert of you change the domain name ⚠️&lt;/p&gt;

&lt;p&gt;See you in the next post!&lt;/p&gt;
&lt;h1&gt;
  
  
  Github repository
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Nightbr" rel="noopener noreferrer"&gt;
        Nightbr
      &lt;/a&gt; / &lt;a href="https://github.com/Nightbr/full-https-development-environment" rel="noopener noreferrer"&gt;
        full-https-development-environment
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A full development environment in HTTPS with a valid certificate for your local development domain with mkcert, Nx workspace, angular, reactjs, nestjs, express, docker, traefik.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Myorg&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This project was generated using &lt;a href="https://nx.dev" rel="nofollow noopener noreferrer"&gt;Nx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-logo.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnrwl%2Fnx%2Fmaster%2Fimages%2Fnx-logo.png" width="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔎 &lt;strong&gt;Nx is a set of Extensible Dev Tools for Monorepos.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Adding capabilities to your workspace&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Nx supports many plugins which add capabilities for developing different types of applications and different tools.&lt;/p&gt;

&lt;p&gt;These capabilities include generating applications, libraries, etc as well as the devtools to test, and build projects as well.&lt;/p&gt;

&lt;p&gt;Below are our core plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://reactjs.org" rel="nofollow noopener noreferrer"&gt;React&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/react&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Web (no framework frontends)

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/web&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://angular.io" rel="nofollow noopener noreferrer"&gt;Angular&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/angular&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://nestjs.com" rel="nofollow noopener noreferrer"&gt;Nest&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/nest&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://expressjs.com" rel="nofollow noopener noreferrer"&gt;Express&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/express&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://nodejs.org" rel="nofollow noopener noreferrer"&gt;Node&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/node&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;There are also many &lt;a href="https://nx.dev/nx-community" rel="nofollow noopener noreferrer"&gt;community plugins&lt;/a&gt; you could add.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Generate an application&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;nx g @nrwl/react:app my-app&lt;/code&gt; to generate an application.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can use any of the plugins above to generate applications as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When using Nx, you can create multiple applications and libraries in the same workspace.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Generate a library&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;nx&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Nightbr/full-https-development-environment" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>monorepo</category>
      <category>nx</category>
      <category>security</category>
      <category>express</category>
    </item>
    <item>
      <title>⚛️ Local HTTPS for React app in Nx workspace</title>
      <dc:creator>Titouan B</dc:creator>
      <pubDate>Thu, 08 Oct 2020 14:54:23 +0000</pubDate>
      <link>https://dev.to/nightbr/local-https-for-react-app-in-nx-workspace-4ef1</link>
      <guid>https://dev.to/nightbr/local-https-for-react-app-in-nx-workspace-4ef1</guid>
      <description>&lt;p&gt;Hey, welcome back in this post series where we will see how to setup a &lt;strong&gt;full HTTPS development environment&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;In this post, we will setup local HTTPS for React app in Nx workspace.&lt;/p&gt;

&lt;p&gt;If you don't have generated your certificate with &lt;a href="https://mkcert.dev" rel="noopener noreferrer"&gt;mkcert&lt;/a&gt;, I recommand you read the first post of this series. → &lt;a href="https://dev.to/nightbr/full-https-ssl-development-environment-4dam"&gt;link&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Nx?
&lt;/h2&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdroj114ob53e52l2yiqt.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdroj114ob53e52l2yiqt.png" alt="nx"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://nx.dev/" rel="noopener noreferrer"&gt;Nx&lt;/a&gt;&lt;/strong&gt; is a set of extensible dev tools for monorepos, which helps you manage your projects at any scale. It provides great integration with major framework such as Angular, React, Nestframework, Express, ionic, ...&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Nx&lt;/strong&gt; use the &lt;code&gt;angular-cli&lt;/code&gt; under the hood!&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the project workspace
&lt;/h2&gt;

&lt;p&gt;Creating a new empty workspace&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;npx create-nx-workspace
npx : 179 installé&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; en 7.547s
? Workspace name &lt;span class="o"&gt;(&lt;/span&gt;e.g., org name&lt;span class="o"&gt;)&lt;/span&gt;     myorg
? What to create &lt;span class="k"&gt;in &lt;/span&gt;the new workspace empty             &lt;span class="o"&gt;[&lt;/span&gt;an empty workspace with a layout tha
t works best &lt;span class="k"&gt;for &lt;/span&gt;building apps]
? CLI to power the Nx workspace       Nx           &lt;span class="o"&gt;[&lt;/span&gt;Recommended &lt;span class="k"&gt;for &lt;/span&gt;all applications &lt;span class="o"&gt;(&lt;/span&gt;React, 
Node, etc..&lt;span class="o"&gt;)]&lt;/span&gt;
...


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

&lt;/div&gt;
&lt;p&gt;&lt;em&gt;🗒️ If you already have an Nx workspace, you can skip these steps.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then, we will install the Reactjs schematics:&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;-D&lt;/span&gt; @nrwl/react


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

&lt;/div&gt;
&lt;p&gt;Now, we will generate a new Reactjs application called &lt;code&gt;react-app&lt;/code&gt; (change the name with your app name).&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

nx generate @nrwl/react:application &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;react-app


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

&lt;/div&gt;
&lt;p&gt;Choose your settings such as &lt;code&gt;stylesheet format&lt;/code&gt;, &lt;code&gt;routing&lt;/code&gt;, ...&lt;/p&gt;

&lt;p&gt;Start serving your app with &lt;code&gt;nx serve react-app&lt;/code&gt; 🎉&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftfo25c1lv1sni5vzffo6.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftfo25c1lv1sni5vzffo6.png" alt="http"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🗒️ Look at the Reactjs Nx plugin documentation to see more options → &lt;a href="https://nx.dev/latest/angular/plugins/react/overview" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting up HTTPS
&lt;/h2&gt;

&lt;p&gt;From the first post of this series, I will assume that you have generated your certificate at location &lt;code&gt;myorg/dev-stack/certs/local-cert.pem&lt;/code&gt; &amp;amp; &lt;code&gt;myorg/dev-stack/certs/local-key.pem&lt;/code&gt;. Don't hesitate to go back to the first post to use mkcert and generate your certificate.&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;workspace.json&lt;/code&gt;, search for your app name (here &lt;code&gt;react-app&lt;/code&gt;). Under this, look for the &lt;code&gt;serve&lt;/code&gt; object and &lt;code&gt;options&lt;/code&gt;. We will add the ssl configuration under &lt;code&gt;"browserTarget": "react-app:build",&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The serve object in the &lt;code&gt;workspace.json&lt;/code&gt; should look like this:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serve"&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;"builder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@nrwl/web:dev-server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"options"&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;"buildTarget"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"react-app:build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev.local"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"ssl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"sslKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dev-stack/certs/local-key.pem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"sslCert"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dev-stack/certs/local-cert.pem"&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;"configurations"&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;"production"&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;"buildTarget"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"react-app:build:production"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;
&lt;p&gt;Now save and serve the app:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;nx serve react-app

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; nx run react-app:serve 
&lt;span class="k"&gt;**&lt;/span&gt;
Web Development Server is listening at https://dev.local:4200/
&lt;span class="k"&gt;**&lt;/span&gt;
Starting &lt;span class="nb"&gt;type &lt;/span&gt;checking service...
Using 14 workers with 2048MB memory limit
ℹ ｢wds｣: Project is running at https://dev.local:4200/
ℹ ｢wds｣: webpack output is served from /
ℹ ｢wds｣: 404s will fallback to //index.html
No &lt;span class="nb"&gt;type &lt;/span&gt;errors found
Version: typescript 4.0.3
Time: 4026ms
Hash: cc02edd4220bb47802d9
Built at: 2020-10-08 16:49:42
Entrypoint main &lt;span class="o"&gt;[&lt;/span&gt;big] &lt;span class="o"&gt;=&lt;/span&gt; runtime.js runtime.js.map vendor.js vendor.js.map main.js main.js.map
Entrypoint polyfills &lt;span class="o"&gt;[&lt;/span&gt;big] &lt;span class="o"&gt;=&lt;/span&gt; runtime.js runtime.js.map polyfills.js polyfills.js.map
chunk &lt;span class="o"&gt;{&lt;/span&gt;main&lt;span class="o"&gt;}&lt;/span&gt; main.js, main.js.map &lt;span class="o"&gt;(&lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt; 359 KiB &lt;span class="o"&gt;={&lt;/span&gt;runtime&lt;span class="o"&gt;}=&lt;/span&gt; &lt;span class="o"&gt;={&lt;/span&gt;vendor&lt;span class="o"&gt;}=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;initial] &lt;span class="o"&gt;[&lt;/span&gt;rendered]
chunk &lt;span class="o"&gt;{&lt;/span&gt;polyfills&lt;span class="o"&gt;}&lt;/span&gt; polyfills.js, polyfills.js.map &lt;span class="o"&gt;(&lt;/span&gt;polyfills&lt;span class="o"&gt;)&lt;/span&gt; 569 KiB &lt;span class="o"&gt;={&lt;/span&gt;runtime&lt;span class="o"&gt;}=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;initial] &lt;span class="o"&gt;[&lt;/span&gt;rendered]
chunk &lt;span class="o"&gt;{&lt;/span&gt;runtime&lt;span class="o"&gt;}&lt;/span&gt; runtime.js, runtime.js.map &lt;span class="o"&gt;(&lt;/span&gt;runtime&lt;span class="o"&gt;)&lt;/span&gt; 0 bytes &lt;span class="o"&gt;={&lt;/span&gt;main&lt;span class="o"&gt;}=&lt;/span&gt; &lt;span class="o"&gt;={&lt;/span&gt;polyfills&lt;span class="o"&gt;}=&lt;/span&gt; &lt;span class="o"&gt;={&lt;/span&gt;vendor&lt;span class="o"&gt;}=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;entry] &lt;span class="o"&gt;[&lt;/span&gt;rendered]
chunk &lt;span class="o"&gt;{&lt;/span&gt;vendor&lt;span class="o"&gt;}&lt;/span&gt; vendor.js, vendor.js.map &lt;span class="o"&gt;(&lt;/span&gt;vendor&lt;span class="o"&gt;)&lt;/span&gt; 1.09 MiB &lt;span class="o"&gt;={&lt;/span&gt;main&lt;span class="o"&gt;}=&lt;/span&gt; &lt;span class="o"&gt;={&lt;/span&gt;runtime&lt;span class="o"&gt;}=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;initial] &lt;span class="o"&gt;[&lt;/span&gt;rendered] &lt;span class="nb"&gt;split &lt;/span&gt;chunk &lt;span class="o"&gt;(&lt;/span&gt;cache group: vendor&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;name: vendor&lt;span class="o"&gt;)&lt;/span&gt;
ℹ ｢wdm｣: Compiled successfully.



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

&lt;/div&gt;
&lt;p&gt;You can open &lt;a href="https://dev.local:4200" rel="noopener noreferrer"&gt;https://dev.local:4200&lt;/a&gt; which is secured with a valid certificate 🔐🎉&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fffot8s7ibszv60p5evlt.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fffot8s7ibszv60p5evlt.png" alt="https"&gt;&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnyt6mnd878uxr96x8l6s.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnyt6mnd878uxr96x8l6s.png" alt="certificate"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to change any configuration on the options, but don't forget to regenerate a new certificate with mkcert of you change the domain name ⚠️&lt;/p&gt;

&lt;p&gt;See you in the next post!&lt;/p&gt;
&lt;h1&gt;
  
  
  Github repository
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Nightbr" rel="noopener noreferrer"&gt;
        Nightbr
      &lt;/a&gt; / &lt;a href="https://github.com/Nightbr/full-https-development-environment" rel="noopener noreferrer"&gt;
        full-https-development-environment
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A full development environment in HTTPS with a valid certificate for your local development domain with mkcert, Nx workspace, angular, reactjs, nestjs, express, docker, traefik.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Myorg&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This project was generated using &lt;a href="https://nx.dev" rel="nofollow noopener noreferrer"&gt;Nx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-logo.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnrwl%2Fnx%2Fmaster%2Fimages%2Fnx-logo.png" width="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔎 &lt;strong&gt;Nx is a set of Extensible Dev Tools for Monorepos.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Adding capabilities to your workspace&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Nx supports many plugins which add capabilities for developing different types of applications and different tools.&lt;/p&gt;

&lt;p&gt;These capabilities include generating applications, libraries, etc as well as the devtools to test, and build projects as well.&lt;/p&gt;

&lt;p&gt;Below are our core plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://reactjs.org" rel="nofollow noopener noreferrer"&gt;React&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/react&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Web (no framework frontends)

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/web&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://angular.io" rel="nofollow noopener noreferrer"&gt;Angular&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/angular&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://nestjs.com" rel="nofollow noopener noreferrer"&gt;Nest&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/nest&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://expressjs.com" rel="nofollow noopener noreferrer"&gt;Express&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/express&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://nodejs.org" rel="nofollow noopener noreferrer"&gt;Node&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/node&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;There are also many &lt;a href="https://nx.dev/nx-community" rel="nofollow noopener noreferrer"&gt;community plugins&lt;/a&gt; you could add.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Generate an application&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;nx g @nrwl/react:app my-app&lt;/code&gt; to generate an application.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can use any of the plugins above to generate applications as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When using Nx, you can create multiple applications and libraries in the same workspace.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Generate a library&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;nx&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Nightbr/full-https-development-environment" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>monorepo</category>
      <category>nx</category>
      <category>react</category>
      <category>security</category>
    </item>
    <item>
      <title>🅰️ Local HTTPS for Angular app in Nx workspace (or angular cli)</title>
      <dc:creator>Titouan B</dc:creator>
      <pubDate>Thu, 08 Oct 2020 13:53:09 +0000</pubDate>
      <link>https://dev.to/nightbr/local-https-for-angular-app-in-nx-workspace-or-angular-cli-6ek</link>
      <guid>https://dev.to/nightbr/local-https-for-angular-app-in-nx-workspace-or-angular-cli-6ek</guid>
      <description>&lt;p&gt;Hey, welcome back in this post series where we will see how to setup a &lt;strong&gt;full HTTPS development environment&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;In this post, we will setup local HTTPS for Angular app in Nx workspace (or angular cli).&lt;/p&gt;

&lt;p&gt;If you don't have generated your certificate with &lt;a href="https://mkcert.dev" rel="noopener noreferrer"&gt;mkcert&lt;/a&gt;, I recommand you read the first post of this series. → &lt;a href="https://dev.to/nightbr/full-https-ssl-development-environment-4dam"&gt;link&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Nx?
&lt;/h2&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fif40pr4bg3eu6d9k28zp.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fif40pr4bg3eu6d9k28zp.png" alt="nx-logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://nx.dev/" rel="noopener noreferrer"&gt;Nx&lt;/a&gt;&lt;/strong&gt; is a set of extensible dev tools for monorepos, which helps you manage your projects at any scale. It provides great integration with major framework such as Angular, React, Nestframework, Express, ionic, ...&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Nx&lt;/strong&gt; use the &lt;code&gt;angular-cli&lt;/code&gt; under the hood!&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the project workspace
&lt;/h2&gt;

&lt;p&gt;Creating a new empty workspace&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="nv"&gt;$ &lt;/span&gt;npx create-nx-workspace
npx : 179 installé&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; en 7.547s
? Workspace name &lt;span class="o"&gt;(&lt;/span&gt;e.g., org name&lt;span class="o"&gt;)&lt;/span&gt;     myorg
? What to create &lt;span class="k"&gt;in &lt;/span&gt;the new workspace empty             &lt;span class="o"&gt;[&lt;/span&gt;an empty workspace with a layout tha
t works best &lt;span class="k"&gt;for &lt;/span&gt;building apps]
? CLI to power the Nx workspace       Nx           &lt;span class="o"&gt;[&lt;/span&gt;Recommended &lt;span class="k"&gt;for &lt;/span&gt;all applications &lt;span class="o"&gt;(&lt;/span&gt;React, 
Node, etc..&lt;span class="o"&gt;)]&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;🗒️ If you already have an Nx workspace, you can skip these steps.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then, we will install the Angular schematics:&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;-D&lt;/span&gt; @nrwl/angular
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now, we will generate a new Angular application called &lt;code&gt;myapp&lt;/code&gt; (change the name with your app name).&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nx generate @nrwl/angular:application &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Choose your settings such as &lt;code&gt;stylesheet format&lt;/code&gt;, &lt;code&gt;routing&lt;/code&gt;, ...&lt;/p&gt;

&lt;p&gt;Start serving your app with &lt;code&gt;nx serve myapp&lt;/code&gt; 🎉&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6eyr7svtiy9y7njzzanh.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6eyr7svtiy9y7njzzanh.png" alt="angular-http"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🗒️ Look at the Angular Nx plugin documentation to see more options → &lt;a href="https://nx.dev/latest/angular/plugins/angular/overview" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting up HTTPS
&lt;/h2&gt;

&lt;p&gt;From the first post of this series, I will assume that you have generated your certificate at location &lt;code&gt;myorg/dev-stack/certs/local-cert.pem&lt;/code&gt; &amp;amp; &lt;code&gt;myorg/dev-stack/certs/local-key.pem&lt;/code&gt;. Don't hesitate to go back to the first post to use mkcert and generate your certificate.&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;workspace.json&lt;/code&gt; (or &lt;code&gt;angular.json&lt;/code&gt; with &lt;code&gt;angular-cli&lt;/code&gt;), search for your project name (here &lt;code&gt;myapp&lt;/code&gt;). Under this, look for the &lt;code&gt;serve&lt;/code&gt; object and &lt;code&gt;options&lt;/code&gt;. We will add the ssl configuration under &lt;code&gt;"browserTarget": "myapp:build",&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The serve object in the &lt;code&gt;workspace.json&lt;/code&gt; should look like this:&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="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serve"&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;"builder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@angular-devkit/build-angular:dev-server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"options"&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;"browserTarget"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"myapp:build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev.local"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"ssl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"sslKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dev-stack/certs/local-key.pem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"sslCert"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dev-stack/certs/local-cert.pem"&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;"configurations"&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;"production"&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;"browserTarget"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"myapp:build:production"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now save and serve the app:&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="nv"&gt;$ &lt;/span&gt;nx serve myapp

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; nx run myapp:serve 

chunk &lt;span class="o"&gt;{&lt;/span&gt;main&lt;span class="o"&gt;}&lt;/span&gt; main.js, main.js.map &lt;span class="o"&gt;(&lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt; 24.7 kB &lt;span class="o"&gt;[&lt;/span&gt;initial] &lt;span class="o"&gt;[&lt;/span&gt;rendered]
chunk &lt;span class="o"&gt;{&lt;/span&gt;polyfills&lt;span class="o"&gt;}&lt;/span&gt; polyfills.js, polyfills.js.map &lt;span class="o"&gt;(&lt;/span&gt;polyfills&lt;span class="o"&gt;)&lt;/span&gt; 141 kB &lt;span class="o"&gt;[&lt;/span&gt;initial] &lt;span class="o"&gt;[&lt;/span&gt;rendered]
chunk &lt;span class="o"&gt;{&lt;/span&gt;runtime&lt;span class="o"&gt;}&lt;/span&gt; runtime.js, runtime.js.map &lt;span class="o"&gt;(&lt;/span&gt;runtime&lt;span class="o"&gt;)&lt;/span&gt; 6.15 kB &lt;span class="o"&gt;[&lt;/span&gt;entry] &lt;span class="o"&gt;[&lt;/span&gt;rendered]
chunk &lt;span class="o"&gt;{&lt;/span&gt;styles&lt;span class="o"&gt;}&lt;/span&gt; styles.js, styles.js.map &lt;span class="o"&gt;(&lt;/span&gt;styles&lt;span class="o"&gt;)&lt;/span&gt; 13.4 kB &lt;span class="o"&gt;[&lt;/span&gt;initial] &lt;span class="o"&gt;[&lt;/span&gt;rendered]
chunk &lt;span class="o"&gt;{&lt;/span&gt;vendor&lt;span class="o"&gt;}&lt;/span&gt; vendor.js, vendor.js.map &lt;span class="o"&gt;(&lt;/span&gt;vendor&lt;span class="o"&gt;)&lt;/span&gt; 2.64 MB &lt;span class="o"&gt;[&lt;/span&gt;initial] &lt;span class="o"&gt;[&lt;/span&gt;rendered]
Date: 2020-10-08T13:44:58.948Z - Hash: 546469cedb2db4de6e20 - Time: 3675ms
&lt;span class="k"&gt;**&lt;/span&gt; Angular Live Development Server is listening on dev.local:4200, open your browser on https://dev.local:4200/ &lt;span class="k"&gt;**&lt;/span&gt;
: Compiled successfully.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can open &lt;a href="https://dev.local:4200" rel="noopener noreferrer"&gt;https://dev.local:4200&lt;/a&gt; which is secured with a valid certificate 🔐🎉&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdu9c7v0qexv9rraj0nt8.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdu9c7v0qexv9rraj0nt8.png" alt="angular-https"&gt;&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fif5hm57wz2deyaou5080.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fif5hm57wz2deyaou5080.png" alt="certificate-preview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to change any configuration on the options, but don't forget to regenerate a new certificate with mkcert of you change the domain name ⚠️&lt;/p&gt;

&lt;p&gt;See you in the next post!&lt;/p&gt;
&lt;h1&gt;
  
  
  Github repository
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Nightbr" rel="noopener noreferrer"&gt;
        Nightbr
      &lt;/a&gt; / &lt;a href="https://github.com/Nightbr/full-https-development-environment" rel="noopener noreferrer"&gt;
        full-https-development-environment
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A full development environment in HTTPS with a valid certificate for your local development domain with mkcert, Nx workspace, angular, reactjs, nestjs, express, docker, traefik.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Myorg&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This project was generated using &lt;a href="https://nx.dev" rel="nofollow noopener noreferrer"&gt;Nx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-logo.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnrwl%2Fnx%2Fmaster%2Fimages%2Fnx-logo.png" width="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔎 &lt;strong&gt;Nx is a set of Extensible Dev Tools for Monorepos.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Adding capabilities to your workspace&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Nx supports many plugins which add capabilities for developing different types of applications and different tools.&lt;/p&gt;

&lt;p&gt;These capabilities include generating applications, libraries, etc as well as the devtools to test, and build projects as well.&lt;/p&gt;

&lt;p&gt;Below are our core plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://reactjs.org" rel="nofollow noopener noreferrer"&gt;React&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/react&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Web (no framework frontends)

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/web&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://angular.io" rel="nofollow noopener noreferrer"&gt;Angular&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/angular&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://nestjs.com" rel="nofollow noopener noreferrer"&gt;Nest&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/nest&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://expressjs.com" rel="nofollow noopener noreferrer"&gt;Express&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/express&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://nodejs.org" rel="nofollow noopener noreferrer"&gt;Node&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/node&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;There are also many &lt;a href="https://nx.dev/nx-community" rel="nofollow noopener noreferrer"&gt;community plugins&lt;/a&gt; you could add.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Generate an application&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;nx g @nrwl/react:app my-app&lt;/code&gt; to generate an application.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can use any of the plugins above to generate applications as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When using Nx, you can create multiple applications and libraries in the same workspace.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Generate a library&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;nx&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Nightbr/full-https-development-environment" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>monorepo</category>
      <category>nx</category>
      <category>angular</category>
      <category>security</category>
    </item>
    <item>
      <title>🔐 Full HTTPS development environment</title>
      <dc:creator>Titouan B</dc:creator>
      <pubDate>Thu, 08 Oct 2020 09:22:43 +0000</pubDate>
      <link>https://dev.to/nightbr/full-https-ssl-development-environment-4dam</link>
      <guid>https://dev.to/nightbr/full-https-ssl-development-environment-4dam</guid>
      <description>&lt;p&gt;Hey, in this post series, I will explain how you can have a full development environment in HTTPS with a valid certificate for your local development domain.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why should I use HTTPS in development?
&lt;/h1&gt;

&lt;p&gt;In fact, there are many reasons you should use HTTPS for your development environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To use &lt;strong&gt;Secure&lt;/strong&gt; Cookie for authentication (using Auth service such as Keycloack, Auth0, ...) → See &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite" rel="noopener noreferrer"&gt;more here&lt;/a&gt; or &lt;a href="https://web.dev/samesite-cookies-explained/" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;To have the development &amp;amp; production environment as similar as possible. See the &lt;a href="https://12factor.net/dev-prod-parity" rel="noopener noreferrer"&gt;10th factor&lt;/a&gt; of the &lt;a href="https://12factor.net/" rel="noopener noreferrer"&gt;12-factor app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Some external services (SaaS) required HTTPS (i.e. for webhooks)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Setup the certificate
&lt;/h1&gt;

&lt;p&gt;We need to setup an certificate signed with a rootCA which is recognized by our system and browser. &lt;/p&gt;

&lt;p&gt;First we will choose an hostname for our local development environment, then we will use the awesome tool &lt;strong&gt;&lt;a href="https://mkcert.dev/" rel="noopener noreferrer"&gt;mkcert&lt;/a&gt;&lt;/strong&gt; to generate a valid certificate.&lt;/p&gt;

&lt;h1&gt;
  
  
  Choose a dev hostname
&lt;/h1&gt;

&lt;p&gt;Choose an hostname for your development environment. &lt;/p&gt;

&lt;p&gt;⚠️ Don't use existing domain name which could create conflicts!&lt;/p&gt;

&lt;p&gt;You can use the usual &lt;a href="http://localhost" rel="noopener noreferrer"&gt;localhost&lt;/a&gt; or another hostname. I like to use &lt;a href="http://dev.local" rel="noopener noreferrer"&gt;dev.local&lt;/a&gt; which I will take for the next steps.&lt;/p&gt;

&lt;p&gt;You will need to add the hostname in your local dns which is &lt;code&gt;/etc/hosts&lt;/code&gt; in Linux &amp;amp; Mac. So add &lt;code&gt;127.0.0.1   dev.local&lt;/code&gt; in your &lt;code&gt;/etc/hosts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;💡 Tips: I'm using this script from &lt;a href="https://gist.github.com/irazasyed/a7b0a079e7727a4315b9" rel="noopener noreferrer"&gt;this gist&lt;/a&gt; to add &amp;amp; remove hostname easily 👍&lt;/p&gt;

&lt;p&gt;🗒️ Note: If you use sub-domain such as &lt;code&gt;api.dev.local&lt;/code&gt;, &lt;code&gt;app.dev.local&lt;/code&gt;, ... You have to add them in &lt;code&gt;/etc/hosts&lt;/code&gt; too. You can't use wildcard such as &lt;code&gt;*.dev.local&lt;/code&gt; directly on &lt;code&gt;/etc/hosts&lt;/code&gt; but you can use a service such as &lt;strong&gt;dnsmasq&lt;/strong&gt; to achieve this.&lt;/p&gt;

&lt;h1&gt;
  
  
  Mkcert
&lt;/h1&gt;

&lt;p&gt;We will use &lt;a href="https://mkcert.dev/" rel="noopener noreferrer"&gt;mkcert&lt;/a&gt; to manage the rootCA &amp;amp; generate our certificate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🍏 MacOS
&lt;/h3&gt;

&lt;p&gt;On MacOS, use &lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;Homebrew&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;mkcert
brew &lt;span class="nb"&gt;install &lt;/span&gt;nss &lt;span class="c"&gt;# if you use Firefox&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  🐧 Linux
&lt;/h3&gt;

&lt;p&gt;On Linux, first install &lt;code&gt;certutil&lt;/code&gt;.&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="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;libnss3-tools
curl &lt;span class="nt"&gt;-Lo&lt;/span&gt; /tmp/mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.1/mkcert-v1.4.1-linux-amd64
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /tmp/mkcert
&lt;span class="nb"&gt;sudo mv&lt;/span&gt; /tmp/mkcert /usr/local/bin/mkcert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;See more installation methods &lt;a href="https://github.com/FiloSottile/mkcert#installation" rel="noopener noreferrer"&gt;here&lt;/a&gt; 👌&lt;/p&gt;
&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;First we need to install the local CA  to the system and browsers.&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="nv"&gt;$ &lt;/span&gt;mkcert &lt;span class="nt"&gt;-install&lt;/span&gt;
Created a new &lt;span class="nb"&gt;local &lt;/span&gt;CA at &lt;span class="s2"&gt;"/home/***/.local/share/mkcert"&lt;/span&gt; 💥
The &lt;span class="nb"&gt;local &lt;/span&gt;CA is now installed &lt;span class="k"&gt;in &lt;/span&gt;the system trust store! ⚡️
The &lt;span class="nb"&gt;local &lt;/span&gt;CA is now installed &lt;span class="k"&gt;in &lt;/span&gt;the Firefox trust store &lt;span class="o"&gt;(&lt;/span&gt;requires browser restart&lt;span class="o"&gt;)!&lt;/span&gt; 🦊
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Next, we will use mkcert to generate our certificate. Using my example domain &lt;a href="http://dev.local" rel="noopener noreferrer"&gt;&lt;code&gt;dev.local&lt;/code&gt;&lt;/a&gt; &amp;amp; the wildcard &lt;code&gt;*.dev.local&lt;/code&gt;.&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="nv"&gt;$ &lt;/span&gt;mkcert &lt;span class="nt"&gt;-cert-file&lt;/span&gt; certs/local-cert.pem &lt;span class="nt"&gt;-key-file&lt;/span&gt; certs/local-key.pem dev.local &lt;span class="k"&gt;*&lt;/span&gt;.dev.local
Using the &lt;span class="nb"&gt;local &lt;/span&gt;CA at &lt;span class="s2"&gt;"/home/***/.local/share/mkcert"&lt;/span&gt; ✨

Created a new certificate valid &lt;span class="k"&gt;for &lt;/span&gt;the following names 📜
 - &lt;span class="s2"&gt;"dev.local"&lt;/span&gt;
 - &lt;span class="s2"&gt;"*.dev.local"&lt;/span&gt;

Reminder: X.509 wildcards only go one level deep, so this won&lt;span class="s1"&gt;'t match a.b.dev.local ℹ️

The certificate is at "certs/local-cert.pem" and the key at "certs/local-key.pem" ✅
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We can now use the certificate located at &lt;code&gt;certs/local-cert.pem&lt;/code&gt; &amp;amp; &lt;code&gt;certs/local-key.pem&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next we will see how we will use this certificate for different apps.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F050gu7mk194vqrt3th6r.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F050gu7mk194vqrt3th6r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  BONUS: Wrapping everything in a Makefile for a dev-stack
&lt;/h1&gt;

&lt;p&gt;here is how I organized my dev-stack, it's highly opinionated so take only what you need from it 😉!&lt;/p&gt;
&lt;h2&gt;
  
  
  📁 Folders Structure
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project_root
├── dev-stack
│   ├── certs
│   │   ├── .gitignore
│   │   ├── local-cert.pem
│   │   └── local-key.pem
│   ├── scripts
│   │   ├── get-ip.sh
│   │   └── manage-hosts.sh
│   ├── .env.local
│   ├── .gitignore
│   ├── docker-compose.yml
│   ├── Makefile
│   └── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Makefile
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="k"&gt;ifndef&lt;/span&gt; &lt;span class="nv"&gt;DEV_STACK_DIR&lt;/span&gt;
&lt;span class="nv"&gt;DEV_STACK_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;CURDIR&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="nv"&gt;SCRIPTS_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;DEV_STACK_DIR&lt;span class="p"&gt;}&lt;/span&gt;/scripts

&lt;span class="k"&gt;ifndef&lt;/span&gt; &lt;span class="nv"&gt;HOSTNAME&lt;/span&gt;
&lt;span class="nv"&gt;HOSTNAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; dev.local
&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;ifndef&lt;/span&gt; &lt;span class="nv"&gt;SUBDOMAINS&lt;/span&gt;
&lt;span class="nv"&gt;SUBDOMAINS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; docs &lt;span class="se"&gt;\&lt;/span&gt;
             traefik &lt;span class="se"&gt;\&lt;/span&gt;
             mail &lt;span class="se"&gt;\&lt;/span&gt;
             media &lt;span class="se"&gt;\&lt;/span&gt;
             portainer &lt;span class="se"&gt;\&lt;/span&gt;
             graphql &lt;span class="se"&gt;\&lt;/span&gt;
             auth
&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;ifndef&lt;/span&gt; &lt;span class="nv"&gt;DATABASE&lt;/span&gt;
&lt;span class="nv"&gt;DATABASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; postgres
&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;ifndef&lt;/span&gt; &lt;span class="nv"&gt;INFRA&lt;/span&gt;
&lt;span class="nv"&gt;INFRA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; traefik &lt;span class="se"&gt;\&lt;/span&gt;
        maildev &lt;span class="se"&gt;\&lt;/span&gt;
        minio &lt;span class="se"&gt;\&lt;/span&gt;
        mkdocs &lt;span class="se"&gt;\&lt;/span&gt;
        portainer &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="p"&gt;${&lt;/span&gt;DATABASE&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        graphql-engine &lt;span class="se"&gt;\&lt;/span&gt;
        keycloak &lt;span class="se"&gt;\&lt;/span&gt;
        auth-connector
&lt;span class="k"&gt;endif&lt;/span&gt;

&lt;span class="k"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HOST_IP&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;shell &lt;span class="p"&gt;${&lt;/span&gt;SCRIPTS_DIR&lt;span class="p"&gt;}&lt;/span&gt;/get-ip.sh&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# HELP
&lt;/span&gt;&lt;span class="nl"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;help&lt;/span&gt;

&lt;span class="nl"&gt;help&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; List of the command available&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt; make {command}&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;MAKEFILE_LIST&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;.DEFAULT_GOAL&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;help&lt;/span&gt;

&lt;span class="nl"&gt;start&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Start the docker stack&lt;/span&gt;
    docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="p"&gt;${&lt;/span&gt;INFRA&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nl"&gt;up&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Start the docker stack&lt;/span&gt;
    docker-compose up &lt;span class="p"&gt;${&lt;/span&gt;INFRA&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nl"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Stop the docker stack&lt;/span&gt;
    docker-compose stop

&lt;span class="nl"&gt;restart&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Restart the docker stack&lt;/span&gt;
    docker-compose restart

&lt;span class="nl"&gt;down&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Down the docker stack and remove all containers and networks&lt;/span&gt;
    docker-compose down

&lt;span class="nl"&gt;build&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Build or rebuild all docker container&lt;/span&gt;
    docker-compose build

&lt;span class="nl"&gt;pull&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Pull latest image&lt;/span&gt;
    docker-compose pull

&lt;span class="nl"&gt;add-hosts&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Add Hosts entries for Dev stack&lt;/span&gt;
    &lt;span class="p"&gt;${&lt;/span&gt;SCRIPTS_DIR&lt;span class="p"&gt;}&lt;/span&gt;/manage-hosts.sh addhost &lt;span class="p"&gt;${&lt;/span&gt;HOSTNAME&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;$(&lt;/span&gt;foreach subdomain, &lt;span class="p"&gt;$(&lt;/span&gt;SUBDOMAINS&lt;span class="p"&gt;)&lt;/span&gt;, &lt;span class="p"&gt;${&lt;/span&gt;SCRIPTS_DIR&lt;span class="p"&gt;}&lt;/span&gt;/manage-hosts.sh addhost &lt;span class="p"&gt;$(&lt;/span&gt;subdomain&lt;span class="p"&gt;)&lt;/span&gt;.&lt;span class="p"&gt;$(&lt;/span&gt;HOSTNAME&lt;span class="p"&gt;);)&lt;/span&gt;

&lt;span class="nl"&gt;remove-hosts&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Remove Hosts entries for Dev stack&lt;/span&gt;
    &lt;span class="p"&gt;${&lt;/span&gt;SCRIPTS_DIR&lt;span class="p"&gt;}&lt;/span&gt;/manage-hosts.sh removehost &lt;span class="p"&gt;${&lt;/span&gt;HOSTNAME&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;$(&lt;/span&gt;foreach subdomain, &lt;span class="p"&gt;$(&lt;/span&gt;SUBDOMAINS&lt;span class="p"&gt;)&lt;/span&gt;, &lt;span class="p"&gt;${&lt;/span&gt;SCRIPTS_DIR&lt;span class="p"&gt;}&lt;/span&gt;/manage-hosts.sh removehost &lt;span class="p"&gt;$(&lt;/span&gt;subdomain&lt;span class="p"&gt;)&lt;/span&gt;.&lt;span class="p"&gt;$(&lt;/span&gt;HOSTNAME&lt;span class="p"&gt;);)&lt;/span&gt;

&lt;span class="nl"&gt;certs-generate&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Generate certs for all our domains&lt;/span&gt;
    mkcert &lt;span class="nt"&gt;-install&lt;/span&gt;
    mkcert &lt;span class="nt"&gt;-cert-file&lt;/span&gt; certs/local-cert.pem &lt;span class="nt"&gt;-key-file&lt;/span&gt; certs/local-key.pem &lt;span class="p"&gt;$(&lt;/span&gt;HOSTNAME&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.&lt;span class="p"&gt;$(&lt;/span&gt;HOSTNAME&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;certs-uninstall&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Uninstall the local CA (but do not delete it)&lt;/span&gt;
    mkcert &lt;span class="nt"&gt;-uninstall&lt;/span&gt;

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

&lt;/div&gt;

&lt;h2&gt;
  
  
  Scripts
&lt;/h2&gt;
&lt;h3&gt;
  
  
  get-ip.sh
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Get host IP address&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&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;uname&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Darwin"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;then
    &lt;/span&gt;ifconfig en0 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"inet "&lt;/span&gt;| &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; 2
&lt;span class="k"&gt;else
    &lt;/span&gt;ip route get 1.2.3.4 | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $7}'&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  manage-hosts.sh
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# copy from https://gist.github.com/irazasyed/a7b0a079e7727a4315b9&lt;/span&gt;

&lt;span class="c"&gt;# PATH TO YOUR HOSTS FILE&lt;/span&gt;
&lt;span class="nv"&gt;ETC_HOSTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/hosts

&lt;span class="c"&gt;# DEFAULT IP FOR HOSTNAME&lt;/span&gt;
&lt;span class="nv"&gt;IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"127.0.0.1"&lt;/span&gt;

&lt;span class="c"&gt;# Hostname to add/remove.&lt;/span&gt;
&lt;span class="nv"&gt;HOSTNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;

removehost&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"removing host"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt; /etc/hosts&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;&lt;span class="s2"&gt; Found in your &lt;/span&gt;&lt;span class="nv"&gt;$ETC_HOSTS&lt;/span&gt;&lt;span class="s2"&gt;, Removing now..."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="s2"&gt;".bak"&lt;/span&gt; &lt;span class="s2"&gt;"/&lt;/span&gt;&lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;&lt;span class="s2"&gt;/d"&lt;/span&gt; &lt;span class="nv"&gt;$ETC_HOSTS&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;&lt;span class="s2"&gt; was not found in your &lt;/span&gt;&lt;span class="nv"&gt;$ETC_HOSTS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

addhost&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"adding host"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;HOSTS_LINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$IP&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt; /etc/hosts&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;&lt;span class="s2"&gt; already exists : &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt; &lt;span class="nv"&gt;$ETC_HOSTS&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;else
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Adding &lt;/span&gt;&lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;&lt;span class="s2"&gt; to your &lt;/span&gt;&lt;span class="nv"&gt;$ETC_HOSTS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"echo '&lt;/span&gt;&lt;span class="nv"&gt;$HOSTS_LINE&lt;/span&gt;&lt;span class="s2"&gt;' &amp;gt;&amp;gt; /etc/hosts"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt; /etc/hosts&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
                &lt;span class="k"&gt;then
                    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;&lt;span class="s2"&gt; was added succesfully &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt; /etc/hosts&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;else
                    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to Add &lt;/span&gt;&lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;&lt;span class="s2"&gt;, Try again!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;fi
    fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$@&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Usage of the certificate
&lt;/h1&gt;

&lt;p&gt;→ See in next posts how you can now use this new generated certificates&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local HTTPS for Angular app in Nx workspace (or angular cli)&lt;/li&gt;
&lt;li&gt;Local HTTPS for React app in Nx workspace&lt;/li&gt;
&lt;li&gt;Local HTTPS for Express app (api) in Nx workspace&lt;/li&gt;
&lt;li&gt;Local HTTPS for NestJS app (api) in Nx workspace&lt;/li&gt;
&lt;li&gt;Local HTTPS for Docker services using Traefik&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Github repository
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Nightbr" rel="noopener noreferrer"&gt;
        Nightbr
      &lt;/a&gt; / &lt;a href="https://github.com/Nightbr/full-https-development-environment" rel="noopener noreferrer"&gt;
        full-https-development-environment
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A full development environment in HTTPS with a valid certificate for your local development domain with mkcert, Nx workspace, angular, reactjs, nestjs, express, docker, traefik.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Myorg&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This project was generated using &lt;a href="https://nx.dev" rel="nofollow noopener noreferrer"&gt;Nx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-logo.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnrwl%2Fnx%2Fmaster%2Fimages%2Fnx-logo.png" width="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔎 &lt;strong&gt;Nx is a set of Extensible Dev Tools for Monorepos.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Adding capabilities to your workspace&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Nx supports many plugins which add capabilities for developing different types of applications and different tools.&lt;/p&gt;

&lt;p&gt;These capabilities include generating applications, libraries, etc as well as the devtools to test, and build projects as well.&lt;/p&gt;

&lt;p&gt;Below are our core plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://reactjs.org" rel="nofollow noopener noreferrer"&gt;React&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/react&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Web (no framework frontends)

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/web&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://angular.io" rel="nofollow noopener noreferrer"&gt;Angular&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/angular&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://nestjs.com" rel="nofollow noopener noreferrer"&gt;Nest&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/nest&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://expressjs.com" rel="nofollow noopener noreferrer"&gt;Express&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/express&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://nodejs.org" rel="nofollow noopener noreferrer"&gt;Node&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev @nrwl/node&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;There are also many &lt;a href="https://nx.dev/nx-community" rel="nofollow noopener noreferrer"&gt;community plugins&lt;/a&gt; you could add.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Generate an application&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;nx g @nrwl/react:app my-app&lt;/code&gt; to generate an application.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can use any of the plugins above to generate applications as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When using Nx, you can create multiple applications and libraries in the same workspace.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Generate a library&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Run &lt;code&gt;nx&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Nightbr/full-https-development-environment" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>monorepo</category>
      <category>security</category>
      <category>https</category>
      <category>development</category>
    </item>
    <item>
      <title>Setup EU cookie bar on Webflow</title>
      <dc:creator>Titouan B</dc:creator>
      <pubDate>Wed, 16 Sep 2020 08:51:39 +0000</pubDate>
      <link>https://dev.to/nightbr/setup-eu-cookie-bar-on-webflow-43c</link>
      <guid>https://dev.to/nightbr/setup-eu-cookie-bar-on-webflow-43c</guid>
      <description>&lt;p&gt;Hey, we will see how &lt;strong&gt;you can easily setup a free EU cookie bar&lt;/strong&gt; 🍪 on your &lt;a href="https://webflow.com/" rel="noopener noreferrer"&gt;Webflow&lt;/a&gt; website.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzytb45rqz2zki86p86k9.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzytb45rqz2zki86p86k9.png" alt="cookiebar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you don't know Webflow, It's a modern website visual builder. I mainly use it to build the marketing website for SaaS product.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cookieconsent
&lt;/h2&gt;

&lt;p&gt;We will use the awesome OpenSource project &lt;a href="https://github.com/osano/cookieconsent" rel="noopener noreferrer"&gt;Cookieconsent&lt;/a&gt; by &lt;a href="https://www.osano.com/cookieconsent" rel="noopener noreferrer"&gt;OSANO&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The easy visual way to get the cookie bar is to use the Wizard.&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://www.osano.com/cookieconsent/download/" rel="noopener noreferrer"&gt;https://www.osano.com/cookieconsent/download/&lt;/a&gt; and click on &lt;strong&gt;Start coding&lt;/strong&gt; on the Open Source Edition column.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm2q7h0nsifngbo6gjzkq.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm2q7h0nsifngbo6gjzkq.png" alt="wizard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will be able to tweak the widget as you wish ✨&lt;/p&gt;

&lt;p&gt;It will generate the code we will copy to our &lt;strong&gt;Webflow config&lt;/strong&gt; (on the right).&lt;/p&gt;

&lt;h2&gt;
  
  
  Webflow configuration
&lt;/h2&gt;

&lt;p&gt;Go to your &lt;a href="https://webflow.com/dashboard" rel="noopener noreferrer"&gt;Webflow Dashboard&lt;/a&gt;  and open your website settings.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj8m5stc18ei0wd5sy1o3.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj8m5stc18ei0wd5sy1o3.png" alt="settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to the &lt;strong&gt;Custom Code&lt;/strong&gt; tab. We will copy the Head Code from the Cookieconsent Wizard into the &lt;strong&gt;Head Code block&lt;/strong&gt; in Webflow &amp;amp; the other part into &lt;strong&gt;Footer Code block&lt;/strong&gt;. Don't forget to Save changes (with the buttons).&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fevh4fn7rvxmscj2yb2qa.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fevh4fn7rvxmscj2yb2qa.png" alt="custom code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is my code for example:&lt;/p&gt;

&lt;h3&gt;
  
  
  Head Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/css"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/cookieconsent@3/build/cookieconsent.min.css"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Footer Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/cookieconsent@3/build/cookieconsent.min.js"&lt;/span&gt; &lt;span class="na"&gt;data-cfasync=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;load&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookieconsent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialise&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;palette&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;popup&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;background&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="s2"&gt;#00947C&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="s2"&gt;button&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;background&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="s2"&gt;#fff&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="s2"&gt;text&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="s2"&gt;#00947C&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;theme&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="s2"&gt;classic&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="s2"&gt;position&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="s2"&gt;bottom-left&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="s2"&gt;content&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&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="s2"&gt;Nous utilisons des cookies pour améliorer votre expérience de navigation.&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="s2"&gt;dismiss&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="s2"&gt;J'ai compris&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="s2"&gt;deny&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="s2"&gt;Refuser&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="s2"&gt;link&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="s2"&gt;En savoir plus&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="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ &lt;em&gt;Note: You need a paid site plan to be able to add custom code to your site&lt;/em&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzct04xfs5o8gjcejwvx6.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzct04xfs5o8gjcejwvx6.png" alt="warning"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Publish &amp;amp; chill 😎
&lt;/h2&gt;

&lt;p&gt;Just hit your site's Publish button and you should have your EU Cookie bar on Webflow 🎉&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzytb45rqz2zki86p86k9.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzytb45rqz2zki86p86k9.png" alt="cookiebar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's all folks, it's pretty easy and basic but cover the current EU needs to inform about cookie you're using on your website. &lt;/p&gt;

&lt;p&gt;For advanced usage, you can see all options available in &lt;a href="https://www.osano.com/cookieconsent/documentation/javascript-api/" rel="noopener noreferrer"&gt;the JavaScript API for Cookie consent documentation.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading and feel free to ask anything in comment! 🚀&lt;/p&gt;

</description>
      <category>webflow</category>
      <category>nocode</category>
      <category>cookie</category>
      <category>eu</category>
    </item>
    <item>
      <title>Internationalization with API Platform: the other way</title>
      <dc:creator>Titouan B</dc:creator>
      <pubDate>Wed, 16 Sep 2020 07:09:10 +0000</pubDate>
      <link>https://dev.to/nightbr/internationalization-with-api-platform-the-other-way-53m3</link>
      <guid>https://dev.to/nightbr/internationalization-with-api-platform-the-other-way-53m3</guid>
      <description>&lt;p&gt;We recently saw the great article of Locastic on this tricky subject of implementing translations in API and specifically in API Platform&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp1oawmzj5l4tuhzsw2ec.jpeg" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp1oawmzj5l4tuhzsw2ec.jpeg" alt="API Platform, API Platform everywhere!"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;API Platform, API Platform everywhere!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We recently saw &lt;a href="https://medium.com/locastic/having-troubles-with-implementing-translations-in-apiplatform-7861294fb7c6" rel="noopener noreferrer"&gt;the great article of Locastic&lt;/a&gt; on this tricky subject of implementing translations in API and specifically in &lt;a href="https://api-platform.com/" rel="noopener noreferrer"&gt;API Platform&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For one of our project, we also find a pretty neat solution to implement intl in our beloved API Platform!&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;First of all&lt;/strong&gt;, we have locale parameters and locale Entity to manage locales stuff and language reference.&lt;/p&gt;

&lt;p&gt;We add some parameters:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
 

&lt;p&gt;You can also use &lt;strong&gt;Locale Entity&lt;/strong&gt; and add new locales in database. The Locale Entity has priority over &lt;strong&gt;parameters&lt;/strong&gt;. If there is no Locale in database, it will use parameters config.&lt;/p&gt;

&lt;p&gt;Our &lt;strong&gt;Locale Entity&lt;/strong&gt; 🏁&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;A little &lt;strong&gt;LocaleRepository&lt;/strong&gt; to handle the switch between config and parameters:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Note: We use autowiring to pass parameters &lt;em&gt;parametersDefaultLocale&lt;/em&gt; and &lt;em&gt;parametersAvailableLocales&lt;/em&gt; to the constructor.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Now we need to translate our Entities !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We choose to use &lt;a href="https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/translatable.md" rel="noopener noreferrer"&gt;Doctrine Translatable Extension&lt;/a&gt; to manage our Translatable Entities.&lt;/p&gt;

&lt;p&gt;Pretty simple! We only followed the Doctrine Translatable Extension doc to give our translatable behavior to our Entities. Here is an example of a translatable entity:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Pretty easy, isn’t it? 👌&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;But how can this work? Where is the magic trick? How can I know which locale is use or how can I add new languages and translations?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is the magic trick, we have a &lt;strong&gt;LocaleListener!&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;When you call the API (&lt;em&gt;GET, POST, PUT, PATCH&lt;/em&gt;), you want to retrieve data (or post data) for a specific locale. You can do this by passing the locale in the header of your request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X-LOCALE: fr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If your locale is null or not supported, it will use the default locale.&lt;/p&gt;



&lt;p&gt;❤️ I love this solution because it is simple and use standard library such as &lt;strong&gt;Doctrine Translatable&lt;/strong&gt; which is mainly use in &lt;strong&gt;Symfony&lt;/strong&gt; application.&lt;/p&gt;

&lt;p&gt;Add to that, it is stateless and stay &lt;strong&gt;REST compliant&lt;/strong&gt; (when we &lt;em&gt;GET/POST/PUT&lt;/em&gt;… we stay in the Entity context).&lt;/p&gt;

&lt;p&gt;If you want multi-language editable field, just create it with your favorite frontend framework and change the header &lt;em&gt;X-LOCALE&lt;/em&gt; to the correct language on the &lt;em&gt;POST/PUT&lt;/em&gt; request.&lt;/p&gt;

&lt;p&gt;For example, we retrieve available locales through the API locale endpoint to display flags 🇫🇷 and edit button ✏️. When you click on edit button, it will go to the edit form with the correct language data thanks to the correct &lt;em&gt;X-LOCALE&lt;/em&gt; header in the &lt;em&gt;GET&lt;/em&gt; request. And when you submit the form, it calls a &lt;em&gt;PUT&lt;/em&gt; on the entity with the correct &lt;em&gt;X-LOCALE&lt;/em&gt; header set to the selected language !&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmzwgv1n8r8jryzv975iw.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmzwgv1n8r8jryzv975iw.png" alt="Example of frontend UI"&gt;&lt;/a&gt;&lt;br&gt;
Example of frontend UI&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: with the approach we have the same entity id for all languages. The company id=42 will always be the company 42 in different languages. Only Translatable Annotated field will change. So be sure it is ok with your use case. I don’t think there is a unique and perfect solution for the intl problem.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading and feel free to ask anything in comment! 🚀&lt;/p&gt;

&lt;p&gt;From Medium:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/@titouanbenoit/internationalization-with-api-platform-the-other-way-5ce9c446737f" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A88%3A88%2F1%2Aid_tUuU21z8wY95miFdxbA.jpeg" alt="Titouan BENOIT"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/@titouanbenoit/internationalization-with-api-platform-the-other-way-5ce9c446737f" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Internationalization with API Platform: the other way | by Titouan BENOIT | Medium&lt;/h2&gt;
      &lt;h3&gt;Titouan BENOIT ・ &lt;time&gt;Oct 2, 2018&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;Demo Repository:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Nightbr" rel="noopener noreferrer"&gt;
        Nightbr
      &lt;/a&gt; / &lt;a href="https://github.com/Nightbr/api-intl" rel="noopener noreferrer"&gt;
        api-intl
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Symfony4 flex with API platform with Doctrine Translatable: https://medium.com/@titouanbenoit/internationalization-with-api-platform-the-other-way-5ce9c446737f
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;api-intl&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Nightbr/api-intl" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>symfony</category>
      <category>php</category>
      <category>api</category>
      <category>i18n</category>
    </item>
  </channel>
</rss>
