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 node_modules
build build
dist
.dockerignore .dockerignore
Dockerfile Dockerfile
Dockerfile.prod Dockerfile.prod

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

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

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

@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
FROM node:16-slim AS builder FROM node:18-slim AS builder
# Set Working Directory # Set Working Directory
WORKDIR /app WORKDIR /app
@ -41,7 +41,7 @@ RUN mkdir /var/run/sshd
# Install NodeJS 16.x # Install NodeJS 16.x
RUN apt install curl -y 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 bash ./nodesource_setup.sh
RUN apt install nodejs RUN apt install nodejs
RUN npm install -g react-inject-env RUN npm install -g react-inject-env

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -1,4 +1,4 @@
ARG VARIANT=16-bullseye ARG VARIANT=18-bullseye
FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:${VARIANT} FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:${VARIANT}
ARG PORT=3000 ARG PORT=3000
@ -17,6 +17,9 @@ ENV PORT=$PORT
COPY package.json ./ COPY package.json ./
COPY package-lock.json ./ COPY package-lock.json ./
# Upgrade NPM
RUN npm install npm@latest -g
RUN npm install RUN npm install
RUN chmod 777 node_modules RUN chmod 777 node_modules
@ -27,4 +30,4 @@ COPY . ./
EXPOSE $PORT EXPOSE $PORT
# start app # 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 FROM $BASE_IMAGE
ARG PORT=8080 ARG PORT=8080

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

@ -2,30 +2,31 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<script type="text/javascript" src="%PUBLIC_URL%/env.js"></script> <script type="text/javascript" src="/env.js"></script>
<!-- <link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> --> <script type="module" src="/src/index.jsx"></script>
<link rel="icon" type="image/png" sizes="32x32" href="%PUBLIC_URL%/favicon-32x32.png"> <!-- <link rel="icon" href="/favicon.ico" /> -->
<link rel="icon" type="image/png" sizes="16x16" href="%PUBLIC_URL%/favicon-16x16.png"> <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="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" /> <meta name="theme-color" content="#000000" />
<meta <meta
name="description" name="description"
content="Web site created using create-react-app" content="Web site created using create-react-app"
/> />
<!-- <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> --> <!-- <link rel="apple-touch-icon" href="/logo192.png" /> -->
<link rel="apple-touch-icon" sizes="180x180" href="%PUBLIC_URL%/apple-touch-icon.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 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/ 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="/manifest.json" /> -->
<link rel="manifest" href="%PUBLIC_URL%/site.webmanifest"> <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. 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. 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. 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`. 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} REACT_APP_CONTAINER_IMAGE=${PRETTY_NAME}
export REACT_APP_CONTAINER_IMAGE export REACT_APP_CONTAINER_IMAGE
npx --yes react-inject-env set printenv | grep REACT_APP_ > /tmp/react_app_
npx --yes http-server -a 0.0.0.0 -P http://localhost:${PORT}? -p ${PORT} build
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

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

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

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

@ -1,6 +1,6 @@
{ {
"name": "azure-ipam-ui", "name": "azure-ipam-ui",
"version": "1.1.0", "version": "2.0.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@azure/msal-browser": "^2.37.0", "@azure/msal-browser": "^2.37.0",
@ -26,15 +26,12 @@
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-redux": "^8.0.5", "react-redux": "^8.0.5",
"react-router-dom": "^6.11.1", "react-router-dom": "^6.11.1",
"react-scripts": "5.0.1",
"spinners-react": "^1.0.7", "spinners-react": "^1.0.7",
"web-vitals": "^2.1.4" "web-vitals": "^2.1.4"
}, },
"scripts": { "scripts": {
"start": "react-scripts start", "start": "vite",
"build": "react-scripts build", "build": "vite build"
"test": "react-scripts test",
"eject": "react-scripts eject"
}, },
"eslintConfig": { "eslintConfig": {
"extends": "react-app" "extends": "react-app"
@ -52,7 +49,9 @@
] ]
}, },
"devDependencies": { "devDependencies": {
"@vitejs/plugin-react": "^4.0.4",
"http-server": "^14.1.1", "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(()=>{ React.useEffect(()=>{
const env = { ...process.env, ...window['env'] } const env = { ...import.meta.env, ...window['env'] }
console.log("+++WEBSITE_DETAILS+++"); console.log("+++WEBSITE_DETAILS+++");
console.log(env); console.log(env);
console.log("+++++++++++++++++++++"); 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 = { const AZURE_ENV_MAP = {
AZURE_PUBLIC: { 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 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 UI_APP_ID = import.meta.env.VITE_UI_ID || window['env'].VITE_UI_ID;
export const ENGINE_APP_ID = process.env.REACT_APP_ENGINE_ID || window['env'].REACT_APP_ENGINE_ID; export const ENGINE_APP_ID = import.meta.env.VITE_ENGINE_ID || window['env'].VITE_ENGINE_ID;
export const TENANT_ID = process.env.REACT_APP_TENANT_ID || window['env'].REACT_APP_TENANT_ID; export const TENANT_ID = import.meta.env.VITE_TENANT_ID || window['env'].VITE_TENANT_ID;
export const getEngineURL = () => { export const getEngineURL = () => {
try { 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; return engineURL.origin;
} catch { } catch {
return window.location.origin; 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),
}
})
}