Firebase Hosting
The client app is deployed on Firebase Hosting which uses 2 configuration files.
.firebasercfirebase.json
The deployment is handled by Circle-CI, but let's understand how it actually works.
Assuming the client app has been built with the npm run build:dev command (equivalent to the ng build command with some options).
The built artefact is then available in the dist/client/browser directory.
.firebaserc
This file describes the deploy targets.
{
  "projects": {
    "dev": "feedzback-v2-dev"
  },
  "targets": {
    "feedzback-v2-dev": {
      "hosting": {
        "dev": ["feedzback-v2-dev"]
      }
    }
  }
}
Here, the short-name identifier dev is associated to the Firebase project named feedzback-v2-dev.
firebase.json
This file describes the local location and runtime behavior of the Firebase Hosting resource.
{
  "hosting": [
    {
      "target": "dev",
      "public": "dist/client/browser",
      "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
      "rewrites": [
        {
          "source": "/fr/**",
          "destination": "/fr/index.html"
        },
        {
          "source": "/en/**",
          "destination": "/en/index.html"
        }
      ]
    }
  ]
}
Here, the same short-name identifier dev is used as deploy target (see above).
The configuration specifies that:
- the built artefact (
dist/client/browser) needs to be deployed as Hosting resource, on the targeted Firebase project - and because we are dealing with a Single-Page-Application (SPA), the Hosting resource needs to support URL rewriting
 
404 / Not found page
The 404.html file is served by Firebase Hosting when a user tries to access a page that doesn't exist.
So, this file needs to be added in the built artefact.
This task is done be the post-build NPM script:
{
  "scripts": {
    "build:dev": "ng build -c development-remote && npm run post-build",
    "post-build": "cp src/404.html dist/client/browser/404.html"
  }
}
The HTML page src/404.html simply redirects the user to "localized" page (/fr or /en).
For example :
- when trying to access the page:
https://dev.feedzback.znk.io/request
 - the user will be redirected to one of these pages (depending on its current language settings):
https://dev.feedzback.znk.io/en/requesthttps://dev.feedzback.znk.io/fr/request