angularfix
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • Angular
  • AngularJS
  • Typescript
  • HTML
  • CSS
  • Javascript
Showing posts with label docker. Show all posts
Showing posts with label docker. Show all posts

Saturday

Angular-CLI proxy not working inside docker

 6:29 AM     angular, angular-cli, docker, docker-compose, proxy     No comments   

Issue

I have a docker-compose file with everything I need for my project.

This docker-compose has a nginx server, mysql, phpmyadmin and php. At the top of it, I added recently an angular container. Everything is working fine if I go to localhost:4200, I'm on the angular app, and if I go to localhost:80, I'm on the Laravel backend.

Now I need to make a simple classical request to my backend API. I set up a proxy for angular looking like this :

{
   "/api/*": {
      "target":"http://localhost:80",
      "secure":false,
      "changeOrigin":true,
      "pathRewrite": {"^/api" : ""},
      "logLevel":"debug"
   }
}

This is the config I copied based on this topic. But when I try to make the call, Chrome is saying that http://localhost:4200/api/test isn't existing (error 404) which is normal. On the other hand, the angular server says
HPM] Error occurred while trying to proxy request /test from localhost:4200 to http://localhost:80 (ECONNREFUSED) (https://nodejs.org/api/errors.html#errors_common_system_errors)

I'm guessing it comes from docker but I can't figure out how to resolve this.

[EDIT]

version: '2'

services:
  web_server:
    restart: always
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - /projects/laravel/:/var/www/                                               
      - /docker/sites-enabled-nginx:/etc/nginx/sites-enabled/     
      - /docker/nginx.conf:/etc/nginx/nginx.conf
    links:
      - php:php

  php:
    restart: always
    build: /docker/php/
    container_name: "php"
    volumes:
      - /projects/laravel/:/var/www/       
      - db:db

  db:
    restart: always
    image: mysql
    volumes:
      - /Users/Irindul/mysql:/var/lib/mysql     
    ports:
      - "3306:3306"                                   
    container_name: "mysql"
    environment:
      - MYSQL_DATABASE=homestead
      - MYSQL_USER=homestead
      - MYSQL_PASSWORD=secret
      - MYSQL_ROOT_PASSWORD=root

  myadmin:
    restart: always
    image: phpmyadmin/phpmyadmin
    links:
      - db:db
    ports:
      - "8080:80"                                     



  angular:
    restart: always
    build: /docker/angular
    container_name: angular
    volumes:
      - /projects/angular/package.json:/usr/src/app/package.json
      - /projects/angular:/usr/src/app/
    ports:
      - "4200:4200"

And here are the Dockerfiles for PHP and Angular :

PHP :

FROM php:7-fpm
RUN docker-php-ext-install pdo pdo_mysql
WORKDIR /var/www

Angular :

#Latest Node
FROM node

#Creating working folder
RUN mkdir -p /usr/src/app

#Update pwd
WORKDIR /usr/src/app

#Run npm
RUN npm install
EXPOSE 4200
CMD ["npm", "start"]

package.json :

{
  "name": "client",
  "version": "0.0.0",
  "license": "MIT",
  "scripts": {
    "ng": "ng",
    "start": "ng serve -H 0.0.0.0 --proxy-config proxy.config.json",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "^4.2.4",
    "@angular/common": "^4.2.4",
    "@angular/compiler": "^4.2.4",
    "@angular/core": "^4.2.4",
    "@angular/forms": "^4.2.4",
    "@angular/http": "^4.2.4",
    "@angular/platform-browser": "^4.2.4",
    "@angular/platform-browser-dynamic": "^4.2.4",
    "@angular/router": "^4.2.4",
    "core-js": "^2.4.1",
    "rxjs": "^5.4.2",
    "zone.js": "^0.8.14"
  },
  "devDependencies": {
    "@angular/cli": "1.3.2",
    "@angular/compiler-cli": "^4.2.4",
    "@angular/language-service": "^4.2.4",
    "@types/jasmine": "~2.5.53",
    "@types/jasminewd2": "~2.0.2",
    "@types/node": "~6.0.60",
    "codelyzer": "~3.1.1",
    "jasmine-core": "~2.6.2",
    "jasmine-spec-reporter": "~4.1.0",
    "karma": "~1.7.0",
    "karma-chrome-launcher": "~2.1.1",
    "karma-cli": "~1.0.1",
    "karma-coverage-istanbul-reporter": "^1.2.1",
    "karma-jasmine": "~1.1.0",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.1.2",
    "ts-node": "~3.2.0",
    "tslint": "~5.3.2",
    "typescript": "~2.3.3"
  }
}

Solution

I fixed the problem by removing Angular from the docker and running it manually with a simple npm start.



Answered By - Irindul
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Thursday

Angular CLI Proxy + Django Backend not working with Docker

 6:39 PM     angular, django, docker, docker-compose     No comments   

Issue

I have an Angular + Django project where I am providing an api to angular with django. When I run the angular service without docker everything works as expected. When I run the angular service using docker compose, angular is suddenly unable to connect to the backend api service. I have seen a similar post on stack but the difference is I am using a single compose file to include two different compose files so I'm not sure how to "link" the backend services to the frontend service like the answers suggest in this post. So what can I do to make this work within docker?

Error: [webpack-dev-server] [HPM] Error occurred while proxying request localhost:4200/api/project_types/ to http://api:8000/ [ENOTFOUND] (https://nodejs.org/api/errors.html#errors_common_system_errors)

Project Layout:

Note: I've dockerized the two services and am using one compose file in the root folder to include both the backend and frontend compose files.

- root
  - backend 
    - backend-compose.yml
  - frontend
    - frontend-compose.yml
  - docker-compose.yml

Root Compose:

version: '3.7'

include:
  - ./frontend/compose.yml
  - ./backend/local.yml

Frontend Compose:

services:
  web:
    build:
      context: .
      target: builder
    ports:
      - 4200:4200
    volumes:
      - ./angular:/app
      - /project/node_modules

Backend Compose: (Note: built with cookiecutter django)

version: '3'

volumes:
  backend_local_postgres_data: {}
  backend_local_postgres_data_backups: {}

services:
  django:
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    image: backend_local_django
    container_name: backend_local_django
    depends_on:
      - postgres
    volumes:
      - .:/app:z
    env_file:
      - ./.envs/.local/.django
      - ./.envs/.local/.postgres
    ports:
      - '8000:8000'
    command: /start

  postgres:
    build:
      context: .
      dockerfile: ./compose/production/postgres/Dockerfile
    image: backend_production_postgres
    container_name: backend_local_postgres
    volumes:
      - backend_local_postgres_data:/var/lib/postgresql/data
      - backend_local_postgres_data_backups:/backups
    env_file:
      - ./.envs/.local/.postgres

  docs:
    image: backend_local_docs
    container_name: backend_local_docs
    build:
      context: .
      dockerfile: ./compose/local/docs/Dockerfile
    env_file:
      - ./.envs/.local/.django
    volumes:
      - ./docs:/docs:z
      - ./config:/app/config:z
      - ./backend:/app/backend:z
    ports:
      - '9000:9000'
    command: /start-docs

EDIT

proxy.conf.json

{
    "/api/*": {
      "target": "http://django:8000/",
      "secure": false,
      "changeOrigin": true
    }
  }

Frontend Dockerfile

# syntax=docker/dockerfile:1.4

FROM --platform=$BUILDPLATFORM node:17.0.1-bullseye-slim as builder

RUN mkdir /project
WORKDIR /project

RUN npm install -g @angular/cli@13

COPY package.json package-lock.json ./
RUN npm ci

COPY . .
CMD ["ng", "serve", "--host", "0.0.0.0"]

FROM builder as dev-envs

RUN <<EOF
apt-get update
apt-get install -y --no-install-recommends git
EOF

RUN <<EOF
useradd -s /bin/bash -m vscode
groupadd docker
usermod -aG docker vscode
EOF
# install Docker tools (cli, buildx, compose)
COPY --from=gloursdocker/docker / /

CMD ["ng", "serve", "--host", "0.0.0.0"]

Solution

Have you tried Docker networks, as suggested in this answer?

I think you could add something like this to both compose files for all necessary services to connect to:

networks:
  backend-net:
    driver: bridge

Then add something like this under each of your services that need it:

networks:
  - backend-net

And make sure your proxy.config.json is updated as suggested in that answer as well.

More info on setting up networking between containers can be found here in the Docker docs.



Answered By - Kyle Beechly
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Right way to configure docker-compose for Angular apps

 4:18 PM     angular, docker, docker-compose     No comments   

Issue

I am trying to configure Docker to develop Angular apps locally, and as I have a database and a Node.js app, I am configuring it with docker compose. I am looking for a configuration where I can make changes locally using my editor, and Angular should detect the changes automatically reload from within Docker (like how it would have happened without Docker).

I am relatively new to Docker, so my understanding is that using the COPY statement inside Dockerfile means that a copy of my local files are made into the image, and therefore local changes don't trigger a recompile. My understanding is that I need to mount the local application as a volume and make it available inside at, say /app and then things should work. However, I am using a Mac, and the base image is Linux based (I am using FROM node:12-slim), so the npm packages have to be fetched and built inside the image. I removed node_modules from my local folder structure.

To meet these goals, this is how I configured the Angular Dockerfile

FROM node:12-slim

COPY package.json /app/package.json

WORKDIR /app
RUN npm install
RUN npm install -g @angular/cli@8.1.2

ENV PATH /app/node_modules/.bin:$PATH

RUN apt-get update
RUN apt-get install -y vim
RUN apt-get install -y curl

and this is how I configured the docker-compose.yml file

version: '3'

services:
  
  ... other services ...

  blackmirrorhq:
    image: <angular app image>
    expose:
      - 4200
    ports:
      - 4200:4200
    restart: on-failure
    volumes:
      - <path to angular app>:/app
    working_dir: /app
    command: "npm install && npm install -g @angular/cli@8.1.2 && ng serve --open --host 0.0.0.0 --port 4200 --disable-host-check"
    # command: "ng serve --open --host 0.0.0.0 --port 4200 --disable-host-check"

volumes:
  postgres-volume:

I think the node_modules folder gets overwritten when the docker compose starts because of the volume binding. The server fails citing missing packages. So, I am using the docker-compose file and using the command as:

npm install && npm install -g @angular/cli@8.1.2 && ng serve --open --host 0.0.0.0 --port 4200 --disable-host-check

However, while this is fetching all the packages, it is not starting the server. The node_modules folder gets created though.

After this, I comment out the line and uncomment out the next line that simply starts the server:

ng serve --open --host 0.0.0.0 --port 4200 --disable-host-check

With this, I am able to get it to work. However, I don't think this is the right way to approach it and wanted to understand what changes I need to make to configure it correctly.


Solution

just to rest your mind at ease, the method you used at last is the correct one. If you want to learn why read below:

There are some IDE-centric implementations that make the whole process a bit clueless and simpler but since we're not IDE specific I'll use the general idea.

the most popular approach is to completely develop on the docker container meaning you don't have (or at least don't use) any local environment.

the basic gist of it (as you pointed out) is making a base container with our dependencies and CLI installed (in this case angular CLI) then run this image and while the container is up and running make changes and letting angular automatically recompile as we develop. Now the way we connect our code to the container is using bind mounts which allow us to see the same files from our local machine editor and the container running it.

here's a simple docker-compose and basic container Dockerfile for this use case:

Dockerfile

FROM node:lts
RUN mkdir /home/node/app && chown node:node /home/node/app
RUN mkdir /home/node/app/node_modules && chown node:node /home/node/app/node_modules
WORKDIR  /home/node/app
USER node
COPY --chown=node:node package.json package-lock.json ./
RUN npm ci --quiet
COPY --chown=node:node . .

Since we don't care about the node_modules we can keep them as a docker volume in the container

docker-compose.yml

version: '3.7'
services:
  app:
    build: .
    command: sh -c "npm start"
    ports:
      - 4200:4200
    working_dir: /home/node/app
    volumes:
      - ./:/home/node/app
      - node_modules:/home/node/app/node_modules
volumes:
  node_modules:

credits to markfknight.dev for the working example

if you want to see a working example this might help you grasp the concept



Answered By - Noam Yizraeli
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Docker entrypoint script for image build not correct

 5:16 AM     angular, docker, dockerfile, nginx, shell     No comments   

Issue

I am building an Docker-Image for a Angluar Web-App and in the image creation I build the angular boundle using a node-image as base and then copy the dist folder to an nginx webserver. As an entrypoint I use a shellscript that replaces some placeholders in the dist files with environment variables (API-Hostname etc.). The Image builds with no error but when I try to run a container with that image, I get the following error:

run.sh: 1: Syntax error: word unexpected (expecting "do")

My Dockerfile:

FROM node:16 AS build

WORKDIR /app

COPY package*.json ./
COPY src ./src
COPY angular.json ./
COPY tsconfig.app.json ./
COPY tsconfig.json ./

RUN npm install
RUN npm run build-docker


FROM nginx
COPY ./docker/nginx.conf /etc/nginx/nginx.conf
COPY --from=build /app/dist/[PROJECT NAME] /usr/share/nginx/html

COPY ./docker/run.sh ./run.sh

ENTRYPOINT ["sh", "run.sh"]

The run.sh script:

for mainfile in $(ls /usr/share/nginx/html/main*.js);
do
  envsubst '$HOST_NAME' < $mainfile > main.tmp;
  mv main.tmp $mainfile;
done

nginx -g 'daemon off;'

I can not find any error in this configuration, any ideas?


Solution

Just posting the answer here for others to find if needed.

The Problem was, that I had a semicolon in the run.sh file. At the end of the for loop. So the correct script is:

for mainfile in $(ls /usr/share/nginx/html/main*.js)
do
  envsubst '$HOST_NAME' < $mainfile > main.tmp;
  mv main.tmp $mainfile;
done

nginx -g 'daemon off;'

Thanks to @DavidMaze for the help!



Answered By - Tim Gabrikowski
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Tuesday

404 Error on page refresh with Angular 7, NGINX and Docker

 3:58 AM     angular, docker, nginx     No comments   

Issue

I have an application written in Angular 7 that I am deploying to a Docker container with NGINX. When I run the container, everything works perfectly except that if i Refresh the page in the browser (F5) I get an NGINX 404 error page.

Here is my nginx.conf file from which you can see ive tried "try_files"

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80; 

        location / {
            root /usr/share/nginx/html;
            index index.html;
            try_files $uri /index.html;
        }
    }
}

My Dockerfile:

FROM node:alpine as builder
RUN apk update && apk add --no-cache make git

WORKDIR /app

COPY package.json package-lock.json /app/
RUN cd /app && npm install

COPY .  /app
RUN cd /app && npm run build

FROM nginx:alpine

RUN rm -rf /usr/share/nginx/html/* && rm -rf /etc/nginx/nginx.conf
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY --from=builder /app/dist/hyper-client-admin /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Directory on the deployed container is:

/usr/share/nginx/html # ls -la
total 23564
drwxr-xr-x    1 root     root          4096 May 20 00:18 .
drwxr-xr-x    1 root     root          4096 Mar  8 03:05 ..
drwxr-xr-x    2 root     root          4096 May 20 00:18 assets
-rw-r--r--    1 root     root        290728 May 20 00:18 es2015-polyfills.js
-rw-r--r--    1 root     root        211178 May 20 00:18 es2015-polyfills.js.map
-rw-r--r--    1 root     root           997 May 20 00:18 favicon.png
-rw-r--r--    1 root     root           770 May 20 00:18 index.html
-rw-r--r--    1 root     root        114749 May 20 00:18 main.js
-rw-r--r--    1 root     root        115163 May 20 00:18 main.js.map
-rw-r--r--    1 root     root        241546 May 20 00:18 polyfills.js
-rw-r--r--    1 root     root        240220 May 20 00:18 polyfills.js.map
-rw-r--r--    1 root     root          6224 May 20 00:18 runtime.js
-rw-r--r--    1 root     root          6214 May 20 00:18 runtime.js.map
-rw-r--r--    1 root     root       1117457 May 20 00:18 styles.js
-rw-r--r--    1 root     root       1191427 May 20 00:18 styles.js.map
-rw-r--r--    1 root     root      10048515 May 20 00:18 vendor.js
-rw-r--r--    1 root     root      10505601 May 20 00:18 vendor.js.map

And here is the console output:

172.17.0.1 - - [20/May/2019:00:18:30 +0000] "GET / HTTP/1.1" 200 371 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36" "-"lopment\hyper-client-admin>
172.17.0.1 - - [20/May/2019:00:18:30 +0000] "GET /runtime.js HTTP/1.1" 200 6224 "http://localhost:81/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36" "-"
172.17.0.1 - - [20/May/2019:00:18:30 +0000] "GET /polyfills.js HTTP/1.1" 200 241546 "http://localhost:81/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36" "-"
172.17.0.1 - - [20/May/2019:00:18:30 +0000] "GET /main.js HTTP/1.1" 200 114749 "http://localhost:81/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/74.0.3729.157 Safari/537.36" "-"
172.17.0.1 - - [20/May/2019:00:18:30 +0000] "GET /styles.js HTTP/1.1" 200 1117457 "http://localhost:81/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36" "-"
172.17.0.1 - - [20/May/2019:00:18:30 +0000] "GET /vendor.js HTTP/1.1" 200 10048515 "http://localhost:81/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36" "-"
172.17.0.1 - - [20/May/2019:00:18:31 +0000] "GET /assets/logo-white.svg HTTP/1.1" 200 4519 "http://localhost:81/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/74.0.3729.157 Safari/537.36" "-"
172.17.0.1 - - [20/May/2019:00:18:31 +0000] "GET /favicon.png HTTP/1.1" 200 997 "http://localhost:81/login" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36" "-"
172.17.0.1 - - [20/May/2019:00:18:35 +0000] "GET /login HTTP/1.1" 404 188 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36" "-"
2019/05/20 00:18:35 [error] 6#6: *4 open() "/usr/share/nginx/html/login" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /login HTTP/1.1", host: "localhost:81"

Any ideas whats going on here?

UPDATE: The actual answer to this lies in the comments of @Rajesh's Answer. The issue is that I was working on /etc/nginx/nginx.conf and I needed to be working on /etc/nginx/conf.d/default.conf


Solution

With a refresh on Angular app, we need to tell nginx web server to first look at the index.html file if the requested route exists or not before showing the error page. This is working fine for me:

nginx.conf

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

Dockerfile

FROM node:16-alpine as node
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build --prod

FROM nginx:alpine
COPY ./nginx.conf /etc/nginx/conf.d/default.conf # Not /etc/nginx/nginx.conf
COPY --from=node /app/dist/myapp /usr/share/nginx/html


Answered By - rajesh-nitc
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

How to create a Docker container of an AngularJS app?

 10:44 AM     angularjs, containers, docker, dockerfile, nginx     No comments   

Issue

I have an AngularJS app that has this structure:

app/
----- controllers/
---------- mainController.js
---------- otherController.js
----- directives/
---------- mainDirective.js
---------- otherDirective.js
----- services/
---------- userService.js
---------- itemService.js
----- js/
---------- bootstrap.js
---------- jquery.js
----- app.js
views/
----- mainView.html
----- otherView.html
----- index.html

How do I go about creating my own image out of this and running it on a container? I've tried running it with no success with a Dockerfile and I'm relatively new to Docker so apologies if this is simple. I just want to run it on a http server (using nginx perhaps?)

I've tried these for help, to no success:

  • https://www.quora.com/Can-I-have-an-Angular-app-on-Docker-container
  • AngularJS and NodeJS app in Docker
  • Dockerize your Angular NodeJS application

Solution

First of all, follow this best practice guide to build your angular app structure. The index.html should be placed in the root folder. I am not sure if the following steps will work, if it's not there.

To use a nginx, you can follow this small tutorial: Dockerized Angular app with nginx

1.Create a Dockerfile in the root folder of your app (next to your index.html)

FROM nginx
COPY ./ /usr/share/nginx/html
EXPOSE 80

2.Run docker build -t my-angular-app . in the folder of your Dockerfile.

3.docker run -p 80:80 -d my-angular-app and then you can access your app http://localhost



Answered By - adebasi
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Wednesday

Failed to load resource: net::ERR_NAME_NOT_RESOLVED error

 1:56 AM     angular, docker, docker-compose, frontend, nginx     No comments   

Issue

I am writing an application. I write .net for the backend and Angular for the frontend. When dockering, I put my frontend application inside nginx. Dockerfile is like this

FROM node:20.10-alpine AS build
WORKDIR /app
COPY package*.json .
RUN npm install
RUN npx ngcc --properties es2023 browser module main --first-only --create-ivy-entry-points
COPY . .
RUN npm run build --prod

FROM nginx:stable
COPY --from=build /app/dist/librari-fy/ /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

nginx.conf is as follows:

worker_processes 1;


events {
    worker_connections 1024;
}


http {
    server {
        listen 80;
        server_name http://backend:80;

        root /usr/share/nginx/html/browser;
        index index.html index.htm;
        include /etc/nginx/mime.types;


        gzip on;
        gzip_http_version 1.1;
        gzip_disable      "MSIE [1-6]\.";
        gzip_min_length   256;
        gzip_vary         on;
        gzip_proxied      expired no-cache no-store private auth;
        gzip_types        text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_comp_level   9;

        location / {
            try_files $uri $uri/ /index.html;
            add_header Access-Control-Allow-Origin *;
            add_header 'Access-Control-Allow-Origin' 'http://localhost:4200' always;
        }
    }
}

Docker-compose file :

version: '3.8'

services:
  postgres:
    image: postgres:16-alpine
    container_name: postgredatabase
    restart: always
    environment:
      POSTGRES_PASSWORD: UArA0CGd5y1g5sE7U0OH
      POSTGRES_USER: libraryadmin
      POSTGRES_DB: Library
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app_internal_network
    healthcheck:
      test: pg_isready
      interval: 10s
      timeout: 60s
      retries: 5
      start_period: 80s 
    
  backend:
    image: sahinyakici/librarybackend:latest
    restart: always
    container_name: backend
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - app_internal_network
    ports:
      - "8080:80"

  frontend:
    container_name: librarify
    image: sahinyakici/librarify:latest
    restart: always
    depends_on:
      - backend
    networks:
      - app_internal_network
    ports:
      - 80:80
    expose:
      - 80

volumes:
  postgres_data:

networks:
  app_internal_network:
    driver: bridge

The applications run successfully, but I get the following error in the console in the website: "Failed to load resource: net::ERR_NAME_NOT_RESOLVED". If I go into the UI container and try with curl, I can fetch data from the backend. What do you think is the problem?

Error screenshot Error2 Error3

I tried using Curl from within the container.


Solution

Frontend code is executed client side, meaning the browser processes the code and not the NGINX web server. When you request your Frontend container, the NGINX server returns the HTML, CSS and Javascript files of your website, which are interpreted by browser.

Therefore you're browser, and by extend your computer, will be the one making requesting the backend API. So the backend URL configured within the frontend should be http://localhost:8080 rather than http://backend

Your NGINX server should only be serving the Frontend files. Fix the server_name to localhost and fix the Backend URL within your Frontend code to http://localhost:8080



Answered By - ABWassim
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Tuesday

The Angular application I serve with NGINX does not display images

 5:44 PM     angular, docker, docker-compose, frontend, nginx     No comments   

Issue

I'm writing a full stack application. I wrote Angular for the front end and serve it with nginx docker. I can receive data by communicating with the backend. Imagepath is among this data. In this way, I can show the images locally, but I think it is due to Docker and Nginx that the image path is not displayed even if it is correct. I leave an image as an example, the image src part is correct. If I go to this path in the container, I can see the picture, but I cannot see the picture on the screen. Didn't show image

My nginx.conf file:

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    server {
        listen 80;
        server_name localhost;

        root /usr/share/nginx/html/browser;
        index index.html index.htm;
        include /etc/nginx/mime.types;

        gzip on;
        gzip_http_version 1.1;
        gzip_disable "MSIE [1-6]\.";
        gzip_min_length 256;
        gzip_vary on;
        gzip_proxied expired no-cache no-store private auth;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_comp_level 9;

        location / {
            try_files $uri $uri/ /index.html;
            add_header Access-Control-Allow-Origin *;
        }

        location /users_books_pictures/ {
            alias /usr/share/nginx/html/data/;
        }
    }
}

Dockerfile for frontend:

FROM node:20.10-alpine AS build
WORKDIR /app
COPY package*.json .
RUN npm install
RUN npx ngcc --properties es2023 browser module main --first-only --create-ivy-entry-points
COPY . .
RUN npm run build --prod

FROM nginx:stable
COPY --from=build /app/dist/librari-fy/ /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

Docker-compose file:

version: '3.8'

services:
  postgres:
    image: postgres:16-alpine
    container_name: postgredatabase
    restart: always
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_USER: admin
      POSTGRES_DB: Library
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app_internal_network
    healthcheck:
      test: pg_isready
      interval: 10s
      timeout: 60s
      retries: 5
      start_period: 80s 
    
  backend:
    image: sahinyakici/librarybackend:latest
    restart: always
    container_name: backend
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - app_internal_network
    ports:
      - "8080:80"
    volumes:
      - postgres_data:/app/users_books_pictures

  frontend:
    container_name: librarify
    image: sahinyakici/librarify:latest
    restart: always
    depends_on:
      - backend
    networks:
      - app_internal_network
    ports:
      - 80:80
    expose:
      - 80
    volumes:
      - postgres_data:/usr/share/nginx/html/data

volumes:
  postgres_data:

networks:
  app_internal_network:
    driver: bridge

I changed the Nginx configurations and searched for an answer in the forum but could not find it.

Incoming data


Solution

The root URL of your NGINX server is already set to /usr/share/nginx/html/browser, so you don't need to add this prefix to your imagePath data. NGINX will look in the root folder by default and try to get a ressource at the path specified by your URL, from the root folder.

Therefore you need to remove /usr/share/nginx/html/browser prefix of your imagePath datas and it should do the trick :)



Answered By - ABWassim
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

run npm ci hangs on docker build ubuntu

 5:29 AM     docker, ionic-framework, npm, ubuntu-16.04     No comments   

Issue

I'm trying to build a docker file for an ionic project, on ubuntu virtualbox. Here's the dockerfile:

# Build
FROM beevelop/ionic AS ionic
# Create the application directory
WORKDIR /usr/src/app
# Install the application dependencies
# We can use wildcard to ensure both package.json AND package-lock.json are considered
# where available (npm@5+)
COPY package*.json ./
RUN npm --verbose ci
# Bundle app source
COPY . .
RUN ionic build

## Run 
FROM nginx:alpine
#COPY www /usr/share/nginx/html
COPY --from=ionic /usr/src/app/www /usr/share/nginx/html

My problem is that the build gets stuck on step 4 (RUN npm --verbose ci) It starts downloading some packages, but then it hangs at some point. I tried different solution:

npm clean cache
npm config set registry http://registry.npmjs.org/

removing package-lock.json

But nothing works, any help will be greatly apprecited. Thanks in advance


Solution

To whoever experienced this problem, it was to due to internet connection. Keep trying until it downloads all the packages.



Answered By - Fahima Mokhtari
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Sunday

"Error: Cannot find module - ng" when trying to build Ionic/Angular app in Docker

 10:17 PM     angular, build, docker, ionic-framework, node.js     No comments   

Issue

Steps to reproduce the error:

versions:

Angular CLI: 15.2.7
Node: 16.18.0
Package Manager: pnpm 8.4.0
Ionic: 7.1.1
Docker version 23.0.5, build bc4487a

configure ionic to use pnpm:

ionic config set -g npmClient pnpm

create app:

ionic start myApp tabs --capacitor

add the following Dockerfile:

FROM node:latest as build
WORKDIR /usr/local/app
COPY ./ /usr/local/app/
SHELL ["/bin/bash", "-c"]
RUN npm install --global pnpm \
    && SHELL=bash pnpm setup \
    && source /root/.bashrc
ENV PNPM_HOME="/root/.local/share/pnpm"
ENV PATH="${PATH}:${PNPM_HOME}"
RUN pnpm install -g @angular/cli
RUN pnpm install -g @ionic/cli
RUN ionic config set -g npmClient pnpm
RUN pnpm install
RUN pnpm run build

FROM nginx:latest
COPY --from=build /usr/local/app/www usr/share/nginx/html
EXPOSE 80

run:

docker build --pull --rm -f "Dockerfile" -t myapp:latest "."

this is my error:

 > [build 9/9] RUN pnpm run build:
#0 0.807
#0 0.807 > MyApp@0.0.1 build /usr/local/app
#0 0.807 > ng build
#0 0.807
#0 0.828 node:internal/modules/cjs/loader:1085
#0 0.828   throw err;
#0 0.828   ^
#0 0.828
#0 0.828 Error: Cannot find module '/usr/local/app/node_modules/@angular/cli/bin/ng.js'
#0 0.828     at Module._resolveFilename (node:internal/modules/cjs/loader:1082:15)
#0 0.828     at Module._load (node:internal/modules/cjs/loader:928:27)
#0 0.828     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
#0 0.828     at node:internal/main/run_main_module:23:47 {
#0 0.828   code: 'MODULE_NOT_FOUND',
#0 0.828   requireStack: []
#0 0.828 }
#0 0.828
#0 0.828 Node.js v20.0.0
#0 0.833  ELIFECYCLE  Command failed with exit code 1.
------
Dockerfile:25
--------------------
  23 |     RUN pnpm install
  24 |     # Generate the build of the app
  25 | >>> RUN pnpm run build
  26 |
  27 |     # 2. Serve app
--------------------
ERROR: failed to solve: process "/bin/bash -c pnpm run build" did not complete successfully: exit code: 1

Funnily enough, the whole app built just fine yesterday. Might it be a docker/angular bug?


Solution

The issue seems to have been because of a buggy pnpm version. Downgrading to pnpm@latest-7 (instead of 8.4.0) fixed the problem



Answered By - Lorand
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Tuesday

How can I run an npm command in a docker container?

 12:21 AM     angular, docker, docker-compose, node.js, npm     No comments   

Issue

I am trying to run an angular application in development mode inside a docker container, but when i run it with docker-compose build it works correctly but when i try to put up the container i obtain the below error:



ERROR: for sypgod  Cannot start service sypgod: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"npm\": executable file not found in $PATH

The real problem is that it doesn't recognize the command npm serve, but why??

The setup would be below:

Docker container (Nginx Reverse proxy -> Angular running in port 4000)

I know that there are better ways of deploying this but at this moment I need this setup for some personals reasons

Dockerfile:


FROM node:10.9 


COPY package.json package-lock.json ./

RUN npm ci && mkdir /angular && mv ./node_modules ./angular

WORKDIR /angular

RUN npm install -g @angular/cli 

COPY . . 


FROM nginx:alpine
COPY toborFront.conf /etc/nginx/conf.d/
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
CMD ["npm", "serve", "--port 4000"]

NginxServerSite

server{
    listen 80;
    server_name sypgod;


    location / {
            proxy_read_timeout 5m;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://localhost:4000/;


    }

}


Docker Compose file(the important part where I have the problem)

 sypgod: # The name of the service
        container_name: sypgod  # Container name
        build: 
            context: ../angular
            dockerfile: Dockerfile # Location of our Dockerfile



Solution

The image that's finally getting run is this:

FROM nginx:alpine
COPY toborFront.conf /etc/nginx/conf.d/
EXPOSE 8080
CMD ["npm", "serve", "--port 4000"]

The first stage doesn't have any effect (you could COPY --from=... files out of it), and if there are multiple CMDs, only the last one has an effect. Since you're running this in a plain nginx image, there's no npm command, leading to the error you see.

I'd recommend using Node on the host for a live development environment. When you've built and tested your application and are looking to deploy it, then use Docker if that's appropriate. In your Dockerfile, run ng build in the first stage to compile the application to static files, add a COPY --from=... in the second stage to get the built application into the Nginx image, and delete all the CMD lines (nginx has an appropriate default CMD). @VikramJakhar's answer has a more complete Dockerfile showing this.

It looks like you might be trying to run both Nginx and the Angular development server in Docker. If that's your goal, you need to run these in two separate containers. To do this:

  • Split this Dockerfile into two. Put the CMD ["npm", "serve"] line at the end of the first (Angular-only) Dockerfile.
  • Add a second block in the docker-compose.yml file to run the second container. The backend npm serve container doesn't need to publish ports:.
  • Change the host name of the backend server in the Nginx config from localhost to the Docker Compose name of the other container.


Answered By - David Maze
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Monday

Crashin Angular project docker container

 2:53 AM     angular, docker, node-modules     No comments   

Issue

I have docker container for angular project, using node 18; Dockerfile:

FROM node:18

WORKDIR /app

COPY package*.json ./
RUN npm update

RUN npm install

COPY . .

EXPOSE 4200

CMD ["ng", "serve", "--host", "0.0.0.0", "--port", "4200"]

problem is when I run sudo docker-copmose build, its good but then i try sudo docker-compose up it has an errors :

auralab-angular | Node packages may not be installed. Try installing with 'npm install'. auralab-angular | Error: Could not find the '@angular-devkit/build-angular:dev-server' builder's node package. auralab-angular exited with code 1

I am using google-cloud unbutu machine, but i dont know error reason. docker-compose.yaml:

angular:
    image: auralab-angular:latest
    container_name: auralab-angular
    build:
      context: ./client
      dockerfile: Dockerfile
    volumes:
      - ./client:/app
    ports:
      - "4200:4200"
    command: ["ng", "serve", "--host", "0.0.0.0", "--port", "4200"]
    depends_on:
      - django

structure is :

project:
|___client:
|_______Dockerfile
|_______other files;
|___docker-compose.yaml

Solution

You'll need to install the Angular CLI inside your Docker container.

FROM node:18

WORKDIR /app

COPY package*.json ./

# Install Angular CLI globally
RUN npm install -g @angular/cli

RUN npm install

COPY . .

EXPOSE 4200

CMD ["ng", "serve", "--host", "0.0.0.0", "--port", "4200"]


Answered By - Ale_Bianco
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Saturday

Problem during building Docker container with Angular

 1:13 AM     angular, docker, docker-compose, dockerfile, windows     No comments   

Issue

My Dockerfile for frontend in Angular:

FROM node:18.10.0 as builder
WORKDIR /app/binder-web-frontend
# WORKDIR /app

COPY package.json package-lock.json ./

RUN npm ci
RUN npm install -g @angular/cli@15

COPY . .

EXPOSE 4200

ENV PORT 4200

CMD ["ng", "serve"]

docker-compose:

  angular-app:
    build:
      context: .
      dockerfile: binder-web-frontend/Dockerfile
    ports: 
      - '4200:4200'
    command: "ng serve --open --host 0.0.0.0 --port 4200 --disable-host-check"
    #
    # volumes: 
      # - ./:/app/binder-web-backend
      # - /binder-web-frontend/node_modules:/app/binder-web-frontend/node_modules
      # - /app/node_modules

As you can see in the screenshots, Docker itself is being built in the frontend folder ** /binder-web-frontend **. When I run **docker-compose ** it doesn't want to copy package.json. The file structure is as follows: Solution/web-frontend/package.json +node_modules are also located here.

enter image description here

enter image description here

This is my first experience with Docker and I'm a bit confused. Thanks in advance for your help/advice.


Solution

change docker-compose file to:

build:
    context: binder-web-frontend/.

it's becuase your docker-copose file and your Dockerfile are not in the same directory.



Answered By - Mojtaba Nejad Poor Esmaeili
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Tuesday

Unable to Dockerize Vite React-Typescript Project

 3:18 AM     docker, node.js, reactjs, typescript, vite     No comments   

Issue

I am trying to dockerize a Vite React-Typescript boilerplate setup, but I unable to connect to the container.

Installed vite-react-typescript boilerplate:

npm init vite@latest vite-docker-demo -- --template react-ts

Dockerfile

# Declare the base image
FROM node:lts-alpine3.14
# Build step
# 1. copy package.json and package-lock.json to /app dir
RUN mkdir /app
COPY package*.json /app
# 2. Change working directory to newly created app dir
WORKDIR /app
# 3 . Install dependencies
RUN npm ci
# 4. Copy the source code to /app dir
COPY . .
# 5. Expose port 3000 on the container
EXPOSE 3000
# 6. Run the app
CMD ["npm", "run", "dev"]

Command to run docker container in detached mode and open local dev port 3000 on host: docker run -d -p 3000:3000 vite

The vite instance seems to be running just fine within the container (docker logs output):

> vite-docker@0.0.0 dev /app
> vite

Pre-bundling dependencies:
  react
  react-dom
(this will be run only when your dependencies or config have changed)

  vite v2.4.4 dev server running at:

  > Local: http://localhost:3000/
  > Network: use `--host` to expose

  ready in 244ms.

However, when I navigate to http://localhost:3000/ within Chrome. I see an error indicating The connection was reset.

Any help resolving this issue would be greatly appreciated!


Solution

It turns out that I needed to configure host to something other than localhost.

Within vite.config.ts:

import { defineConfig } from 'vite'
import reactRefresh from '@vitejs/plugin-react-refresh'

// https://vitejs.dev/config/
export default defineConfig({
  server: {
    host: '0.0.0.0',
    port: 3000,
  },
  plugins: [reactRefresh()],
})

Resolves the issue.



Answered By - Cesar Napoleon Mejia Leiva
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Friday

How to run Renovate inside a Ubuntu 20.04 Docker container?

 5:20 PM     docker, renovate, typescript     No comments   

Issue

I want to run Renovate inside a a Ubuntu 20.04 docker container, but renovate does not seem to work. Here are the step to repdocue my setting:

docker run -it ubuntu:20.04 /bin/bash
apt update
apt upgrade
printf 'y\n1\n\1n' | apt install nodejs
apt install -y npm
npm install -g renovate
renovate --version

renovate --version gives me:

/usr/local/lib/node_modules/renovate/dist/logger/index.js:13
let logContext = process.env.LOG_CONTEXT ?? (0, nanoid_1.nanoid)();
                                          ^

SyntaxError: Unexpected token ?
    at Module._compile (internal/modules/cjs/loader.js:723:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Object.<anonymous> (/usr/local/lib/node_modules/renovate/dist/renovate.js:5:18)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
root@3b484953056f:/# renovate --version
/usr/local/lib/node_modules/renovate/dist/logger/index.js:13
let logContext = process.env.LOG_CONTEXT ?? (0, nanoid_1.nanoid)();
                                          ^

SyntaxError: Unexpected token ?
    at Module._compile (internal/modules/cjs/loader.js:723:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Object.<anonymous> (/usr/local/lib/node_modules/renovate/dist/renovate.js:5:18)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)

Any ideas what I am doing wrong here? Do I need to setup RENOVATE_LOG_CONTEXT? If so, how can this be done?


Solution

Check the node and git versions. Must be updated or will get that error.



Answered By - eredar
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Wednesday

Read substitution var from Google Cloud Build into Dockerfile

 6:49 AM     angular, docker, google-cloud-platform     No comments   

Issue

I have an angular app that I have deployed on Google Cloud with the following cloudbuild.yaml file:

steps:
  - name: "gcr.io/cloud-builders/docker"
    env:
      - "_ANGULAR_ENV=$_ANGULAR_ENV"
    args: ["build", "-t", "gcr.io/$PROJECT_ID/${_SERVICE_NAME}:${SHORT_SHA}", "--build-arg", "ENV=${_ANGULAR_ENV}", "-f", "Dockerfile", "."]

  - name: "gcr.io/cloud-builders/docker"
    args: ["push", "gcr.io/$PROJECT_ID/${_SERVICE_NAME}:${SHORT_SHA}"]

  - name: "gcr.io/cloud-builders/gcloud"
    args:
      [
        "run",
        "deploy", 
        "${_SERVICE_NAME}",
        "--image",
        "gcr.io/$PROJECT_ID/${_SERVICE_NAME}:${SHORT_SHA}",
        "--region",
        "europe-north1",
        "--platform",
        "managed",
        "--allow-unauthenticated"
      ]

I want to read the value of _ANGULAR_ENV which I provide in the cloud build trigger inside substitution variables section:

enter image description here

and pass this value to the Dockerfile as following:

#Arguments
ARG ENV

.
.
.
## Install dependencies
RUN npm install
## Build the angular app in production mode and store the artifacts in dist folder

RUN echo 'ENVIRONMENT:' $ENV
RUN ng build --configuration=$ENV --output-path=dist
.
.
. 

I am trying to specify if its a development deploy or production one via this variable but when I print the value as above its blank and doesnt get the value from google build. I am not sure as to what am I missing here.


Solution

So after spending days on this the issue turned out to be simpler. The place of ARG ENV turned out to be the wrong one. Instead of being at the top, it has to be just a line above its usage as you can see from the working solution:

.
.
.
## Install dependencies
RUN npm install
## Build the angular app in production mode and store the artifacts in dist folder
#Arguments
ARG ENV
RUN echo 'ENVIRONMENT:' $ENV
RUN ng build --configuration=$ENV --output-path=dist
.
.
. 


Answered By - Muhamed Krasniqi
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Thursday

How to have and read an environment file after an angular application has been built

 11:53 AM     angular, deployment, docker, production-environment     No comments   

Issue

I'm building an angular application. This angular application will be delivered to multiple clients with different needs and infrastructure. It will need several values (for example backend server, title, ...) that should be configurable by the customer when doing the installation of this.

In debug, I can totally imagine those values coming from the environnments/environments.ts file, but once built, the environment.prod.ts cannot be changed anymore and therefore might not be built.

How can I provide values(I guess either by some file or environment variables) to the angular application(and how can I read them)?

It has not been decided yet, but most probably the built files will be wrapped in an nginx docker image.


Solution

Considering you want to first build your app, and then select a specific environment to deploy it, this tutorial may be of use to you. In summary you just have to follow 4 steps:

  1. Add a JSON configuration file in the src folder
  2. Update our angular/webpack configuration to include the file in our dist folder
  3. Add a simple configuration service with a call to get our config data from our config file
  4. Use APP_INITIALIZER to invoke the method retrieving our config data during the bootstrap process

If you follow those 4 steps, your configuration will be a JSON inside your dist folder (or whatever other outputPath you have in your angular.json file).

As for the docker part, you could add the config file directly inside the nginx container. Although I am guessing you would prefer to create a docker volume. So you not have to worry about copying the right config file for each client and instead just keep their specific config file in their servers.



Answered By - David Alberici
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Sunday

Gitlab CI Angular Artifacts not accessible

 7:51 AM     angular, docker, gitlab, gitlab-ci     No comments   

Issue

I'm trying to build and deploy my angular project with gitlab pipelines. There are two jobs. One for building the angular app and one for the deployment. My gitlab-ci.yml looks like this.

image: node:latest

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
  - node_modules/

before_script:
  - npm install > /dev/null

stages:
  - build
  - deploy

build:
    stage: build
    artifacts: 
        paths:
            - dist/
        expire_in: 1 week
    script:
        - npm run build --prod

deploy:
  stage: deploy
  dependencies:
    - build
  environment: production
  image: mjsarfatti/gitlab-ci-pipeline-php-aws:latest
  before_script:
    - mkdir ~/.aws/
    - touch ~/.aws/credentials
    - printf "[eb-cli]\naws_access_key_id = %s\naws_secret_access_key = %s\n" "$AWS_ACCESS_KEY_ID" "$AWS_SECRET_ACCESS_KEY" >> ~/.aws/credentials
  script:
    - git checkout master
    - eb deploy my_project
  only:
    - master

The aws cli used in the deploy job builds the dockerfile located in my project root. My problem is that every time when I run the deploy job I get this error:

Step 3/7 : COPY dist/src /usr/share/nginx/html
44 COPY failed: stat /var/lib/docker/tmp/docker-builder648218383/dist/src: no such file or directory.

It seems like that the artifact from the previous build job is missing. What is wrong with my gitlab-ci.yaml file?


Solution

When artifacts are extracted into other pipeline steps, it's extracted in a different location that your code that's pulled down via git. For me, I've seen the artifact(s) put in the parent directory from where my code is. So for example if I have this directory structure:

--- gitlab_ci_root
   --- my_code

The extracted artifacts will be put under gitlab_ci_root, not my_code.

You can test this by putting a couple of ls's into your deploy step.

deploy:
  stage: deploy
  dependencies:
    - build
  environment: production
  image: mjsarfatti/gitlab-ci-pipeline-php-aws:latest
  before_script:
    - ls # directory list of current directory, likely your code
    - ls ../ # directory list of the parent directory.
    - mkdir ~/.aws/
    - touch ~/.aws/credentials
    - printf "[eb-cli]\naws_access_key_id = %s\naws_secret_access_key = %s\n" "$AWS_ACCESS_KEY_ID" "$AWS_SECRET_ACCESS_KEY" >> ~/.aws/credentials
  script:
    - git checkout master
    - eb deploy my_project
  only:
    - master

Once you find where the dist/ directory is being extracted, then in your script you can mv the dist to wherever you need it to be.



Answered By - Adam Marshall
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Tuesday

configuring communication between docker apps

 8:59 AM     angular, asp.net, configuration, docker, https     No comments   

Issue

my app is composed of dotnet backend, and angular frontend. During creation I ran them both separately (dotnet run, ng serve) in separate terminals. they were both running on localhost.

Now in order to deploy them I have containerized each one of them as a docker image on docker hub. I can get each one of them to run separately with docker run - but I can't get them to communicate.

I don't completely understand how localhost works in conjunction with containers and virtual machines, and am not sure how I need to configure them in order to make them work together. I have read up a lot, but haven't been able to find anything that touches exactly on this. any help would be amazing.

thanks!

I'm not sure which files deal with this so I am adding all the things that seem relevant:

the dockerfile for the angular:

FROM node:latest as node
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build --prod

FROM nginx:alpine
COPY --from=node /app/dist/web-pet-shop /usr/share/nginx/html

angular- environment.ts:

export const environment = {
  production: false,
  apiUrl: 'https://localhost:5001/api/'
};

environment.prod.ts:

export const environment = {
  production: true,
  apiUrl: 'api/'
};

proxy.conf.json:

{
    "/api": {
      "target": "https://localhost:5001",
      "secure": false
    }
  }

from the backend-

the dockerfile:

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "API.dll"]

from startup->configure

            app.UseCors(policy => policy
            .AllowAnyHeader()
            .AllowAnyMethod()
            .WithOrigins("https://localhost:4200"));

launchsettings.json:

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:29610",
      "sslPort": 44320
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "API": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Solution

You need to see the 2 containers as 2 different machines (computers/laptops). So when one of them says localhost then it is that host alone. It doesn't know about the other one.

For these 2 containers to see each other they need to be on the same network and then they can call each other by name.

# create a network
docker network create my_network

# start frontend container
docker run \
  -d --name frontend \
  --network my_network \
  -p <your_exposed_port> \
  <frontend_image>

# start backend container
docker run \
  -d --name backend \
  --network my_network \
  <backend_image>

With this setup, the frontend can talk to the backend on http://backend:<port>.

You can also use docker-compose then to make things easier.



Answered By - Mihai
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Monday

Mixed Content error after migrating from Angular 7 to 12

 7:31 AM     angular, angular-devkit, angular12, docker, ng-build     No comments   

Issue

The stack: Angular 12 with .NET, running in a Docker container. Bundles are being built by @angular-devkit/build-angular:browser.

Last working setup: The application ran previously on Angular 7, all the assets were indeed served over HTTPS.

The problem: While running over HTTPS, Angular 12 bundle is serving assets incl. main.js, polyfills, stylesheet or favicon over HTTP. This is causing the following error for bundles, polyfills, styles.css and favicons:

Mixed Content: The page was loaded over HTTPS, but requested an insecure X. This request has been blocked; the content must be served over HTTPS.

My #1 suspect is the ng build process, although I'm not aware of a way to determine the way, the assets are served(?) Therefore I mentioned the rest of the stack to check there if needed.

UPDATE: I marked one answer but it's a workaround that I decided to go with as good enough, although there should be a more in-depth solution that I'm still hoping to find.


Solution

If you are upgrading Angular 7 to Angular 12 directly then you will get below error:

"Updating multiple major versions at once is not recommended."

Assuming that you have Angular 7 installed on the project, now you need to first upgrading your application to Angular 8, then Angular 8 to Angular 9, then Angular 9 to Angular 10, then Angular 10 to Angular 11:

ng update @angular/core@6 @angular/cli@6 --force
ng update @angular/core@7 @angular/cli@7 --force
ng update @angular/core@8 @angular/cli@8 --force
ng update @angular/core@9 @angular/cli@9 --force
ng update @angular/core@10 @angular/cli@10 --force
ng update @angular/core@11 @angular/cli@11 --force

Now, you have upgraded your Angular 7 application to Angular 11, so you will run the below command to upgrade to latest Angular 12 version:

ng update @angular/core@12 @angular/cli@12 --force

--force to the ng update command has been appended incase if it gives "Incompatible peer dependencies found" error.

EDIT

Add the following meta tag to your <head> element in your HTML:

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">


Answered By - Salahuddin Ahmed
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg
Older Posts Home

Popular Posts

  • Letting items go off the div in a horizontal list
    Issue I am trying to recreate this concept app's home page with html css only....
  • Scroll capturing not working because the Svelte slot is inside the Drawer component (Header)
    Issue I was searching for a way to scroll to an element in order to trigger an event. I no...
  • npm ci command failing with "Cannot read property '@angular/animations' of undefined"
    Issue While performing docker build for my Angular project, In the npm ci step, I...
  • How to test Input with React Testing Library?
    Issue I am trying to test an input value of Search component via React Testing L...
  • Typescript generating javascript that doesn't work
    Issue Node is not happy about something in the Javascript that TypeScript is gener...
  • Create a DisplayComponent having a display-component selector
    Issue I am asked to create an Angular component named DisplayComponent and having display...
  • Typescript DiscordJS bot audio stops working after a few seconds of playing
    Issue I am currently facing an issue with playing audio through a bot I made for d...
  • Ionic Capacitor no capacitor.config.json but instead capacitor.config.ts
    Issue I created an Angular/Ionic project with capacitor. Now I wanted to make changes in m...
  • TypeError: Body is unusable - NextJS Server Action POST
    Issue I am using NextJS v14.1.0 and server action in client component. I get the p...
  • Angular FormGroup in Storybook: Converting circular structure to JSON
    Issue I'm work with angular and storybook. I have a FormGroup and FormArray in...

Labels

.d.ts .htaccess .net .net-5 .net-6.0 .net-8.0 .net-core 2-way-object-databinding 2d 3d 3d-model 3d-modelling 960.gs a2hs aar abortcontroller abp abp-framework absolute abstract abstract-class accelerator access-control-allow-origin access-token accessibility accordion ace-editor acfpro ack acronym action actioncable actionsheet active-directory adal adb adblock addeventlistener adfs adjustment adminlte admob adobe-brackets adonis.js adonisjs-ace ads adsense advanced-custom-fields advertisement-server adyen aes aframe ag-grid ag-grid-angular ag-grid-ng2 ag-grid-react aggregation agm agm-core agm-map agora-web-sdk-ng agora.io airbrake airplay airtable ajax ajax.net ajsf ajv alert alexa-skill alexa-skills-kit algebraic-data-types algolia algorithm alias alignment alpine.js alt alt-attribute altbeacon alter amazon-cloudformation amazon-cloudfront amazon-cognito amazon-dynamodb amazon-dynamodb-streams amazon-ec2 amazon-ecr amazon-elastic-beanstalk amazon-glacier amazon-iam amazon-rds amazon-s3 amazon-sns amazon-sqs amazon-vpc amazon-web-services amcharts amcharts4 amcharts5 amp-html ampersand amplify amplifyjs amplitude-analytics analytics anchor anchor-scroll anchor-solana android android-10.0 android-11 android-12 android-app-bundle android-appcompat android-build android-chrome android-dark-theme android-emulator android-espresso android-gradle-plugin android-intent android-location android-night-mode android-permissions android-sdk-tools android-softkeyboard android-spannable android-sqlite android-studio android-studio-4.2 android-toast android-tv android-vibration android-view android-webview androidx angle angular angular-abstract-control angular-activatedroute angular-akita angular-animations angular-auth-oidc-client angular-auxiliary-routes angular-binding angular-bootstrap angular-bootstrap-calendar angular-breadcrumb angular-broadcast angular-builder angular-cache angular-calendar angular-cdk angular-cdk-drag-drop angular-cdk-overlay angular-cdk-virtual-scroll angular-changedetection angular-chart angular-chosen angular-cli angular-cli-v6 angular-cli-v8 angular-cli-v9 angular-compiler angular-compiler-cli angular-component-life-cycle angular-component-router angular-components angular-config angular-content-projection angular-controller angular-controlvalueaccessor angular-cookies angular-custom-validators angular-dart angular-datatables angular-date-format angular-daterangepicker angular-decorator angular-dependency-injection angular-devkit angular-di angular-directive angular-dom-sanitizer angular-dragdrop angular-dynamic-components angular-dynamic-forms angular-e2e angular-elements angular-errorhandler angular-eslint angular-event-emitter angular-factory angular-file-upload angular-filters angular-flex-layout angular-fontawesome angular-formbuilder angular-formly angular-forms angular-fullstack angular-google-maps angular-gridster2 angular-guards angular-highcharts angular-http angular-http-interceptors angular-httpclient angular-httpclient-interceptors angular-hybrid angular-i18n angular-in-memory-web-api angular-inheritance angular-injector angular-input angular-ivy angular-jest angular-json angular-kendo angular-language-service angular-lazyloading angular-leaflet-directive angular-library angular-lifecycle-hooks angular-load-children angular-local-storage angular-localize angular-maps angular-material angular-material-15 angular-material-5 angular-material-6 angular-material-7 angular-material-datetimepicker angular-material-paginator angular-material-stepper angular-material-table angular-material-theming angular-material2 angular-migration angular-mock angular-module angular-module-federation angular-moment angular-nativescript angular-ng-class angular-ng-if angular-ngfor angular-ngmodel angular-ngmodelchange angular-ngrx-data angular-ngselect angular-nvd3 angular-oauth2-oidc angular-observable angular-output angular-package-format angular-pipe angular-promise angular-providers angular-pwa angular-reactive-forms angular-renderer angular-renderer2 angular-resolver angular-resource angular-route-guards angular-router angular-router-events angular-router-guards angular-router-params angular-routerlink angular-routing angular-schema-form angular-schematics angular-seed angular-service-worker angular-services angular-signals angular-slickgrid angular-social-login angular-socket-io angular-spectator angular-ssr angular-standalone-components angular-state-managmement angular-storybook angular-strap angular-structural-directive angular-template angular-template-form angular-template-variable angular-test angular-testing-library angular-theming angular-toastr angular-tour-of-heroes angular-transfer-state angular-translate angular-tree-component angular-trix angular-ui angular-ui-bootstrap angular-ui-grid angular-ui-modal angular-ui-router angular-ui-router-extras angular-ui-select angular-ui-tree angular-ui-typeahead angular-unit-test angular-universal angular-upgrade angular-validation angular-validator angular-webpack angular10 angular11 angular12 angular13 angular14 angular14upgrade angular15 angular16 angular17 angular2-animation angular2-aot angular2-changedetection angular2-cli angular2-components angular2-custom-pipes angular2-databinding angular2-decorators angular2-di angular2-directives angular2-form-validation angular2-formbuilder angular2-forms angular2-google-maps angular2-guards angular2-highcharts angular2-hostbinding angular2-http angular2-material angular2-meteor angular2-modules angular2-moment angular2-nativescript angular2-ngcontent angular2-ngmodel angular2-observables angular2-pipe angular2-providers angular2-router angular2-router3 angular2-routing angular2-select angular2-services angular2-styleguide angular2-template angular2-testing angular2-toaster angular2-ui-bootstrap angular2-universal angular2viewencapsulation angular4 angular4-aot angular4-forms angular4-router angular5 angular6 angular7 angular8 angular9 angularbuild angulardraganddroplists angularfire angularfire2 angularjs angularjs-1.5 angularjs-1.6 angularjs-authentication angularjs-bindings angularjs-bootstrap angularjs-compile angularjs-components angularjs-controller angularjs-controlleras angularjs-digest angularjs-directive angularjs-e2e angularjs-filter angularjs-forms angularjs-google-maps angularjs-http angularjs-interpolate angularjs-log angularjs-material angularjs-module angularjs-ng-change angularjs-ng-checked angularjs-ng-class angularjs-ng-click angularjs-ng-disabled angularjs-ng-form angularjs-ng-href angularjs-ng-if angularjs-ng-init angularjs-ng-model angularjs-ng-repeat angularjs-ng-route angularjs-ng-show angularjs-ng-switch angularjs-ng-transclude angularjs-ng-value angularjs-ngmock angularjs-nvd3-directives angularjs-orderby angularjs-q angularjs-resource angularjs-routing angularjs-scope angularjs-select angularjs-service angularjs-slider angularjs-templates angularjs-timeout angularjs-track-by angularjs-validation angularjs-watch angulartics animate-on-scroll animate.css animated animation anime.js annotations anonymous anonymous-function ansible ant-design-pro ant-media-server antd antialiasing antora antplus antv any aos.js aot apache apache-echarts apache-fop apache-kafka apache-spark apache-superset apache-zeppelin apache2 apex apexcharts api api-design api-gateway api-key apk apollo apollo-angular apollo-client apollo-server app-initializer app-router app-service-environment app-store appbar appdata appearance append appendchild appery.io appium appium-android apple-app-site-association apple-m1 apple-push-notifications applepay applepay-web applepayjs application-server apply aptana arabic arcgis-js-api architecture argument-passing arguments aria-role arima arquero array-filter array-merge array-reduce array-splice arraybuffer arraylist arrayobject arrayofarrays arrays arrow-functions arrow-keys article asar ascii asp-net-core-spa-services asp.net asp.net-ajax asp.net-core asp.net-core-2.0 asp.net-core-2.1 asp.net-core-3.1 asp.net-core-6.0 asp.net-core-7.0 asp.net-core-8 asp.net-core-css-isolation asp.net-core-identity asp.net-core-mvc asp.net-core-razor-pages asp.net-core-signalr asp.net-core-webapi asp.net-identity asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-5 asp.net-web-api asp.net-web-api-routing asp.net-web-api2 aspect-ratio aspnetboilerplate aspnetcore-environment assets assign astro astrojs async-await async-pipe asynchronous asynchronous-javascript atom-editor attachment attr attributes audio audio-streaming audiocontext audiotrack augmented-reality auth-guard auth0 auth0-connection authentication authority authorization authorize.net autocomplete autofill autofocus autogrow automated-tests automatic-ref-counting automation automation-testing autonumeric.js autoplay autoprefixer autoresize autosize autosuggest avatar avif awk aws-amplify aws-amplify-cli aws-amplify-vue aws-api-gateway aws-appsync aws-cdk aws-cdk-typescript aws-chatbot aws-cloudformation aws-cloudformation-custom-resource aws-code-deploy aws-codeartifact aws-codebuild aws-codepipeline aws-lambda aws-sam aws-sdk aws-sdk-js aws-secrets-manager aws-security-group aws-serverless aws-ssm aws-step-functions aws-userpools axes axios axis-labels azure azure-active-directory azure-ad-b2c azure-ad-b2c-custom-policy azure-ad-graph-api azure-ad-msal azure-api-management azure-application-insights azure-application-insights-profiler azure-appservice azure-blob-storage azure-cdn azure-cosmosdb azure-cosmosdb-sqlapi azure-devops azure-devops-extensions azure-devops-rest-api azure-functions azure-maps azure-notificationhub azure-pipelines azure-pipelines-yaml azure-signalr azure-static-web-app azure-static-website-hosting azure-storage azure-virtual-machine azure-virtual-network azure-web-app-service b2b babel-jest babel-loader babel-plugin-react-css-modules babeljs back back-button backbone-events backbone.js backdrop backend background background-clip background-color background-image background-size backstage badge bamboo banner bar-chart barcode-scanner base-tag base58 base64 base64url bash basic-authentication batch-file batch-processing bazel bdd bearer-token beautifulsoup beego behaviorsubject bem bigcartel bigint biginteger binance binance-api-client binary bind binding bing bing-maps bitbucket bitbucket-pipelines bitmap blade blazor blazor-hybrid blazor-server-side blazor-webassembly blazorise blending blob block blockchain blockly blockquote blogdown blogger blogs bluebird bluetooth bluetooth-lowenergy blur bnf body-parser boilerplate bokeh bold boolean boolean-logic boost-propertytree bootbox bootstrap-3 bootstrap-4 bootstrap-5 bootstrap-5.1 bootstrap-accordion bootstrap-cards bootstrap-carousel bootstrap-datepicker bootstrap-datetimepicker bootstrap-icons bootstrap-modal bootstrap-popover bootstrap-select bootstrap-table bootstrap-tags-input bootstrap-vue bootstrap5-modal border border-box border-image border-radius border-spacing botframework bottomnavigationview bower box box-shadow brain.js braintree branch breadcrumbs break breakpoints brightcove brightness broadcast browser browser-cache browser-detection browser-history browser-support browser-sync browser-tab browserstack bryntum-scheduler brython bubble-sort buffer build build-automation build-definition build-error build.gradle builtwith bull.js bullmq bulma bun bundler bundling-and-minification button buttonclick buttongroup buybutton.js c c# c#-4.0 c++ cache-control caching cakephp calc calculation calculator calendar calendly call callback callkit callstack camelcasing camera camera-api canactivate canactivatechild candeactivate cannon.js canvas capacitor capacitor-plugin capitalization capitalize capslock captcha caption capture capturestream capturing-group carbon-design-system card caret cargo carousel carriage-return cart cas case casting catalyst cdn cell center centering centos cgi cgi-bin chai chai-as-promised chakra-ui chalk change-detector-ref character character-encoding chart.js chart.js2 chartjs-2.6.0 chartjs-plugin-zoom charts chat chatbot checkbox checked checkmarx checkout cheerio child-process children chinese-locale chm choicesjs chord chrome-custom-tabs chrome-extension-manifest-v3 chromium chron chunking cicd circular-dependency citations cjk ckeditor ckeditor4.x ckeditor5 claims-authentication clasp class class-attributes class-names class-transformer class-validator classname clean-architecture clearfix clerk click clickable client client-side client-side-attacks client-side-validation clip clip-path clipboard clipping clock clone clonenode cloning closures cloud cloud-foundry cloudflare cloudinary cmd cocoapods code-coverage code-formatting code-generation code-injection code-push code-reuse code-signing code-translation codegen codehooks.io codeigniter codeigniter-3 codeigniter-restserver codelyzer codenameone codepen codesandbox coding-style coffeescript col collapsable collapse collation collect collections colon color-blending color-picker color-scheme color-space colors column-chart column-count column-width combinelatest combo-chart combobox cometchat command-line command-line-interface comments commonjs communication comobject compare comparison compass compass-sass compatibility compilation compile-time compiler-errors compiler-options compiler-warnings complextype component-store components compound-operator computed-properties computer-science computer-vision concatenation concatmap concurrently conditional conditional-compilation conditional-formatting conditional-operator conditional-rendering conditional-statements conditional-types config config.json configuration confirm confirm-dialog conflict connect-four connectivity console console.log constants constraint-validation-api constructor constructor-overloading contact contact-form-7 container-queries containers contains content-management-system content-security-policy content-type contenteditable contentproperty context-api contextmenu contextpath continuous-integration contrast contravariance controller controlvalueaccessor conventions converters cookies copy copy-constructor copy-paste cordova cordova-2.0.0 cordova-3 cordova-android cordova-ios cordova-plugin-advanced-http cordova-plugin-fcm cordova-plugin-firebasex cordova-plugin-proguard cordova-plugins core-js core-web-vitals correlation cors cors-anywhere couchdb countdown covariance cpanel cpu cpu-word crash create-react-app createcontext createelement createjs cron cropperjs cross-browser cross-domain cross-origin-read-blocking cross-origin-resource-policy cross-platform cross-window-scripting crt crud cryptography cryptojs cs50 csp csproj csrf csrf-token css css-animations css-calc css-cascade css-content css-counter css-filters css-float css-functions css-gradients css-grid css-houdini css-hyphens css-import css-in-js css-layer css-loader css-mask css-modules css-multicolumn-layout css-position css-print css-reset css-selectors css-shapes css-specificity css-sprites css-tables css-transforms css-transitions css-variables cssnano cssom csv cucumber cucumberjs cufon cumulative-layout-shift cups curl currency currency-formatting currency-pipe currying cursor curve custom-attributes custom-build custom-button custom-component custom-controls custom-cursor custom-data-attribute custom-directive custom-domain custom-element custom-font custom-post-type custom-type customization customvalidator cypress cypress-component-test-runner cypress-conditional-testing cypress-cucumber-preprocessor cypress-each d3-dag d3.js d3tree daisyui danfojs dangerouslysetinnerhtml darkmode dart dart-html dart-sass dashboard data-binding data-conversion data-retrieval data-structures data-transform data-uri data-visualization database database-migration dataframe datagrid datalist datasource datatable datatables date date-fns date-format date-formatting date-pipe date-range datepicker daterangepicker datetime datetime-format datetimepicker dayjs days deadline-timer debian debounce debouncing debugging decentralized-applications decimal decimalformat deck.gl declaration declarative declarative-programming declare decoder decoding decorator deep-copy deep-linking deeplink default default-value deferred deferred-loading defineproperty definitelytyped definition delay delegates deno denodb dependencies dependency-injection dependency-management deploying deployment deprecated descendant deserialization design-patterns desktop desktop-application destructuring details-tag detection dev-to-production developer-tools development-environment devexpress devextreme devextreme-angular device device-detection device-orientation devise devops devtools dexie dexiejs dhtml dhtmlx diagonal diagram dialog dictionary diff difference digital-ocean digital-signature dijit.layout directive directory directory-structure dirpagination disable disabled-control disabled-input discord discord.js discriminated-union dispatch display displayobject displaytag disqus distinct-values divi divi-theme divider division django django-admin django-celery django-crispy-forms django-csrf django-extensions django-filter django-forms django-models django-rest-framework django-templates django-views django-weasyprint django-webpack-loader djangocms-text-ckeditor dji-sdk dns docfx docker docker-compose docker-swarm dockerfile doctype document document-ready documentation dojo dom dom-events dom-manipulation dom-to-image domain-driven-design domain-name domdocument domparser dompdf donut-chart dotenv dotnetnuke download drag drag-and-drop draggable drake draw drawimage drawing drizzle drop-down-menu dropdown dropdownbox dropshadow dropzone.js drupal dry dspace dt dto duplicates durandal duration dwr dx-data-grid dynamic dynamic-arrays dynamic-data dynamic-html dynamic-import dynamic-programming dynamic-routing dynamic-values dynamically-generated dynamicgridview dynamics-crm dynamics-marketing dynamodb-queries e-commerce e2e e2e-testing each eager-loading easeljs easy-peasy echarts echo eclipse ecma ecmascript-2016 ecmascript-2017 ecmascript-2019 ecmascript-2020 ecmascript-5 ecmascript-6 ecmascript-next editor editorconfig editorjs effect effects ej2-gantt ej2-syncfusion ejs el-plus elastic-stack elasticsearch electron electron-builder electron-forge electron-packager element element-plus element-ui elementor elementref elementtree elixir elk ellipse ellipsis elm elysiajs emacs email email-attachments email-confirmation email-formats email-templates email-validation embed embedded-fonts ember.js emitter emmet emoji emojione emotion empty-list emulation encapsulation encoding encryption end-to-end endpoint enjoyhint enter enterprise entities entity entity-framework entity-framework-core enums environment environment-variables enzyme eos epub equivalent erase erb error-handling es6-class es6-module-loader es6-modules es6-promise esbuild escaping escpos eslint eslint-config-airbnb eslintrc esmodules esri esri-maps ethereum euro event-binding event-driven event-handling event-listener event-loop event-propagation eventemitter events eventstoredb excel excel-addins excel-formula excel-online excel-web-addins excel4node exceljs exception execcommand exif-js expand expandable-table expansion expo expo-sqlite export export-to-csv export-to-excel express express-handlebars express-session extend extending extends external external-js external-url extjs extract fabricjs facade facebook facebook-comments facebook-graph-api facebook-ios-sdk facebook-javascript-sdk facebook-login facebook-opengraph facebook-sharer facebook-social-plugins facelets factory factory-pattern fade fadein failed-installation faker.js fallback fancybox farsi fast-xml-parser fastapi fastcgi fastify fastlane faunadb favicon fetch fetch-api ffmpeg fido figma figure file file-io file-link file-not-found file-structure file-upload fileapi filelist filenames filepath filereader files-app filesaver.js filesystems filetree filter filtering final find findall findelement fingerprint firebase firebase-admin firebase-analytics firebase-app-check firebase-authentication firebase-cli firebase-cloud-messaging firebase-console firebase-dynamic-links firebase-extensions firebase-hosting firebase-notifications firebase-realtime-database firebase-security firebase-storage firebase-tools firebaseui firebug fireflysemantics-slice firefox firefox-addon firefox-addon-webextensions firefox-developer-tools firefox4 firewall fixed fixed-length-array fixed-width fixtures flash flask flask-autoindex flask-cors flask-mail flask-restful flask-socketio flask-sqlalchemy flask-wtforms flatpickr flex3 flexbox flexdashboard flexslider flextable flicker flickity flickr flip floating-action-button flowbite flower fluent-ui fluentui-react fluentvalidation fluid fluid-layout flutter flutter-test flutter-web flying-saucer focus folium font-awesome font-awesome-4 font-awesome-5 font-awesome-6 font-face font-family font-size fonts footer for-in-loop for-loop foreach foreground-service foregroundnotification foreignobject forgerock forgot-password fork-join form-control form-data form-fields form-submit form-verification formarray format formatdatetime formatting formbuilder formgroups formik formio formmail forms formula forward-reference forwarding foundation foundry-slate fp-ts fpm fragment framer-motion frameset frameworks freemarker freeze freshjs froala frontend frontpage fs full-width fullcalendar fullcalendar-3 fullcalendar-4 fullcalendar-5 fullcalendar-6 fullcalendar-scheduler fullscreen function function-call function-parameter functional-programming fusioncharts fxml gallery game-development gantt-chart garbage-collection gatsby gatsby-plugin-mdx gauge gcloud gdi+ generator generic-function generic-type-argument generic-type-parameters generics geojson geolocation geometry geonames geoserver gesture get getattribute getcomputedstyle getdate getelementbyid getelementsbyclassname getelementsbytagname getimagesize getter getter-setter getuikit getusermedia getvalue gherkin ghost-blog gif gis git git-bash git-diff git-husky gitbook github github-actions github-api github-flavored-markdown github-pages gitignore gitlab gitlab-ci gitlab-ci-runner global global-variables glyphicons gmail gmail-api go go-echo gojs golden-layout google-admin-sdk google-ads-api google-analytics google-analytics-4 google-analytics-api google-api google-api-java-client google-api-js-client google-app-engine google-apps-marketplace google-apps-script google-authentication google-calendar-api google-chrome google-chrome-console google-chrome-devtools google-chrome-extension google-chrome-headless google-chrome-warning google-cloud-build google-cloud-firestore google-cloud-functions google-cloud-platform google-cloud-pubsub google-cloud-scheduler google-cloud-sql google-cloud-storage google-cloud-vertex-ai google-colaboratory google-compute-engine google-developer-tools google-dfp google-diff-match-patch google-docs google-docs-api google-drive-api google-finance-api google-font-api google-fonts google-forms google-geolocation google-index google-login google-map-react google-maps google-maps-api-3 google-maps-autocomplete google-maps-markers google-material-icons google-oauth google-one-tap google-pagespeed google-places-api google-play google-play-billing google-play-console google-play-services google-plus google-plus-signin google-reviews google-roads-api google-search google-secret-manager google-sheets google-signin google-street-view google-street-view-static-api google-tag-manager google-text-to-speech google-translate google-visualization google-web-designer google-webfonts google-workspace googleplacesautocomplete gps gradient gradle grammar graph graphical-logo graphics graphql graphql-codegen graphql-js graphql-mutation graphviz gravatar gravity grayscale greasemonkey grecaptcha grep grid grid-layout gridstack gridster gridview groovy group-by grouping grpc grpc-js grpc-node grpc-web gruntjs gsap gsub gtag.js gtk gtk3 guard guid guidewire gulp gulp-imagemin gulp-sass gulp-typescript gulp-uglify gun gutenberg-blocks gwt h2 hamburger-menu hammer.js hana handle handlebars.js handsontable hapi hapijs hardhat hardware hash hash-location-strategy hashbang hashmap hashtag hbs hdiv hdpi header headless-cms headless-ui heads-up-notifications heatmap heic height helmet.js helper heroku heuristics hex hibernate hidden hide hierarchy highcharts highcharts-gantt higher-order-components higher-order-functions highlight highlight.js highlighting histogram history history.js hls.js home-button hono hook hook-woocommerce horizontal-alignment horizontal-scrolling host hosting hot-module-replacement hot-reload hotkeys hover href hsl htdocs html html-agility-pack html-content-extraction html-datalist html-email html-encode html-entities html-frames html-framework-7 html-head html-heading html-helper html-imports html-injections html-input html-lists html-parsing html-pdf html-rendering html-sanitizing html-select html-table html-tbody html-templates html-to-pdf html-validation html-webpack-plugin html.actionlink html2canvas html2pdf html4 html5-audio html5-canvas html5-draggable html5-filesystem html5-history html5-template html5-video htmlcollection htmlelements htmllint htmlspecialchars htmltools htmlunit htmx http http-accept-language http-delete http-equiv http-error http-get http-headers http-live-streaming http-options-method http-parameters http-patch http-post http-proxy http-proxy-middleware http-status-code-400 http-status-code-401 http-status-code-404 http-status-code-405 http-status-code-415 http-status-code-500 http-status-code-503 http-status-codes http2 httpbackend httpclient httpcontext httpcookie httpexception httpinterceptor httprequest httpresponse https httpserver httpwebrequest httpwebresponse httr huawei-mobile-services hugo husky hybrid-mobile-app hybris hydration hyperledger-composer hyperledger-fabric hyperlink hyperscript hyphen hyphenation i18next ibeacon icecast ico icon-fonts icons id3 ide identityserver3 identityserver4 idioms idp ienumerable if-statement ifc iframe iframe-resizer ignite-ui iife iis iis-10 iis-7 iis-7.5 iis-8 iisnode image image-cropper image-gallery image-processing image-resizing image-scaling image-size image-slider imagemap imagepicker imageset imaskjs imei imgur immutability immutable.js implements import import-from-excel importerror in-app-purchase inappbrowser include increment indentation index-signature indexeddb indexing indexof inertiajs inference infinite-scroll influxdb info information-visualization infragistics inheritance init initialization initializer inject injectable injection-tokens inline inline-styles inline-svg inner-classes innerhtml innertext input input-mask input-type-file inputbox inputevent inquirer insert inspect instagram installation instance instanceof integer integration intellij-idea intellisense interact.js intercept interceptor interface internationalization internet-explorer internet-explorer-11 internet-explorer-6 internet-explorer-7 internet-explorer-8 internet-radio interpolation intersection intersection-observer intersection-types intl-tel-input intrinsicattributes intro.js invariance inversion-of-control invisible-recaptcha invokescript ion-checkbox ion-content ion-grid ion-infinite-scroll ion-item ion-menu ion-radio-group ion-range-slider ion-segment ion-select ion-slides ion-toggle ionic ionic-appflow ionic-cli ionic-cordova ionic-enterprise-auth ionic-framework ionic-native ionic-native-http ionic-plugins ionic-popover ionic-popup ionic-react ionic-storage ionic-tabs ionic-v1 ionic-view ionic-vue ionic-webview ionic2 ionic2-calendar ionic3 ionic4 ionic5 ionic6 ionic7 ionicons ios ios-camera ios-permissions ios-simulator ios10 ios11 ios13 ios15 ip ipad ipc ipcmain ipconfig ipcrenderer iphone iphone-standalone-web-app ipython isnull iso8601 isodate istanbul itemcontainerstyle iter-ops iteration iterm2 itext itext7 itfoxtec-identity-saml2 itms-90809 itunes-search-api ivy jackson jaeger jakarta-ee jar jasmin jasmine jasmine-marbles jasmine-ts jasmine2.0 java java-8 javafx javafx-8 javascript javascript-debugger javascript-decorators javascript-framework javascript-import javascript-marked javascript-objects javascript-proxy jaws-screen-reader jdl jeditorpane jekyll jenkins jenkins-pipeline jersey jest-dom jest-preset-angular jestjs jhipster jinja2 jinja2-cli jira jira-rest-api jodit joi join joomla jose jpa jpeg jquery jquery-animate jquery-autocomplete jquery-deferred jquery-events jquery-lazyload jquery-masonry jquery-mobile jquery-plugins jquery-select2 jquery-selectors jquery-terminal jquery-ui jquery-ui-button jquery-ui-datepicker jquery-ui-dialog jquery-ui-draggable jquery-ui-menu jquery-ui-selectable jquery-ui-slider jquery-ui-sortable jquery-validate jqxgrid js-routes js-scrollintoview js-xlsx js-yaml jsbarcode jsbundling-rails jscompress jscontext jsdoc jsdom jsencrypt jsf jsf-2 jsfiddle jsgrid jshint json json-api json-ld json-schema-validator json-server json.net json2html json5 jsoneditor jsonidentityinfo jsonp jsonplaceholder jsonschema jsoup jsp jsp-tags jspdf jspdf-autotable jspsych jsrender jsreport jss jstl jstree jsx jszip jtable junit jupyter jupyter-notebook justify jvectormap jwplayer jwt kable kableextra karma-coverage karma-jasmine karma-mocha karma-runner kebab-case kendo-chart kendo-combobox kendo-datepicker kendo-dropdown kendo-grid kendo-ui kendo-ui-angular2 kendo-upload kepler.gl keras kestrel key key-bindings key-value keyboard keyboard-events keyboard-navigation keyboard-shortcuts keycloak keycloak-js keycloak-rest-api keycloak-services keycode keydown keyframe keyof keypress keyup keyword kibana-4 kill kill-process kineticjs knex.js knitr knockout.js koa koa-bodyparser kong konva konvajs kotlin kramdown kubernetes kubernetes-ingress label labels lagom lambda lan lang language-design language-lawyer language-server-protocol laravel laravel-4 laravel-5 laravel-5.3 laravel-5.8 laravel-8 laravel-9 laravel-blade laravel-breeze laravel-livewire laravel-passport laravel-sanctum laravel-snappy laravel-validation lastpass late-binding latex layer layout lazy-initialization lazy-loading leaderboard leaflet leaflet-geoman leaflet.draw less lets-encrypt letter-spacing lexicaljs libphonenumber libraries lifecycle ligature lightbox lightbox2 lightgallery lighthouse limit line line-breaks line-height line-through linear-gradients linechart linefeed linkedin-api linksys linq linq-to-sql lint lint-staged linter linux liquid liskov-substitution-principle list listbox listener listitem listjs listobject listpicker listview lit lit-element lit-html literals live live-streaming livereload liveserver load load-balancing load-order loader loading local local-storage localdate locale localhost localization localnotification location-href lodash logentries logging logic login login-page login-system logout logstash long-press loopback loopbackjs loops lottie lowercase lucid lumen luxon lxml lynx m3u m3u8 mac-address macos macos-big-sur macos-catalina macos-high-sierra macos-monterey macros magento magento2 magnific-popup mailchimp-api-v3.0 mailto makestyles mako manifest manifest.json many-to-many map mapbox mapbox-gl mapbox-gl-js mapped-types mapper mapping maps margin margins markdown markerclusterer markup marp marpit marquee mask masking masonry master-detail master-pages mat mat-autocomplete mat-card mat-datepicker mat-dialog mat-drawer mat-error mat-expansion-panel mat-form-field mat-icon mat-input mat-list mat-option mat-pagination mat-select mat-sidenav mat-slider mat-stepper mat-tab mat-table match material-components material-components-web material-design material-design-lite material-dialog material-icons material-table material-ui materialbutton materialize math math-functions mathematical-expressions mathjax mathml matter.js maven max maxlength mcu md-autocomplete md-select mdbootstrap mdc-components mddialog mean mean-stack meanjs measurement mechanize media media-queries mediastream megamenu memoization memoized-selectors memory memory-leaks memory-management mention menu menubar menuitem mercurius merge mergemap mern mesh message meta meta-tags metadata metamask metaplex meteor meteor-blaze methods metrics metro-bundler micro-frontend microservices microsoft-edge microsoft-graph-api microsoft-identity-platform microsoft-teams microsoft-web-deploy middleware midi migration mikro-orm milvus mime mime-message mime-types mindmap minesweeper minify minimist minio minmax miragejs mithril.js mix-blend-mode mixins mjml mkdocs mobile mobile-angular-ui mobile-application mobile-browser mobile-development mobile-safari mobile-website mobx mobx-react mobx-state-tree mocha-webpack mocha.js mocking mod-rewrite modal-dialog modal-sheet modal-window modalviewcontroller model model-binding model-view-controller model-viewer modifier modular-design module moment-timezone momentjs monaco-editor mongodb mongodb-query mongoid mongoose mongoose-middleware mongoose-schema monorepo monospace monthcalendar moodle mootools mosaic motorola mouse-cursor mouseevent mousehover mouseleave mousemove mouseover mousewheel moving-average mozilla mp3 mp4 mpd mpdf mpmediaquery mqtt ms-access ms-office ms-word msal msal-angular msal.js msbuild msgpack mudblazor mui5 muipickersutilsprovider multer multer-gridfs-storage multer-s3 multi-level multi-page-application multi-select multi-tenant multi-user multidimensional-array multiline multipage multipart multipartfile multipartform-data multiple-columns multiple-inheritance multiple-instances multiplication mutable mutation-observers mvvm mvw mxgraph mysql mysqli namecheap namespaces naming-conventions nan nanoid narrowing native native-base native-web-component nativescript nativescript-angular nativescript-plugin nativescript-telerik-ui nativescript-vue nav nav-pills navbar navigateurl navigation navigation-drawer navigationbar navigationcontroller navigator nebular nedb nest nest-commander nested nested-json nested-lists nested-loops nested-object nestjs nestjs-config nestjs-jwt nestjs-swagger netbeans netlify netsuite network-efficiency new-operator new-project new-window newline newsletter next next-auth next-images next-link next.js next.js13 next.js14 nextjs-dynamic-routing nextjs-image nexus nexus-js nexus-prisma nfc nft ng ng-animate ng-apexcharts ng-bootstrap ng-build ng-class ng-component-outlet ng-container ng-content ng-controller ng-deep ng-dialog ng-file-upload ng-filter ng-flow ng-grid ng-hide ng-image-compress ng-map ng-messages ng-mocks ng-modal ng-modules ng-multiselect-dropdown ng-options ng-otp-input ng-packagr ng-pattern ng-repeat ng-required ng-select ng-show ng-storage ng-style ng-submit ng-switch ng-tags-input ng-template ng-upgrade ng-view ng-zorro-antd ng2-bootstrap ng2-charts ng2-redux ng2-smart-table ng2-translate ngb-datepicker ngcordova ngfor nginfinitescroll nginx nginx-cache nginx-config nginx-location nginx-reverse-proxy ngmock ngmodel ngonchanges ngondestroy ngoninit ngresource ngrok ngroute ngrx ngrx-component-store ngrx-data ngrx-effects ngrx-entity ngrx-reducers ngrx-router-store ngrx-selectors ngrx-store ngrx-store-4.0 ngtable ngtemplateoutlet ngu-carousel ngx-admin ngx-bootstrap ngx-bootstrap-modal ngx-bootstrap-popover ngx-charts ngx-chips ngx-cookie-service ngx-datatable ngx-daterangepicker-material ngx-drag-drop ngx-echarts ngx-extended-pdf-viewer ngx-formly ngx-image-cropper ngx-international-phone-number ngx-leaflet ngx-mask ngx-monaco-editor ngx-mydatepicker ngx-pagination ngx-paypal ngx-quill ngx-restangular ngx-socket-io ngx-spinner ngx-swiper-wrapper ngx-toastr ngx-translate ngx-translate-multi-http-loader ngx-ui-loader ngxs nightwatch.js nl2br nlp noborder node-commander node-config node-fetch node-gyp node-modules node-red node-redis node-sass node-sqlite3 node-streams node-webkit node.js node.js-addon node.js-connect nodelist nodemailer nodemon nodes noise nokogiri nomachine-nx nominatim normalization normalize-css noscript nosql notepad++ notifications notify nouislider npm npm-build npm-install npm-link npm-live-server npm-package npm-publish npm-run npm-scripts npm-start npm-update npm-version npm-vulnerabilities npx nrwl nrwl-nx nsattributedstring nsstring nuget null null-check nullable number-formatting numbers nuxt.js nuxt3 nuxtjs3 nvd3.js nvda nvm nwjs nx-devkit nx-workspace nx.dev nyc oak oauth oauth-2.0 obfuscation object object-destructuring object-fit object-literal object-position object-property objective-c objloader observable observers ocelot odata odometer odoo odoo-13 odoo-15 oembed office-addins office-app office-js office-scripts office365 offline offline-caching offset ohif oidc-client okhttp okta on-screen-keyboard onbeforeunload onblur onchange onclick onclicklistener one-trust onedrive onerror onesignal onfocus onhover onload onmousedown onmouseover onsen-ui onsubmit oop opacity opayo open-telemetry openapi openapi-generator opencart opencart2.3 opencv opendatasoft openid openid-connect openlayers openlayers-5 openlayers-6 openstreetmap opentype-svg-font openvidu openweathermap opera operating-system operators opine optgroup optimization option option-type optional optional-chaining optional-parameters options oracle oracle-apex orchardcms orchardcore org-mode orientation-changes orm orphan out outdir outline outlook outlook-2010 outlook-2016 output overflow overlap overlapping overlay overloading overriding owasp owl-carousel owl-carousel-2 owl-date-time p-dropdown p-table p2p p5.js pack package package-info package-managers package.json pact padding page-break page-break-before page-layout page-load-time page-refresh pageload pageobjects pagespeed pagespeed-insights pagination paginator paging paint palantir-foundry palindrome pandas pandas-styles pandoc pane panel pannellum panning panzoom papaparse paragraph parallax parallel-processing parameter-passing parameters parcel parceljs parent parent-child parse-platform parseint parsel parsing partial partial-classes partial-views partials particles particles.js pass-by-reference pass-by-value passport-azure-ad passport-jwt passport-local passport.js password-protection passwords patch patch-package patchvalue path pattern-matching payment-gateway payment-method paypal pdf pdf-form pdf-generation pdf-viewer pdf.js pdfjs-dist pdfmake peer-dependencies peerjs pelco penetration-testing percentage performance perl permalinks permissions permutation perspective pg-promise phantom-types phantomjs phaser phaser-framework phaserjs phoenix-framework phone-call phonegap phonegap-build phonegap-plugins photo photography php phpmailer phppresentation phpstorm phpstorm-2017.1 physics-engine picasa pick picklist picture-element picturefill pie-chart pikaday pinchzoom ping pinia pinterest pipe pipeline pipes-filters pixel pixi.js pkce pkgdown placeholder plaintext play-billing-library playframework playframework-2.0 playwright playwright-test playwright-typescript plesk plot plotly plotly-dash plotly-express plotly-python plotly.js plsql plugins plyr.js pm2 png pnp-js pnpm pointer-events pointers pokeapi polling polyfills polyglot-markup polygon polymer polymorphism popover populate popup popupwindow port portfolio porting portrait position positional-operator positioning post postcss postcss-cli poster postgis postgresql postgresql-9.5 postman pouchdb power-automate power-automate-desktop powerbi powerbi-embedded powerpoint powershell powershell-core pre pre-commit-hook pre-rendering precompile predicate preflight preg-match preg-replace preload preloader preloading preprocessor prerender prestashop prestashop-1.7 prettier pretty-print prettytable preventdefault preview primefaces primeflex primeicons primeng primeng-calendar primeng-datatable primeng-dialog primeng-dropdowns primeng-menu primeng-table primeng-tree primeng-turbotable primereact primevue printing printing-web-page printthis prism.js prisma prisma-graphql prisma-orm prisma2 prismic.io privacy private private-constructor processing product production production-environment profiler progress progress-bar progressive-enhancement progressive-web-apps proj project projection promise prompt prop properties property-binding proportions protected proto protocol-buffers protocol-relative prototype prototype-chain prototypejs protractor provider proxy pseudo-class pseudo-element public publish publishing pug pull-to-refresh pulumi punycode puppeteer pure-css pure-function push push-notification pushstate pushy put putimagedata pwa pygments pyodide pyqt pyqt5 pyscript pyscripter pyside2 python python-2.7 python-3.x python-requests python-requests-html python-sphinx pythonanywhere q qlabel qr-code qt qtextedit qtstylesheets qtwebkit quarkus quarkus-rest-client quarto quasar quasar-framework query-builder query-optimization query-parameters query-string queryparam queryselector queue quill quote quotes r r-markdown rabbitmq race-condition rack rackspace radial-gradients radio radio-button radio-group radix-ui radzen railway ramda.js random range rapidapi rasa raspberry-pi rating razor razor-pages razorpay react-18 react-admin react-animated react-big-calendar react-bootstrap react-bootstrap-nav react-chartjs react-chartjs-2 react-class-based-component react-component react-context react-create-app react-css-modules react-custom-hooks react-data-table-component react-datepicker react-dnd react-dom react-dom-server react-dropdown-tree-select react-dropzone react-error-boundary react-fiber react-flow react-forms react-forwardref react-functional-component react-google-charts react-google-recaptcha react-hoc react-hook-form react-hooks react-hooks-testing-library react-i18next react-icons react-infinite-scroll-component react-jsx react-konva react-leaflet react-leaflet-v3 react-map-gl react-material react-mui react-native react-native-android react-native-drawer react-native-firebase react-native-flatlist react-native-gesture-handler react-native-navigation react-native-reanimated react-native-reanimated-v2 react-native-sqlite-storage react-native-stylesheet react-native-testing-library react-native-textinput react-navigation react-navigation-bottom-tab react-navigation-drawer react-navigation-stack react-navigation-v6 react-oauth react-otp-input react-pdf react-phone-input-2 react-phone-number-input react-player react-props react-proptypes react-query react-redux react-rendering react-router react-router-dom react-scripts react-select react-slick react-spring react-state react-state-management react-testing-library react-three-drei react-tooltip react-transition-group react-tsx react-typescript react-usecallback react-usememo reactive reactive-forms reactive-programming reactivex reactjs reactstrap readfile readme readonly real-time real-time-updates reason recaptcha recaptcha-v3 recharts recoiljs record recursion recursive-datastructures redaction redcap redirect redis redoc redocly reduce reducers redux redux-devtools redux-logger redux-observable redux-persist redux-reducers redux-saga redux-thunk redux-toolkit ref refactoring reference referrals referrer-policy reflect-metadata reflection reflow refresh refresh-token regex regex-lookarounds regexp-replace region rel relationship relative-path relative-url release reload remix-auth-socials remix-run remix.run remove-if removing-whitespace rename render renderer rendering renovate reorderlist repeat repeating-linear-gradient replace replaysubject reporting-services request request-headers requestanimationframe require required requiredfieldvalidator requirejs rerender rescript reselect reserved-words reset reset-password resharper resizable resize resolve resources response response-headers responsive responsive-design responsive-design-view responsive-images responsiveness rest rest-parameters restangular restapi restart restful-authentication restrict restructuredtext retina-display return return-type return-value reusability reveal.js reverse reverse-engineering reverse-proxy rgba rgl rich-text-editor richtext rider right-to-left ringcentral riot.js robotframework roboto role-based roles rollup rollup-plugin-postcss rollupjs roman-numerals roslyn rotatetransform rotation round-slider rounded-corners route-provider routeparams router router-outlet routerlink routerlinkactive routes routing row row-height rows rss rstudio rsuite rtcpeerconnection rtk-query rtmp rtos rtsp ruby ruby-characters ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-5 ruby-on-rails-7 rules run-configuration runtime runtime-configuration runtime-error rust rvest rx-angular rxfire rxjs rxjs-filter rxjs-fromevent rxjs-marbles rxjs-observables rxjs-pipeable-operators rxjs-subscriptions rxjs5 rxjs6 rxjs7 safari safe-navigation-operator sails.js salesforce salesforce-communities salesforce-marketing-cloud saml samsung-galaxy samsung-smart-tv sanctum sandbox sanitization sanitizer sap-commerce-cloud sap-fiori sapui5 sass sass-loader sass-maps sass-variables saucelabs save savefiledialog scale scaling scheduled-tasks scheduler schema scope scoping scrapy screen screen-capture screen-orientation screen-readers screen-scraping script script-src script-tag scripting scroll scroll-paging scroll-snap scrollbar scroller scrollmagic scrollspy scrolltop scrolltrigger scrollview scss-functions scss-lint scss-mixins sdk search search-engine search-form searchbar sections secure-coding security sed seek segment select select-options selected selectedindex selectinput selection selection-api selectionmodel selectize.js selector selectors-api selenium selenium-chromedriver selenium-ide selenium-iedriver selenium-webdriver selenium-webdriver-python self-destruction semantic-html semantic-markup semantic-ui semantic-ui-react semantics sencha-touch-2 send sendbeacon sendgrid sendmail sendmessage seo separation-of-concerns sequelize-cli sequelize-typescript sequelize.js sequential serialization serve server server-sent-events server-side-includes server-side-rendering serverless serverless-architecture serverless-framework serverless-framework-step-functions service service-worker servicenow servlets session session-cookies session-storage session-timeout set setattribute setinterval setstate setter settimeout settings sfu sgml sh sha256 shadcnui shader shadow shadow-dom shadow-root shaka shallow-copy shape shape-outside shapes share share-open-graph shared-directory shared-libraries shared-module sharepoint sharepoint-2013 sharepoint-online sharp sheetjs shell shiny shinybs shinyjqui shop shopify shopify-api shopizer shopping-cart shopware6 shortcut shoutcast show show-hide showmodaldialog shuffle siblings side-effects sidebar sidenav sigma.js sign sign-in-with-apple signalr signalr-hub signalr.client signals signature signaturepad sim-card simplemodal sinatra single-page-application single-sign-on single-spa single-spa-angular singleton singularitygs sinon sip sitedesign size sizing skeleton-css-boilerplate skeleton-ui skiasharp slice slick slick.js slickgrid slickgriduniversal slide slider slideshow sliding-tile-puzzle slim slim-4 slim-lang smart-table smartcontracts smil smooth-scrolling smtp smtpjs snackbar snap snapshot-testing snipcart soap social-authentication social-media socialsharing-plugin socket-timeout-exception socket.io socket.io-client sockets sockjs soft-hyphen solana solana-web3js solaris solid-js sonarlint sonarqube sorting soundcloud source-code-protection source-maps spa-template space spaces spacing spartacus-storefront speaker special-characters specifications spectator speech speech-synthesis spfx spfx-extension spinner splash-screen splidejs split splitter spotify spotlight spread spread-syntax spreadjs spring spring-batch spring-boot spring-boot-security spring-cloud spring-cloud-gateway spring-data spring-data-jpa spring-form spring-mvc spring-restcontroller spring-security spring-security-oauth2 spring-security-rest spring-security-saml2 spring-thymeleaf spring-webflux sprite spy spyon sql sql-like sql-server sqlalchemy sqlite squarespace squirrel.windows src srcset ssh2-sftp ssl ssl-certificate ssrs-2012 stack stack-navigator stack-trace stackblitz stacking-context standards startup state state-machine static static-files static-site-generation static-typing static-web-apps statistics status stenciljs step stepper sticky sticky-footer stomp stoppropagation stopwatch storage store storefront storybook str-replace strapi stream streamable.com streaming streaming-video streamlit strict strictnullchecks strikethrough string string-concatenation string-formatting string-interpolation string-literals stringify strip stripe-payments stripes stroke stroke-dasharray strokeshadow strong-typing strpos struct structured-clone struts-1 struts2 stryker style-dictionary styled-components styled-system stylelint styles stylesheet styling stylus stylus-pen subclassing subdirectory subject subject-observer sublime-text-plugin sublimetext sublimetext2 sublimetext3 submenu submit subpixel subscribe subscript subscription substring subtitle sudo sudoku suitescript sum summary-tag summernote supabase supabase-js superscript supertest survey susy-compass svelte svelte-3 svelte-component svelte-store svelte-transition sveltekit svg svg-animate svg-defs svg-filters svg-map svg-morphing svg.js sw-precache swagger swagger-ui sweetalert sweetalert2 swift swiftui swing swipe swipe.js swiper swiper.js swiperjs switch-statement switching switchmap swr symbols symfony symfony-flex symfony4 symfony5 syncfusion synchronization syntax syntax-error syntax-highlighting systemjs t4 tabindex tablecelleditor tablecellrenderer tableheader tablelayout tablet tabmenu tabs tabular tabulator tags tailwind-3 tailwind-css tailwind-elements tailwind-in-js tailwind-ui tampermonkey tanstack tanstackreact-query task tauri tcl tcp tcpdf teamcity teams-toolkit tedious tel telegram telegram-bot telerik telerik-mvc template-engine template-literals templatebinding templates tempus-dominus-datetimepicker tensorflow tensorflow.js tensorflowjs-converter terminal terminology ternary-operator testbed testcafe testing testing-library text text-align text-alignment text-cursor text-decorations text-editor text-extraction text-files text-indent text-size text-to-speech textarea textbox textcolor textfield textinput textnode textout textselection textual textview tfs themes theming thermal-printer thickness thingsboard this this-keyword three.js throttling throw thumbnails thymeleaf tic-tac-toe tiktok tilt time time-series time-tracking timeago timeout timepicker timer timestamp timezone timezone-offset tint tinymce tinymce-4 tinymce-5 tinymce-plugins tippyjs tiptap title tkinter toast toast-ui-image-editor toastr toggle togglebutton toggleswitch token tomcat tomcat9 tone.js toolbars tooltip top-level-await tornado tostring touch touch-event touchableopacity touchmove traffic trail trailing-whitespace transactions transform transition transitions translate translation transloco transparency transparent transpiler transpose travis-ci tree tree-shaking tree-traversal treemap treesitter treetableview treeview tri-state-logic triangle triggers trim trpc.io truetype truncate truncation try-catch ts-check ts-jest ts-loader ts-node ts-node-dev tsc tsconfig tsconfig-paths tsd tslint tsserver tsx tsyringe tumblr tumblr-html tumblr-themes tuples turborepo twa tween twig twilio twilio-api twilio-conversations twilio-video twitter twitter-bootstrap twitter-bootstrap-2 twitter-bootstrap-3 twitter-bootstrap-4 twitter-card two-way-binding txt type-alias type-assertion type-conversion type-declaration type-definition type-erasure type-hinting type-inference type-level-computation type-narrowing type-only-import-export type-parameter type-safety typeahead typeahead.js typechecking typedjs typeerror typeface.js typeform typegoose typegraphql typeguards typemoq typeof typeorm types typescript typescript-5 typescript-class typescript-compiler-api typescript-conditional-types typescript-declarations typescript-decorator typescript-eslint typescript-eslintparser typescript-generics typescript-mixins typescript-module-resolution typescript-namespace typescript-never typescript-types typescript-typings typescript-utility typescript1.5 typescript1.6 typescript1.8 typescript2.0 typescript2.2 typescript2.4 typescript2.9 typescript3.0 typescript4.0 typetraits typing typo3 typo3-10.x typography typoscript ubuntu ubuntu-16.04 ubuntu-20.04 udp uglifyjs ui-automation ui-calendar ui-grid ui-scroll ui-select ui-testing ui-toolkit ui.bootstrap uiactionsheet uialertcontroller uibinder uicomponents uikit uint uint8array uiscrollview uiswitch uiview uiwebview ultrawingrid umd uncaught-exception undefined underline underscore.js undertow unexpected-token unhandled-promise-rejection unicode unicode-string unified.js union union-types unique-values unit-testing units-of-measurement unity-game-engine universal unlink unsafe-inline unsubscribe unused-variables updates upgrade upload uploader uppercase uri uri.js url url-parameters url-parsing url-redirection url-rewriting url-routing url-scheme urllib2 urlsearchparams urql usability use-case use-context use-effect use-reducer use-ref use-state usefaketimers user-agent user-controls user-event user-experience user-input user-interface user-permissions user-roles userchrome.css userscripts utc utf utf-8 uuid uwp uwsgi v-autocomplete v-data-table v-for v-slider v-slot vaadin vaadin-flow vaadin14 vagrant validation validationerror valuechangelistener vanilla-extract var variable-assignment variable-fonts variable-length variables variadic-functions variadic-tuple-types variance vb.net vba vbscript vector-graphics vega vega-embed vega-lite velo vendor-prefix vercel version version-control versioning vertical-alignment vertical-scrolling vetur video video-codecs video-processing video-streaming video.js videogular videogular2 view view-transitions-api viewchild viewport viewport-units vim vimeo vimium virtual-dom virtualscroll virus vis.js vis.js-network visibility visible visual-studio visual-studio-2010 visual-studio-2012 visual-studio-2013 visual-studio-2015 visual-studio-2017 visual-studio-2019 visual-studio-2022 visual-studio-code visual-studio-cordova visual-studio-monaco visual-testing visual-web-developer vite vitepress vitest vlc vmware vmware-clarity voiceover void vpc vs-web-site-project vscode-debugger vscode-extensions vscode-jsconfig vscode-settings vsto vue-class-components vue-cli vue-cli-3 vue-component vue-composition-api vue-data vue-i18n vue-mixin vue-property-decorator vue-props vue-router vue-router4 vue-script-setup vue-test-utils vue-transitions vue-typescript vue.js vuejs-transition vuejs2 vuejs3 vuejs3-composition-api vuelidate vuepress vuetify.js vuetifyjs3 vueuse vuex vuex4 w3.css w3c w3c-validation wai-aria wait walkthrough wallet-connect war warnings was watch watch-face-api wav waveform wcag wcag2.0 wcag2.1 wcf wear-os weasyprint weather-api web web-accessibility web-applications web-audio-api web-chat web-component web-config web-crawler web-deployment web-deployment-project web-development-server web-frameworks web-frontend web-hosting web-inspector web-notifications web-parts web-performance web-scraping web-scraping-language web-services web-site-project web-sql web-standards web-storage web-technologies web-vitals web-worker web.xml web3 web3js webapi webapi2 webassembly webauthn webbrowser-control webcam webclient webcodecs webdatarocks webdeploy-3.5 webdriver webflow webfonts webforms webgl webgpu webhooks webintents webix webkit webkit-animation weblogic webmethod webp webpack webpack-2 webpack-4 webpack-5 webpack-bundle-analyzer webpack-config webpack-dev-server webpack-file-loader webpack-hmr webpack-html-loader webpack-module-federation webpack-style-loader webpage-screenshot webrtc websecurity webserver websocket webspeech-api webstorm webusb webview webview2 webvtt weebly week-number wget wgsl whatsapp while-loop white-labelling whitelist whitespace widget width wildwebdeveloper window window-resize window.location windows windows-10 windows-7 windows-8.1 windows-authentication windows-server-2008 windows-subsystem-for-linux winforms winston winui-3 wireless wix wkhtmltopdf wkwebview wkwebviewconfiguration woff woff2 wonderpush woocommerce woocommerce-theming woothemes word-break word-cloud word-count word-spacing word-wrap wordpress wordpress-gutenberg wordpress-rest-api wordpress-theming worker worker-loader workflow workspace wow.js wpbakery wpf wrapper ws wsh wsl-2 wso2 wso2-identity-server wso2-micro-integrator wtforms wysiwyg x-editable x-xsrf-token xaml xampp xaringan xcode xcode12 xcodebuild xhtml xhtml-1.0-strict xhtml-1.1 xhtml2pdf xliff xlsx xml xml-namespaces xml-parsing xml.etree xmlhttprequest xng-breadcrumb xor xpath xslt xss xstate xtermjs yahoo-mail yaml yarn-v2 yarn-workspaces yarnpkg yarnpkg-v2 yaxis yeoman yeoman-generator yeoman-generator-angular yii2 yii2-advanced-app youtube youtube-api youtube-data-api youtube-iframe-api ytdl yui yup z-index zend-form zend-framework zend-framework2 zendesk zigzag zingchart zip zipalign zipkin zod zoho zone zone.js zonejs zooming zsh zurb-foundation zustand

Copyright © angularfix