Skip to content

Commit d97336a

Browse files
committed
DBC-5462: Switch to Vite
1 parent e11aeb2 commit d97336a

159 files changed

Lines changed: 6707 additions & 19752 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,22 @@ NODE_OPTIONS=<openssl-legacy-provider>
4646
FONTAWESOME_PACKAGE_TOKEN=<fontawesome package token>
4747

4848
# React
49-
REACT_APP_API_HOST=<localhost:8000/other hostname:port or IP:port of Django server>
50-
REACT_APP_BASE_MAP=<base map wms url>
51-
REACT_APP_MAP_STYLE=<map styling url>
52-
REACT_APP_REPLAY_THE_DAY=<replay the day url>
53-
REACT_APP_ROUTE_PLANNER=<route planner url>
54-
REACT_APP_ROUTE_PLANNER_KEY=<route planner auth key>
55-
REACT_APP_GEOCODER_HOST=<geocoder url>
56-
REACT_APP_GEOCODER_API_AUTH_KEY=<api auth key>
57-
REACT_APP_ROUTABLE_LOCATIONS_HOST=<routable locations api url>
58-
REACT_APP_RECAPTCHA_CLIENT_ID=<reCAPTCHA client ID>
59-
REACT_APP_SURVEY_LINK=<exit survey link>
60-
REACT_APP_REPORT_WMS_LAYER=<report wms layer url>
61-
REACT_APP_BCEID_REGISTER_URL=<URL for BCeID basic registration page>
62-
REACT_APP_FROM_EMAIL=<default from address for outgoing emails>
63-
REACT_APP_LEGACY_URL=<legacy URL for the old DriveBC site>
64-
REACT_APP_MAINTENANCE_MODE=<true/false to indicate if site is in maintenance mode>
49+
VITE_API_HOST=<localhost:8000/other hostname:port or IP:port of Django server>
50+
VITE_BASE_MAP=<base map wms url>
51+
VITE_MAP_STYLE=<map styling url>
52+
VITE_REPLAY_THE_DAY=<replay the day url>
53+
VITE_ROUTE_PLANNER=<route planner url>
54+
VITE_ROUTE_PLANNER_KEY=<route planner auth key>
55+
VITE_GEOCODER_HOST=<geocoder url>
56+
VITE_GEOCODER_API_AUTH_KEY=<api auth key>
57+
VITE_ROUTABLE_LOCATIONS_HOST=<routable locations api url>
58+
VITE_RECAPTCHA_CLIENT_ID=<reCAPTCHA client ID>
59+
VITE_SURVEY_LINK=<exit survey link>
60+
VITE_REPORT_WMS_LAYER=<report wms layer url>
61+
VITE_BCEID_REGISTER_URL=<URL for BCeID basic registration page>
62+
VITE_FROM_EMAIL=<default from address for outgoing emails>
63+
VITE_LEGACY_URL=<legacy URL for the old DriveBC site>
64+
VITE_MAINTENANCE_MODE=<true/false to indicate if site is in maintenance mode>
6565

6666
# API
6767
DRIVEBC_INLAND_FERRY_API_BASE_URL=<inland ferry api url>
@@ -106,12 +106,12 @@ CLOSED_PHRASE_IDS=18, 20, 22, 23, 26, 30, 32, 182, 320, 325, 327
106106
DRIVEBC_BORDER_CROSSING_LANE_DELAY_BASE_URL=<border crossing lane delay api url>
107107

108108
# Route API
109-
REACT_APP_PRIMARY_ROUTE_GDF=<primary route GDF values>
110-
REACT_APP_PRIMARY_ROUTE_XINGCOST=<primary route XINGCOST values>
111-
REACT_APP_PRIMARY_ROUTE_TURNCOST=<primary route TURNCOST values>
112-
REACT_APP_ALTERNATE_ROUTE_GDF=<alternate route GDF values>
113-
REACT_APP_ALTERNATE_ROUTE_XINGCOST=<alternate route XINGCOST values>
114-
REACT_APP_ALTERNATE_ROUTE_TURNCOST=<alternate route TURNCOST values>
109+
VITE_PRIMARY_ROUTE_GDF=<primary route GDF values>
110+
VITE_PRIMARY_ROUTE_XINGCOST=<primary route XINGCOST values>
111+
VITE_PRIMARY_ROUTE_TURNCOST=<primary route TURNCOST values>
112+
VITE_ALTERNATE_ROUTE_GDF=<alternate route GDF values>
113+
VITE_ALTERNATE_ROUTE_XINGCOST=<alternate route XINGCOST values>
114+
VITE_ALTERNATE_ROUTE_TURNCOST=<alternate route TURNCOST values>
115115

116116
# RIDE
117117
RIDE_EVENT_PREFIX=<RIDE event ID prefix>

compose/frontend/StaticBuild

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,29 @@
55
############################################
66
FROM node:24-alpine AS buildnode
77

8-
WORKDIR /app/
9-
COPY ./src/frontend/package.json ./src/frontend/package-lock.json ./src/frontend/.npmrc ./
8+
WORKDIR /app
9+
COPY ./src/frontend/ /app/
10+
11+
ARG DEBUG_BUILD=false
1012

1113
RUN --mount=type=secret,id=FONTAWESOME_PACKAGE_TOKEN \
1214
test -s /run/secrets/FONTAWESOME_PACKAGE_TOKEN || { echo "FONTAWESOME_PACKAGE_TOKEN secret missing"; exit 1; }; \
1315
export FONTAWESOME_PACKAGE_TOKEN="$(cat /run/secrets/FONTAWESOME_PACKAGE_TOKEN)" && \
1416
npm ci
1517

1618
COPY ./src/frontend/ /app/
17-
19+
ENV NODE_ENV=production
1820
RUN npm run openshift_build
1921

22+
# Gzip and Brotli compress
23+
RUN apk add --no-cache gzip brotli && \
24+
find /app/build -type f \( \
25+
-name '*.js' -o -name '*.css' -o -name '*.html' -o -name '*.json' -o -name '*.svg' \
26+
\) -exec sh -c ' \
27+
gzip -9 -k "$1" && \
28+
brotli -q 11 -k "$1" \
29+
' _ {} \;
30+
2031
############################################
2132
# Builder: compile brotli modules from #
2233
# source against the exact nginx version #
@@ -65,17 +76,7 @@ RUN mkdir -p /tmp/client_temp /tmp/proxy_temp /tmp/fastcgi_temp /tmp/uwsgi_temp
6576
&& chmod -R 777 /tmp/client_temp /tmp/proxy_temp /tmp/fastcgi_temp /tmp/uwsgi_temp /tmp/scgi_temp /tmp/cache/nginx
6677

6778
# Copy built assets
68-
RUN mkdir -p /usr/share/nginx/html
69-
COPY --from=buildnode /app/build /usr/share/nginx/html
70-
71-
# --- Pre-compress Static Assets (JS, CSS, SVG) ---
72-
RUN echo "Pre-compressing static assets with Gzip and Brotli..." && \
73-
find /usr/share/nginx/html/static/js -name "*.js" -exec gzip -k -9 {} + && \
74-
find /usr/share/nginx/html/static/css -name "*.css" -exec gzip -k -9 {} + && \
75-
find /usr/share/nginx/html/static/media -name "*.svg" -exec gzip -k -9 {} + && \
76-
find /usr/share/nginx/html/static/js -name "*.js" -exec brotli -f -k -q 11 {} + && \
77-
find /usr/share/nginx/html/static/css -name "*.css" -exec brotli -f -k -q 11 {} + && \
78-
find /usr/share/nginx/html/static/media -name "*.svg" -exec brotli -f -k -q 11 {} +
79+
COPY --from=buildnode /app/build/ /usr/share/nginx/html/
7980

8081
# Copy NGINX configuration files
8182
COPY ./compose/frontend/default.conf /etc/nginx/conf.d/default.conf

compose/frontend/generate-config.sh

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,27 @@ cp -r /usr/share/nginx/html/* "${SHARED_CONFIG}/"
1515
cat > "${SHARED_CONFIG}/config_snippet.html" <<EOF
1616
<script>
1717
window.__ENV__ = {
18-
BASE_MAP: '${REACT_APP_BASE_MAP}',
19-
MAP_STYLE: '${REACT_APP_MAP_STYLE}',
20-
API_HOST: '${REACT_APP_API_HOST}',
21-
REPORT_WMS_LAYER: '${REACT_APP_REPORT_WMS_LAYER}',
22-
GEOCODER_HOST: '${REACT_APP_GEOCODER_HOST}',
23-
GEOCODER_API_CLIENT_ID: '${REACT_APP_GEOCODER_API_CLIENT_ID}',
24-
ROUTABLE_LOCATIONS_HOST: '${REACT_APP_ROUTABLE_LOCATIONS_HOST}',
25-
ROUTE_PLANNER: '${REACT_APP_ROUTE_PLANNER}',
26-
ROUTE_PLANNER_CLIENT_ID: '${REACT_APP_ROUTE_PLANNER_CLIENT_ID}',
27-
REPLAY_THE_DAY: '${REACT_APP_REPLAY_THE_DAY}',
28-
SURVEY_LINK: '${REACT_APP_SURVEY_LINK}',
29-
BCEID_REGISTER_URL: '${REACT_APP_BCEID_REGISTER_URL}',
30-
FROM_EMAIL: '${REACT_APP_FROM_EMAIL}',
31-
LEGACY_URL: '${REACT_APP_LEGACY_URL}',
32-
RECAPTCHA_CLIENT_ID: '${REACT_APP_RECAPTCHA_CLIENT_ID}',
33-
PRIMARY_ROUTE_GDF: '${REACT_APP_PRIMARY_ROUTE_GDF}',
34-
PRIMARY_ROUTE_TURNCOST: '${REACT_APP_PRIMARY_ROUTE_TURNCOST}',
35-
PRIMARY_ROUTE_XINGCOST: '${REACT_APP_PRIMARY_ROUTE_XINGCOST}',
36-
ALTERNATE_ROUTE_GDF: '${REACT_APP_ALTERNATE_ROUTE_GDF}',
37-
ALTERNATE_ROUTE_TURNCOST: '${REACT_APP_ALTERNATE_ROUTE_TURNCOST}',
38-
ALTERNATE_ROUTE_XINGCOST: '${REACT_APP_ALTERNATE_ROUTE_XINGCOST}',
18+
BASE_MAP: '${VITE_BASE_MAP:-$REACT_APP_BASE_MAP}',
19+
MAP_STYLE: '${VITE_MAP_STYLE:-$REACT_APP_MAP_STYLE}',
20+
API_HOST: '${VITE_API_HOST:-$REACT_APP_API_HOST}',
21+
REPORT_WMS_LAYER: '${VITE_REPORT_WMS_LAYER:-$REACT_APP_REPORT_WMS_LAYER}',
22+
GEOCODER_HOST: '${VITE_GEOCODER_HOST:-$REACT_APP_GEOCODER_HOST}',
23+
GEOCODER_API_CLIENT_ID: '${VITE_GEOCODER_API_CLIENT_ID:-$REACT_APP_GEOCODER_API_CLIENT_ID}',
24+
ROUTABLE_LOCATIONS_HOST: '${VITE_ROUTABLE_LOCATIONS_HOST:-$REACT_APP_ROUTABLE_LOCATIONS_HOST}',
25+
ROUTE_PLANNER: '${VITE_ROUTE_PLANNER:-$REACT_APP_ROUTE_PLANNER}',
26+
ROUTE_PLANNER_CLIENT_ID: '${VITE_ROUTE_PLANNER_CLIENT_ID:-$REACT_APP_ROUTE_PLANNER_CLIENT_ID}',
27+
REPLAY_THE_DAY: '${VITE_REPLAY_THE_DAY:-$REACT_APP_REPLAY_THE_DAY}',
28+
SURVEY_LINK: '${VITE_SURVEY_LINK:-$REACT_APP_SURVEY_LINK}',
29+
BCEID_REGISTER_URL: '${VITE_BCEID_REGISTER_URL:-$REACT_APP_BCEID_REGISTER_URL}',
30+
FROM_EMAIL: '${VITE_FROM_EMAIL:-$REACT_APP_FROM_EMAIL}',
31+
LEGACY_URL: '${VITE_LEGACY_URL:-$REACT_APP_LEGACY_URL}',
32+
RECAPTCHA_CLIENT_ID: '${VITE_RECAPTCHA_CLIENT_ID:-$REACT_APP_RECAPTCHA_CLIENT_ID}',
33+
PRIMARY_ROUTE_GDF: '${VITE_PRIMARY_ROUTE_GDF:-$REACT_APP_PRIMARY_ROUTE_GDF}',
34+
PRIMARY_ROUTE_TURNCOST: '${VITE_PRIMARY_ROUTE_TURNCOST:-$REACT_APP_PRIMARY_ROUTE_TURNCOST}',
35+
PRIMARY_ROUTE_XINGCOST: '${VITE_PRIMARY_ROUTE_XINGCOST:-$REACT_APP_PRIMARY_ROUTE_XINGCOST}',
36+
ALTERNATE_ROUTE_GDF: '${VITE_ALTERNATE_ROUTE_GDF:-$REACT_APP_ALTERNATE_ROUTE_GDF}',
37+
ALTERNATE_ROUTE_TURNCOST: '${VITE_ALTERNATE_ROUTE_TURNCOST:-$REACT_APP_ALTERNATE_ROUTE_TURNCOST}',
38+
ALTERNATE_ROUTE_XINGCOST: '${VITE_ALTERNATE_ROUTE_XINGCOST:-$REACT_APP_ALTERNATE_ROUTE_XINGCOST}',
3939
DEPLOYMENT_TAG: '${DEPLOYMENT_TAG}',
4040
MAINTENANCE_MODE: '${MAINTENANCE_MODE}',
4141
RELEASE: '${RELEASE:-}',

src/frontend/.eslintrc.js

Lines changed: 0 additions & 48 deletions
This file was deleted.

src/frontend/eslint.config.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import js from "@eslint/js";
2+
import globals from "globals";
3+
import pluginReact from "eslint-plugin-react";
4+
import prettierConfig from "eslint-config-prettier";
5+
import { defineConfig } from "eslint/config";
6+
7+
export default defineConfig([
8+
js.configs.recommended,
9+
pluginReact.configs.flat.recommended,
10+
{
11+
files: ["**/*.{js,mjs,cjs,jsx}"],
12+
languageOptions: {
13+
ecmaVersion: "latest",
14+
sourceType: "module",
15+
globals: {
16+
...globals.browser,
17+
...globals.node,
18+
},
19+
},
20+
settings: {
21+
react: {
22+
version: "detect",
23+
},
24+
},
25+
rules: {
26+
"react/react-in-jsx-scope": "off",
27+
"react/prop-types": "off",
28+
"no-unused-vars": "off",
29+
},
30+
},
31+
32+
prettierConfig,
33+
34+
{
35+
ignores: ["build/**", "dist/**", "node_modules/**"],
36+
}
37+
]);
Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,26 @@
22
<html lang="en">
33
<head>
44
<meta charset="utf-8" />
5-
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
6-
<link rel="apple-touch-icon" sizes="180x180" href="%PUBLIC_URL%/apple-touch-icon.png">
7-
<link rel="icon" type="image/png" sizes="32x32" href="%PUBLIC_URL%/favicon-32x32.png">
8-
<link rel="icon" type="image/png" sizes="16x16" href="%PUBLIC_URL%/favicon-16x16.png">
9-
<link rel="manifest" href="%PUBLIC_URL%/site.webmanifest">
5+
<link rel="icon" href="/favicon.ico" />
6+
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
7+
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
8+
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
9+
<link rel="manifest" href="/site.webmanifest">
1010

1111
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, interactive-widget=resizes-content">
1212
<meta name="theme-color" content="#ffffff" />
1313
<meta name="description" content="Check real-time BC road conditions, closures, highway webcams, and delays with DriveBC.">
1414
<meta name="keywords" content="DriveBC, BC road conditions, highway closures, BC traffic, travel advisories, road webcams, BC weather, ferry delays, British Columbia, travel information">
1515
<meta property="og:description" content="Check real-time BC road conditions, closures, highway webcams, and delays with DriveBC.">
1616
<meta property="og:title" content="DriveBC">
17-
<meta property="og:image" content="%PUBLIC_URL%/og-image.jpg">
17+
<meta property="og:image" content="/og-image.jpg">
1818
<meta property="og:url" content="https://www.drivebc.ca">
1919

2020
<!--
2121
manifest.json provides metadata used when your web app is installed on a
2222
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
2323
-->
24-
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
25-
<!--
26-
Notice the use of %PUBLIC_URL% in the tags above.
27-
It will be replaced with the URL of the `public` folder during the build.
28-
Only files inside the `public` folder can be referenced from the HTML.
29-
30-
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
31-
work correctly both with client-side routing and a non-root public URL.
32-
Learn how to configure a non-root public URL by running `npm run build`.
33-
-->
24+
<link rel="manifest" href="/manifest.json" />
3425
<link rel="preconnect" href="https://tiles.arcgis.com">
3526
<link rel="preconnect" href="https://www.arcgis.com">
3627
<title>DriveBC</title>
@@ -39,16 +30,16 @@
3930
font-family: 'BCSans';
4031
font-style: normal;
4132
font-weight: 400;
42-
src: url('%PUBLIC_URL%/fonts/bc-sans/BCSans-Regular.woff2') format('woff2'),
43-
url('%PUBLIC_URL%/fonts/bc-sans/BCSans-Regular.woff') format('woff');
33+
src: url('/fonts/bc-sans/BCSans-Regular.woff2') format('woff2'),
34+
url('/fonts/bc-sans/BCSans-Regular.woff') format('woff');
4435
font-display: swap;
4536
}
4637
@font-face {
4738
font-family: 'BCSans';
4839
font-style: normal;
4940
font-weight: 700;
50-
src: url('%PUBLIC_URL%/fonts/bc-sans/BCSans-Bold.woff2') format('woff2'),
51-
url('%PUBLIC_URL%/fonts/bc-sans/BCSans-Bold.woff') format('woff');
41+
src: url('/fonts/bc-sans/BCSans-Bold.woff2') format('woff2'),
42+
url('/fonts/bc-sans/BCSans-Bold.woff') format('woff');
5243
font-display: swap;
5344
}
5445
</style>
@@ -57,6 +48,7 @@
5748
<body>
5849
<noscript>You need to enable JavaScript to run this app.</noscript>
5950
<div id="root"></div>
51+
<script type="module" src="/src/index.jsx"></script>
6052
<!--
6153
This HTML file is a template.
6254
If you open it directly in the browser, you will see an empty page.

0 commit comments

Comments
 (0)