Migrated from CRA to Vite and updated NodeJS to v18.x

This commit is contained in:
Matthew Garrett 2023-09-03 11:38:54 -07:00
Родитель 31165c4a3a
Коммит e38a7236f2
86 изменённых файлов: 1404 добавлений и 25080 удалений

Просмотреть файл

@ -1,5 +1,6 @@
node_modules
build
dist
.dockerignore
Dockerfile
Dockerfile.prod

2
.github/workflows/azure-ipam-testing.yml поставляемый
Просмотреть файл

@ -3,6 +3,8 @@ name: Azure IPAM Testing
run-name: Azure IPAM Deployment & Testing
on:
push:
branches: [ ipam-vite ]
pull_request:
branches: [ main ]

Просмотреть файл

@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1
FROM node:16-slim AS builder
FROM node:18-slim AS builder
# Set Working Directory
WORKDIR /app
@ -41,7 +41,7 @@ RUN mkdir /var/run/sshd
# Install NodeJS 16.x
RUN apt install curl -y
RUN curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh
RUN curl -sL https://deb.nodesource.com/setup_18.x -o nodesource_setup.sh
RUN bash ./nodesource_setup.sh
RUN apt install nodejs
RUN npm install -g react-inject-env

Просмотреть файл

@ -2,10 +2,10 @@ version: '3.8'
services:
ipam-ui:
environment:
REACT_APP_AZURE_ENV: ${AZURE_ENV}
REACT_APP_UI_ID: ${UI_APP_ID}
REACT_APP_ENGINE_ID: ${ENGINE_APP_ID}
REACT_APP_TENANT_ID: ${TENANT_ID}
VITE_AZURE_ENV: ${AZURE_ENV}
VITE_UI_ID: ${UI_APP_ID}
VITE_ENGINE_ID: ${ENGINE_APP_ID}
VITE_TENANT_ID: ${TENANT_ID}
image: azureipam.azurecr.io/ipam-ui:latest
ipam-engine:
environment:

Просмотреть файл

@ -7,10 +7,10 @@ services:
args:
PORT: 8080
environment:
REACT_APP_AZURE_ENV: ${AZURE_ENV}
REACT_APP_UI_ID: ${UI_APP_ID}
REACT_APP_ENGINE_ID: ${ENGINE_APP_ID}
REACT_APP_TENANT_ID: ${TENANT_ID}
VITE_AZURE_ENV: ${AZURE_ENV}
VITE_UI_ID: ${UI_APP_ID}
VITE_ENGINE_ID: ${ENGINE_APP_ID}
VITE_TENANT_ID: ${TENANT_ID}
WDS_SOCKET_PORT: 3000
volumes:
- ./ui:/app

Просмотреть файл

@ -46,7 +46,7 @@ Azure IPAM is a lightweight solution developed on top of the Azure platform desi
app = FastAPI(
title = "Azure IPAM",
description = description,
version = "1.0.0",
version = "2.0.0",
contact = {
"name": "Azure IPAM Team",
"url": "https://github.com/azure/ipam",

Просмотреть файл

@ -1,5 +1,6 @@
node_modules
build
dist
.dockerignore
Dockerfile.*
*.example

1
ui/.gitignore поставляемый
Просмотреть файл

@ -10,6 +10,7 @@
# production
/build
/dist
# misc
.DS_Store

Просмотреть файл

@ -1,4 +1,4 @@
ARG BASE_IMAGE=node:16-slim
ARG BASE_IMAGE=node:18-slim
FROM $BASE_IMAGE
ARG PORT=80

Просмотреть файл

@ -1,4 +1,4 @@
ARG VARIANT=16-bullseye
ARG VARIANT=18-bullseye
FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:${VARIANT}
ARG PORT=3000
@ -17,6 +17,9 @@ ENV PORT=$PORT
COPY package.json ./
COPY package-lock.json ./
# Upgrade NPM
RUN npm install npm@latest -g
RUN npm install
RUN chmod 777 node_modules
@ -27,4 +30,4 @@ COPY . ./
EXPOSE $PORT
# start app
CMD ["npm", "start"]
CMD npx vite --host "0.0.0.0" --port $PORT

Просмотреть файл

@ -1,4 +1,4 @@
ARG BASE_IMAGE=registry.access.redhat.com/ubi8/nodejs-16
ARG BASE_IMAGE=registry.access.redhat.com/ubi8/nodejs-18
FROM $BASE_IMAGE
ARG PORT=8080

Просмотреть файл

@ -2,30 +2,31 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<script type="text/javascript" src="%PUBLIC_URL%/env.js"></script>
<!-- <link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> -->
<link rel="icon" type="image/png" sizes="32x32" href="%PUBLIC_URL%/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="%PUBLIC_URL%/favicon-16x16.png">
<script type="text/javascript" src="/env.js"></script>
<script type="module" src="/src/index.jsx"></script>
<!-- <link rel="icon" href="/favicon.ico" /> -->
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<!-- <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> -->
<link rel="apple-touch-icon" sizes="180x180" href="%PUBLIC_URL%/apple-touch-icon.png">
<!-- <link rel="apple-touch-icon" href="/logo192.png" /> -->
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<!-- <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> -->
<link rel="manifest" href="%PUBLIC_URL%/site.webmanifest">
<!-- <link rel="manifest" href="/manifest.json" /> -->
<link rel="manifest" href="/site.webmanifest">
<!--
Notice the use of %PUBLIC_URL% in the tags above.
Notice the use of in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
Unlike "/favicon.ico" or "favicon.ico", "/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->

Просмотреть файл

@ -8,5 +8,26 @@ test -e /etc/os-release && os_release='/etc/os-release' || os_release='/usr/lib/
REACT_APP_CONTAINER_IMAGE=${PRETTY_NAME}
export REACT_APP_CONTAINER_IMAGE
npx --yes react-inject-env set
npx --yes http-server -a 0.0.0.0 -P http://localhost:${PORT}? -p ${PORT} build
printenv | grep REACT_APP_ > /tmp/react_app_
while IFS='=' read -r name value;
do
new_name=$(echo "$name" | sed "s/REACT_APP_/VITE_/g")
export "$new_name=$value"
done < /tmp/react_app_
printenv | grep VITE_ > /tmp/vite_
echo "window.env = {" > env.js
while IFS='=' read -r name value;
do
echo " \"$name\": \"$value\"," >> env.js
done < /tmp/vite_
echo "}" >> env.js
mv env.js ./dist/
# npx --yes react-inject-env set
npx --yes http-server -a 0.0.0.0 -P http://localhost:${PORT}? -p ${PORT} dist

26354
ui/package-lock.json сгенерированный

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -1,6 +1,6 @@
{
"name": "azure-ipam-ui",
"version": "1.1.0",
"version": "2.0.0",
"private": true,
"dependencies": {
"@azure/msal-browser": "^2.37.0",
@ -26,15 +26,12 @@
"react-dom": "^18.2.0",
"react-redux": "^8.0.5",
"react-router-dom": "^6.11.1",
"react-scripts": "5.0.1",
"spinners-react": "^1.0.7",
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
"start": "vite",
"build": "vite build"
},
"eslintConfig": {
"extends": "react-app"
@ -52,7 +49,9 @@
]
},
"devDependencies": {
"@vitejs/plugin-react": "^4.0.4",
"http-server": "^14.1.1",
"react-inject-env": "^2.1.0"
"react-inject-env": "^2.1.0",
"vite": "^4.4.9"
}
}

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

@ -73,7 +73,7 @@ function Refresh() {
}, []);
React.useEffect(()=>{
const env = { ...process.env, ...window['env'] }
const env = { ...import.meta.env, ...window['env'] }
console.log("+++WEBSITE_DETAILS+++");
console.log(env);
console.log("+++++++++++++++++++++");

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

@ -1,4 +1,4 @@
const AZURE_ENV = process.env.REACT_APP_AZURE_ENV || window['env'].REACT_APP_AZURE_ENV;
const AZURE_ENV = import.meta.env.VITE_AZURE_ENV || window['env'].VITE_AZURE_ENV;
const AZURE_ENV_MAP = {
AZURE_PUBLIC: {

Просмотреть файл

@ -13,16 +13,16 @@ export const EXTERNAL_DESC_REGEX = "^(?![ /\._-])([a-zA-Z0-9 /\._-]){1,64}(?<![
export const CIDR_REGEX = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(/(3[0-2]|[1-2][0-9]|[0-9]))$";
export const UI_APP_ID = process.env.REACT_APP_UI_ID || window['env'].REACT_APP_UI_ID;
export const ENGINE_APP_ID = process.env.REACT_APP_ENGINE_ID || window['env'].REACT_APP_ENGINE_ID;
export const TENANT_ID = process.env.REACT_APP_TENANT_ID || window['env'].REACT_APP_TENANT_ID;
export const UI_APP_ID = import.meta.env.VITE_UI_ID || window['env'].VITE_UI_ID;
export const ENGINE_APP_ID = import.meta.env.VITE_ENGINE_ID || window['env'].VITE_ENGINE_ID;
export const TENANT_ID = import.meta.env.VITE_TENANT_ID || window['env'].VITE_TENANT_ID;
export const getEngineURL = () => {
try {
const engineURL = new URL(process.env.REACT_APP_IPAM_ENGINE_URL || window['env'].REACT_APP_IPAM_ENGINE_URL);
const engineURL = new URL(import.meta.env.VITE_IPAM_ENGINE_URL || window['env'].VITE_IPAM_ENGINE_URL);
return engineURL.origin;
} catch {
return window.location.origin;
}
};
}

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

19
ui/vite.config.js Normal file
Просмотреть файл

@ -0,0 +1,19 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
export default () => {
return defineConfig({
plugins: [react()],
server: {
// host: "0.0.0.0",
// port: 8080,
hmr: {
protocol: "ws",
path: "/ws"
}
},
define: {
IPAM_VERSION: JSON.stringify(process.env.npm_package_version),
}
})
}