Update client app
You can update the Angular framework dependencies by following the instructions provided by Angular. Other dependencies can be updated manually.
But to make it short, just run the following command:
ng update @angular/core @angular/cli @angular/localize @angular/material
The rest of the document describes how to recreate all the dependencies from scratch. This is very useful for understanding the links between dependencies.
Create Angular app
npm install -g @angular/cli
ng new client --style scss --view-encapsulation None --ssr false
Generate environments
ng generate environments
Add Localize
ng add @angular/localize
Add Material
ng add @angular/material --theme custom --animations --typography
Move generated content (related to Material) from src/styles.scss
to src/styles/material.scss
.
Update src/styles.scss
:
@import './styles/material.scss';
html,
body {
height: 100%;
}
body {
margin: 0;
font-family: Nunito, sans-serif;
}
Nunito
font dependency is listed in other packages below.
Add Tailwind
npm install -D tailwindcss postcss autoprefixer
Add tailwind.config.ts
file:
import type { Config } from 'tailwindcss';
export default {
content: ['./src/**/*.{html,ts}'],
corePlugins: {
// Warning: Tailwind "Preflight" breaks some Angular material components
//
// Learn more about this issue and a hack to solve it:
// https://github.com/tailwindlabs/tailwindcss/discussions/9993
//
// The hack is available here: `src/styles/tailwind.css`
preflight: false,
},
theme: {
extend: {},
},
plugins: [],
} satisfies Config;
Add src/styles/tailwind.css
file:
@tailwind base;
@tailwind components;
@tailwind utilities;
Update src/styles.scss
:
@import './styles/tailwind.css';
Add ESLint and Prettier
ng add @angular-eslint/schematics
npm i -D prettier eslint-config-prettier eslint-plugin-prettier prettier-plugin-organize-imports prettier-plugin-tailwindcss
Update eslint.config.js
file:
const eslintPluginPrettierRecommended = require('eslint-plugin-prettier/recommended');
module.exports = tseslint.config(
{
rules: {
// Note: the following rule is an addon (by default, type definitions use `interface`, but we prefer to use `type`)
'@typescript-eslint/consistent-type-definitions': ['error', 'type'],
},
},
eslintPluginPrettierRecommended
);
Only the lines added are reported here.
Add .prettierrc.json
file:
{
"printWidth": 120,
"singleQuote": true,
"plugins": ["prettier-plugin-organize-imports", "prettier-plugin-tailwindcss"],
"overrides": [
{
"files": "*.html",
"options": {
"parser": "angular"
}
}
]
}
Add .prettierignore
file:
/.angular
/coverage
/dist
Add package.json
scripts:
{
"scripts": {
"format": "prettier --write .",
"format:check": "prettier --check ."
}
}
Using Jest instead of Karma/Jasmine
First, remove all packages related to Karma and Jasmine. Next, install Jest related packages:
npm i -D jest @types/jest @angular-builders/jest ts-node
Update tsconfig.spec.json
and tsconfig.json
files:
{
"compilerOptions": {
"types": ["jest"]
}
}
You need to make this change even for the tsconfig.json
file, as it is used by the IDE.
Update angular.json
file:
{
"projects": {
"client": {
"architect": {
"test": {
"builder": "@angular-builders/jest:run",
"options": {
"configPath": "jest.config.ts"
}
}
}
}
}
}
Add jest.config.ts
file:
import type { Config } from 'jest';
export default {
passWithNoTests: true,
setupFiles: ['./setup-jest.ts'],
} satisfies Config;
Add setup-jest.ts
file:
import '@angular/localize/init';
Add other packages
npm i @fontsource/nunito canvas-confetti firebase js-cookie @material-symbols/font-600
npm i -D @types/canvas-confetti @types/js-cookie