-
Notifications
You must be signed in to change notification settings - Fork 40
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Pwa deployment in cloudflare #108
base: master
Are you sure you want to change the base?
Changes from 30 commits
bc4fc7d
e1928fd
c423fb0
8250907
a9fac0c
236d727
1ea3a9b
94a7244
fea3b99
d127624
c6cf74c
9029d25
44d98ba
2521e6f
f014d3d
fc5f7a5
8f57fb7
ae9d7e4
ff02d79
8632975
8e9c564
afc881d
c0b1a5d
772147c
93ee4a7
c5f122a
c83c694
c5c6899
ce40f13
e3382a8
cdfe390
7c36616
9a87c35
33f07f6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,38 +1,59 @@ | ||
<!doctype html> | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="utf-8" /> | ||
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no" /> | ||
<meta name="theme-color" content="#1B1B1F" /> | ||
<meta name="description" content="manage your openpilot experience" /> | ||
<title>connect</title> | ||
|
||
<link rel="manifest" href="/manifest.json" /> | ||
<link | ||
href="/images/favicon-16x16.png" | ||
rel="icon" | ||
type="image/png" | ||
sizes="16x16" | ||
/> | ||
<link | ||
href="/images/favicon-32x32.png" | ||
rel="icon" | ||
type="image/png" | ||
sizes="32x32" | ||
/> | ||
<link | ||
rel="stylesheet" | ||
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,[email protected],400,0..1,0&display=block" | ||
/> | ||
<link | ||
rel="stylesheet" | ||
href="https://fonts.googleapis.com/css2?family=Inter:[email protected]&family=JetBrains+Mono:wght@400;500&display=swap" | ||
/> | ||
<link rel="manifest" href="/manifest.json"> | ||
<link href="/images/favicon-16x16.png" rel="icon" type="image/png" sizes="16x16"> | ||
<link href="/images/favicon-32x32.png" rel="icon" type="image/png" sizes="32x32"> | ||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,[email protected],400,0..1,0&display=block"> | ||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:[email protected]&family=JetBrains+Mono:wght@400;500&display=swap"> | ||
<!-- DON'T CHANGE MANUALLY. The below are auto-generated PWA assets (scripts defined in package.json). --> | ||
<meta name="mobile-web-app-capable" content="yes"> | ||
<link rel="apple-touch-icon" href="pwa-assets/apple-icon-180.png"> | ||
<meta name="apple-mobile-web-app-capable" content="yes"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2048-2732.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2732-2048.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1668-2388.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2388-1668.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1536-2048.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2048-1536.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1488-2266.jpg" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2266-1488.jpg" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1640-2360.jpg" media="(device-width: 820px) and (device-height: 1180px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2360-1640.jpg" media="(device-width: 820px) and (device-height: 1180px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1668-2224.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2224-1668.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1620-2160.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2160-1620.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1290-2796.jpg" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2796-1290.jpg" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1179-2556.jpg" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2556-1179.jpg" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1284-2778.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2778-1284.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1170-2532.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2532-1170.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1125-2436.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2436-1125.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1242-2688.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2688-1242.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-828-1792.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1792-828.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1242-2208.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-2208-1242.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-750-1334.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1334-750.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-640-1136.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> | ||
<link rel="apple-touch-startup-image" href="pwa-assets/apple-splash-1136-640.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> | ||
</head> | ||
<body data-theme="dark" class="overflow-x-hidden bg-background text-on-background"> | ||
<noscript>You need to enable JavaScript to run this app.</noscript> | ||
<div id="root"></div> | ||
|
||
<script src="/src/index.tsx" type="module"></script> | ||
</body> | ||
</html> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
{ | ||
"ci": { | ||
"collect": { | ||
"url": ["http://localhost:4173"], | ||
"startServerCommand": "bun run start | sed -u 's/^/[server] /' & pid=$!; sleep 2; echo 'Server is ready'; wait $pid", | ||
"startServerReadyPattern": "Server is ready", | ||
"numberOfRuns": 1, | ||
"settings": { | ||
"chromeFlags": "--no-sandbox" | ||
} | ||
}, | ||
"assert": { | ||
"assertions": { | ||
"categories:pwa": ["error", { "minScore": 1 }] | ||
} | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,7 +11,11 @@ | |
"scripts": { | ||
"build": "vite build", | ||
"dev": "vite", | ||
"generate-pwa-assets": "npx pwa-asset-generator ./public/images/icon-vector.svg ./pwa-assets -m ./public/manifest.json -i ./index.html --sizes \"72x72,96x96,128x128,144x144,152x152,192x192,384x384,512x512\" --quality 75 --background \"#ffffff\" --padding \"10%\" --platform android,ios --opaque false", | ||
"move-pwa-assets": "rm -rf ./public/pwa-assets && mv ./pwa-assets ./public/", | ||
"pwa-setup": "npm run generate-pwa-assets && npm run move-pwa-assets", | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
"serve": "vite prefix", | ||
"start": "vite preview", | ||
"lint": "eslint --cache --cache-location node_modules/.eslintcache", | ||
"prepare": "husky", | ||
"pre-commit": "bun lint", | ||
|
@@ -78,6 +82,7 @@ | |
"solid-js": "JS ui framework" | ||
}, | ||
"dependencies": { | ||
"@lhci/cli": "^0.14.0", | ||
"@mapbox/polyline": "^1.2.1", | ||
"@solid-primitives/state-machine": "^0.0.3", | ||
"@solidjs/router": "^0.13.5", | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="UTF-8"> | ||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
<title>No Connection</title> | ||
<style> | ||
body { | ||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; | ||
display: flex; | ||
justify-content: center; | ||
align-items: center; | ||
height: 100vh; | ||
margin: 0; | ||
background-color: rgb(27 27 33); | ||
color: #ffffff; | ||
} | ||
.container { | ||
text-align: center; | ||
padding: 3rem; | ||
background-color: rgba(255, 255, 255, 0.1); | ||
border-radius: 16px; | ||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | ||
backdrop-filter: blur(10px); | ||
max-width: 80%; | ||
} | ||
h1 { | ||
font-size: 2.5rem; | ||
margin-bottom: 0.5rem; | ||
} | ||
p { | ||
font-size: 1.1rem; | ||
margin-bottom: 2rem; | ||
opacity: 0.8; | ||
} | ||
.logo { | ||
width: 128px; | ||
height: 128px; | ||
margin-bottom: 2rem; | ||
filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3)); | ||
} | ||
.retry-button { | ||
background-color: #4CAF50; | ||
border: none; | ||
color: white; | ||
padding: 15px 32px; | ||
text-align: center; | ||
text-decoration: none; | ||
display: inline-block; | ||
font-size: 16px; | ||
margin: 4px 2px; | ||
cursor: pointer; | ||
border-radius: 8px; | ||
transition: background-color 0.3s; | ||
} | ||
.retry-button:hover { | ||
background-color: #45a049; | ||
} | ||
</style> | ||
</head> | ||
<body> | ||
<div class="container"> | ||
<img src="/images/icon-256.png" alt="comma connect logo" class="logo"> | ||
<h1>You're Offline</h1> | ||
<p>It seems you've lost your internet connection. Don't worry, we'll be here when you're back online.</p> | ||
<button class="retry-button" onclick="window.location.reload();">Try Again</button> | ||
</div> | ||
</body> | ||
</html> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
const SERVICE_WORKER_VERSION = 1; | ||
const CACHE_NAME = `comma-connect-cache-v${SERVICE_WORKER_VERSION}`; | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Incrementing the version number forces browsers to update their cached service worker when you deploy changes - without it, users might keep running old versions. |
||
const STATIC_ASSETS = [ | ||
'/index.html', | ||
'/manifest.json', | ||
'/no-connection.html', | ||
'/images/icon-256.png', | ||
]; | ||
|
||
const CACHEABLE_URL_PATTERNS = [ | ||
/\/images\/.*\.(png|jpg|svg)$/, | ||
/\/fonts\.googleapis\.com\//, | ||
/\/fonts\.gstatic\.com\//, | ||
]; | ||
|
||
self.addEventListener('install', (installEvent) => { | ||
installEvent.waitUntil( | ||
caches.open(CACHE_NAME).then((cache) => { | ||
return cache.addAll(STATIC_ASSETS); | ||
}) | ||
); | ||
}); | ||
|
||
self.addEventListener('fetch', (fetchEvent) => { | ||
if (fetchEvent.request.method !== 'GET') { | ||
return; | ||
} | ||
|
||
if (shouldCacheUrl(fetchEvent.request.url)) { | ||
fetchEvent.respondWith( | ||
caches.match(fetchEvent.request).then((cachedResponse) => { | ||
if (cachedResponse) { | ||
return cachedResponse; | ||
} | ||
return fetch(fetchEvent.request).then((networkResponse) => { | ||
if (networkResponse.status === 200) { | ||
const clonedResponse = networkResponse.clone(); | ||
caches.open(CACHE_NAME).then((cache) => { | ||
cache.put(fetchEvent.request, clonedResponse); | ||
}); | ||
} | ||
return networkResponse; | ||
}); | ||
}).catch(handleFetchError) | ||
); | ||
} else { | ||
fetchEvent.respondWith( | ||
fetch(fetchEvent.request).catch(handleFetchError) | ||
); | ||
} | ||
}); | ||
|
||
async function handleFetchError(error) { | ||
try { | ||
const cachedResponse = await caches.match('/no-connection.html'); | ||
if (cachedResponse) { | ||
const body = await cachedResponse.blob(); | ||
return new Response(body, { | ||
status: 200, | ||
headers: cachedResponse.headers | ||
}); | ||
} | ||
} catch (cacheError) { | ||
console.error('Cache error:', cacheError); | ||
return new Response('An error occurred.', { | ||
status: 503, | ||
headers: { 'Content-Type': 'text/html' } | ||
}); | ||
} | ||
} | ||
|
||
function shouldCacheUrl(url) { | ||
const urlPath = new URL(url).pathname; | ||
return CACHEABLE_URL_PATTERNS.some((pattern) => pattern.test(urlPath)); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Lighthouse CI uses "Server is ready" echo command to indicate when to start analysis.