From 5a7272f987fb13a9a8d60f7ec2912f9078461549 Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 19:40:03 -0700 Subject: [PATCH 01/35] create initial `offline.html` --- apps/frontend/public/offline.html | 68 +++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 apps/frontend/public/offline.html diff --git a/apps/frontend/public/offline.html b/apps/frontend/public/offline.html new file mode 100644 index 0000000..92d9df7 --- /dev/null +++ b/apps/frontend/public/offline.html @@ -0,0 +1,68 @@ +
+
+
+            (╥﹏╥)
+        
+ +

+ page not found +

+
+ +
+ + go home + + + +
+
From 702f7a290ff9dd7991fb3a59e6404f1531340366 Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 19:40:53 -0700 Subject: [PATCH 02/35] add `/offline.html` to `routesToCache` --- apps/frontend/scripts/generate-resource-list.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/frontend/scripts/generate-resource-list.js b/apps/frontend/scripts/generate-resource-list.js index c21d0de..e9b76cd 100644 --- a/apps/frontend/scripts/generate-resource-list.js +++ b/apps/frontend/scripts/generate-resource-list.js @@ -14,6 +14,7 @@ const routesToCache = [ '/wheres-waldo', '/about', '/blog', + '/offline.html', ] const assetPaths = Object.values(manifest).flatMap((entry) => [ @@ -22,11 +23,8 @@ const assetPaths = Object.values(manifest).flatMap((entry) => [ ]) const favicons = ['icon.svg', 'icon-512.png', 'icon-192.png', '/favicon.ico'] - const resourcesToCache = [...routesToCache, ...assetPaths, ...favicons] - const resourceList = `const RESOURCE_LIST = ${JSON.stringify(resourcesToCache, null, 2)};` - fs.writeFileSync(outputPath, resourceList) console.log('Resource list generated:', outputPath) From d6e2ef03340a7f64762bffa1181cc9a85d7c26aa Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 20:30:47 -0700 Subject: [PATCH 03/35] return cached offline page --- apps/frontend/public/service-worker.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index e402c61..88170bd 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -93,7 +93,17 @@ addEventListener('fetch', (event) => { return cachedResponse } - return await handleFetch(event.request, cache) + try { + return await handleFetch(event.request, cache) + } catch (error) { + console.error( + `Failed to fetch from network for ${event.request.url}:`, + error + ) + + const offline = await caches.match('/offline.html') + return offline + } })() ) }) From 8eb35fbb0e92a84f8c0dd32a2be6fc1a1753f485 Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 20:32:43 -0700 Subject: [PATCH 04/35] improve offline page --- apps/frontend/public/offline.html | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/apps/frontend/public/offline.html b/apps/frontend/public/offline.html index 92d9df7..ebe429c 100644 --- a/apps/frontend/public/offline.html +++ b/apps/frontend/public/offline.html @@ -3,9 +3,10 @@ display: flex; flex-direction: column; align-items: center; - gap: 2rem; - padding-bottom: 4rem; - padding-top: 2.75rem; + gap: 3.5rem; + padding-bottom: 9rem; + padding-top: 6rem; + font-family: system-ui; " >
-
+        
             (╥﹏╥)
         
-

- page not found +

+ network offline

@@ -34,10 +42,11 @@

align-items: center; border-radius: 9999px; background-color: black; - padding: 0.5rem 1rem; + padding: 0.625rem 1.25rem; text-align: center; color: white; transition: background-color 0.2s ease-in-out; + text-decoration: none; " onmouseover="this.style.backgroundColor='rgba(0, 0, 0, 0.8)'" onmouseout="this.style.backgroundColor='black'" @@ -55,6 +64,7 @@

padding: 0.5rem 1rem; text-align: center; color: rgba(0, 0, 0, 0.8); + background-color: transparent; transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; From 336753a08a6c36a9912fc3f85542a804fea508ac Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 20:41:48 -0700 Subject: [PATCH 05/35] wrap offline page in response --- apps/frontend/public/service-worker.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 88170bd..3342cec 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -102,7 +102,12 @@ addEventListener('fetch', (event) => { ) const offline = await caches.match('/offline.html') - return offline + if (offline) + return new Response(offline, { + status: 503, + statusText: 'Service Unavailable', + headers: { 'Content-Type': 'text/html' }, + }) } })() ) From cb8fc494f74c20d1828018e975dc71a4ba67780f Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 20:54:37 -0700 Subject: [PATCH 06/35] fix usage of cache --- apps/frontend/public/service-worker.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 3342cec..28aa3bd 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -101,13 +101,8 @@ addEventListener('fetch', (event) => { error ) - const offline = await caches.match('/offline.html') - if (offline) - return new Response(offline, { - status: 503, - statusText: 'Service Unavailable', - headers: { 'Content-Type': 'text/html' }, - }) + const offline = await cache.match('/offline.html') + return offline } })() ) From 5a1e5b70f4e475edb3e56f39e5bf41d4de025326 Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 20:59:06 -0700 Subject: [PATCH 07/35] embed HTML in service worker --- apps/frontend/public/service-worker.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 28aa3bd..51cfee9 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -101,8 +101,14 @@ addEventListener('fetch', (event) => { error ) - const offline = await cache.match('/offline.html') - return offline + return new Response( + '

network offline

go home
', + { + status: 503, + statusText: 'Service Unavailable', + headers: { 'Content-Type': 'text/html' }, + } + ) } })() ) From d4595c1b39c7f00bc87fc446779bfb872e29468a Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 21:06:34 -0700 Subject: [PATCH 08/35] temporarily include page in allowed origins --- packages/api/src/server/start-server.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/api/src/server/start-server.ts b/packages/api/src/server/start-server.ts index 830f1b2..de688c2 100644 --- a/packages/api/src/server/start-server.ts +++ b/packages/api/src/server/start-server.ts @@ -7,6 +7,7 @@ const allowedOrigins = 'https://devlinrocha.com', 'https://www.devlinrocha.com', 'https://staging.devlinrocha.com', + 'https://staging.devlinrocha.pages.dev', 'https://www.staging.devlinrocha.com', ] : ['http://localhost:4173', 'http://localhost:5173'] From 0c8e93ff1efa73b58f6b14b574cc7e6aa59531db Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 21:18:33 -0700 Subject: [PATCH 09/35] return cached offline page --- apps/frontend/public/service-worker.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 51cfee9..28aa3bd 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -101,14 +101,8 @@ addEventListener('fetch', (event) => { error ) - return new Response( - '

network offline

go home
', - { - status: 503, - statusText: 'Service Unavailable', - headers: { 'Content-Type': 'text/html' }, - } - ) + const offline = await cache.match('/offline.html') + return offline } })() ) From 5af99d487a0e5da6de8af5ddf2b5d4e304e46e7e Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 21:23:25 -0700 Subject: [PATCH 10/35] wrap offline in response --- apps/frontend/public/service-worker.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 28aa3bd..4c4e3d3 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -102,7 +102,11 @@ addEventListener('fetch', (event) => { ) const offline = await cache.match('/offline.html') - return offline + return new Response(offline, { + status: 503, + statusText: 'Service Unavailable', + headers: { 'Content-Type': 'text/html' }, + }) } })() ) From f4bc9aad6aacf71fe798db8817b272a6e7b050a8 Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 21:28:24 -0700 Subject: [PATCH 11/35] convert response to text --- apps/frontend/public/service-worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 4c4e3d3..c11bff5 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -102,7 +102,7 @@ addEventListener('fetch', (event) => { ) const offline = await cache.match('/offline.html') - return new Response(offline, { + return new Response(offline.text(), { status: 503, statusText: 'Service Unavailable', headers: { 'Content-Type': 'text/html' }, From 7339c7845e866ca1a3080deea02f1ea99df82128 Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 21:31:18 -0700 Subject: [PATCH 12/35] use `await` --- apps/frontend/public/service-worker.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index c11bff5..b6132b9 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -101,8 +101,10 @@ addEventListener('fetch', (event) => { error ) - const offline = await cache.match('/offline.html') - return new Response(offline.text(), { + const offlineResponse = await cache.match('/offline.html') + const offlineBody = await offlineResponse.text() + + return new Response(offlineBody, { status: 503, statusText: 'Service Unavailable', headers: { 'Content-Type': 'text/html' }, From 73c5e89c389733f90cec99292c1957ee211b004e Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 23:16:21 -0700 Subject: [PATCH 13/35] move `offline.html` --- apps/frontend/{public => src/assets}/offline.html | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/frontend/{public => src/assets}/offline.html (100%) diff --git a/apps/frontend/public/offline.html b/apps/frontend/src/assets/offline.html similarity index 100% rename from apps/frontend/public/offline.html rename to apps/frontend/src/assets/offline.html From 4995f8f4c18405624ed973423c8b641d0f75e1c4 Mon Sep 17 00:00:00 2001 From: Devlin Date: Sun, 30 Mar 2025 23:16:47 -0700 Subject: [PATCH 14/35] fix cached offline page --- apps/frontend/public/service-worker.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index b6132b9..ff17f94 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -1,6 +1,7 @@ /* eslint-env worker */ /* eslint-disable no-undef */ importScripts('/resource-list.js') +import offlineHtml from './assets/offline.html' const CACHE_NAME = 'devlin-frontend-v0.0.1' @@ -45,6 +46,12 @@ addEventListener('install', (event) => { (async () => { const cache = await getCache() await cache.addAll(RESOURCE_LIST) + await cache.put( + '/offline', + new Response(offlineHtml, { + headers: { 'Content-Type': 'text/html' }, + }) + ) })() ) @@ -101,7 +108,7 @@ addEventListener('fetch', (event) => { error ) - const offlineResponse = await cache.match('/offline.html') + const offlineResponse = await cache.match('/offline') const offlineBody = await offlineResponse.text() return new Response(offlineBody, { From 77756b0915ae0bc6598da29c9f925c9a3e3e70d5 Mon Sep 17 00:00:00 2001 From: Devlin Date: Mon, 31 Mar 2025 00:20:28 -0700 Subject: [PATCH 15/35] move `offline.html` --- apps/frontend/scripts/generate-resource-list.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/frontend/scripts/generate-resource-list.js b/apps/frontend/scripts/generate-resource-list.js index e9b76cd..ef010b6 100644 --- a/apps/frontend/scripts/generate-resource-list.js +++ b/apps/frontend/scripts/generate-resource-list.js @@ -14,7 +14,6 @@ const routesToCache = [ '/wheres-waldo', '/about', '/blog', - '/offline.html', ] const assetPaths = Object.values(manifest).flatMap((entry) => [ @@ -27,4 +26,8 @@ const resourcesToCache = [...routesToCache, ...assetPaths, ...favicons] const resourceList = `const RESOURCE_LIST = ${JSON.stringify(resourcesToCache, null, 2)};` fs.writeFileSync(outputPath, resourceList) +const outputPathOffline = path.resolve('src/assets/offline.html') +const offline = fs.readFileSync(path.join(distDir, 'offline.html'), 'utf-8') +fs.writeFileSync(outputPathOffline, offline) + console.log('Resource list generated:', outputPath) From b27109995f8cfa39f26c5ebfd7f7df8b683992c9 Mon Sep 17 00:00:00 2001 From: Devlin Date: Mon, 31 Mar 2025 01:57:17 -0700 Subject: [PATCH 16/35] add html tags --- apps/frontend/src/assets/offline.html | 154 ++++++++++++++------------ 1 file changed, 83 insertions(+), 71 deletions(-) diff --git a/apps/frontend/src/assets/offline.html b/apps/frontend/src/assets/offline.html index ebe429c..682580b 100644 --- a/apps/frontend/src/assets/offline.html +++ b/apps/frontend/src/assets/offline.html @@ -1,78 +1,90 @@ -
-
-
-            (╥﹏╥)
-        
+ + + + + + Offline + -

- network offline -

-
- -
- +
- go home - +
+
+            (╥﹏╥)
+        
- -
-
+

+ network offline +

+
+ +
+ + go home + + + +
+
+ + From 1edf61f028610a34fe9b9742a9aebd7b7bdac0bf Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 03:09:54 -0700 Subject: [PATCH 17/35] set `charset=UTF-8` --- apps/frontend/public/service-worker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index ff17f94..6316963 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -49,7 +49,7 @@ addEventListener('install', (event) => { await cache.put( '/offline', new Response(offlineHtml, { - headers: { 'Content-Type': 'text/html' }, + headers: { 'Content-Type': 'text/html; charset=UTF-8' }, }) ) })() @@ -114,7 +114,7 @@ addEventListener('fetch', (event) => { return new Response(offlineBody, { status: 503, statusText: 'Service Unavailable', - headers: { 'Content-Type': 'text/html' }, + headers: { 'Content-Type': 'text/html; charset=UTF-8' }, }) } })() From 8384e064971d7e5bd1ea52c404a5d493f2a1a980 Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 03:14:32 -0700 Subject: [PATCH 18/35] adjust `offline.html` output --- apps/frontend/scripts/generate-resource-list.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/frontend/scripts/generate-resource-list.js b/apps/frontend/scripts/generate-resource-list.js index ef010b6..434a3f2 100644 --- a/apps/frontend/scripts/generate-resource-list.js +++ b/apps/frontend/scripts/generate-resource-list.js @@ -26,8 +26,11 @@ const resourcesToCache = [...routesToCache, ...assetPaths, ...favicons] const resourceList = `const RESOURCE_LIST = ${JSON.stringify(resourcesToCache, null, 2)};` fs.writeFileSync(outputPath, resourceList) -const outputPathOffline = path.resolve('src/assets/offline.html') -const offline = fs.readFileSync(path.join(distDir, 'offline.html'), 'utf-8') +const outputPathOffline = path.join(distDir, 'offline.html') +const offline = fs.readFileSync( + path.resolve('src/assets/offline.html'), + 'utf-8' +) fs.writeFileSync(outputPathOffline, offline) console.log('Resource list generated:', outputPath) From 6fb1d7d330d6c36d8e624d5d58d0daaa97326f5d Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 13:02:31 -0700 Subject: [PATCH 19/35] lowercase utf --- apps/frontend/public/service-worker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 6316963..1eb3800 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -49,7 +49,7 @@ addEventListener('install', (event) => { await cache.put( '/offline', new Response(offlineHtml, { - headers: { 'Content-Type': 'text/html; charset=UTF-8' }, + headers: { 'Content-Type': 'text/html; charset=utf-8' }, }) ) })() @@ -114,7 +114,7 @@ addEventListener('fetch', (event) => { return new Response(offlineBody, { status: 503, statusText: 'Service Unavailable', - headers: { 'Content-Type': 'text/html; charset=UTF-8' }, + headers: { 'Content-Type': 'text/html; charset=utf-8' }, }) } })() From 5c789025f16edf32052e91765635c6274fe5a3d7 Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 13:05:19 -0700 Subject: [PATCH 20/35] update `vite` to version `6.2.4` --- apps/frontend/package.json | 2 +- pnpm-lock.yaml | 242 ++++++++++++++++++------------------- 2 files changed, 122 insertions(+), 122 deletions(-) diff --git a/apps/frontend/package.json b/apps/frontend/package.json index e1d5d2d..12bfe03 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -33,6 +33,6 @@ "postcss": "^8.5.3", "prettier-plugin-tailwindcss": "^0.6.11", "tailwindcss": "^3.4.17", - "vite": "^6.2.3" + "vite": "^6.2.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fbd8f38..9504178 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -81,7 +81,7 @@ importers: version: 1.114.29(@tanstack/react-router@1.100.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.114.29)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3) '@tanstack/router-plugin': specifier: ^1.114.30 - version: 1.114.30(@tanstack/react-router@1.100.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.2.3(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1)) + version: 1.114.30(@tanstack/react-router@1.100.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.2.4(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1)) '@types/react': specifier: ^19.0.12 version: 19.0.12 @@ -90,7 +90,7 @@ importers: version: 19.0.4(@types/react@19.0.12) '@vitejs/plugin-react-swc': specifier: ^3.8.1 - version: 3.8.1(vite@6.2.3(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1)) + version: 3.8.1(vite@6.2.4(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1)) autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.3) @@ -104,8 +104,8 @@ importers: specifier: ^3.4.17 version: 3.4.17 vite: - specifier: ^6.2.3 - version: 6.2.3(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1) + specifier: ^6.2.4 + version: 6.2.4(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1) packages/api: dependencies: @@ -247,152 +247,152 @@ packages: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} deprecated: 'Merged into tsx: https://tsx.is' - '@esbuild/aix-ppc64@0.25.1': - resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + '@esbuild/aix-ppc64@0.25.2': + resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.1': - resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + '@esbuild/android-arm64@0.25.2': + resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.1': - resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + '@esbuild/android-arm@0.25.2': + resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.1': - resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + '@esbuild/android-x64@0.25.2': + resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.1': - resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + '@esbuild/darwin-arm64@0.25.2': + resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.1': - resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + '@esbuild/darwin-x64@0.25.2': + resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.1': - resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + '@esbuild/freebsd-arm64@0.25.2': + resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.1': - resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + '@esbuild/freebsd-x64@0.25.2': + resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.1': - resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + '@esbuild/linux-arm64@0.25.2': + resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.1': - resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + '@esbuild/linux-arm@0.25.2': + resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.1': - resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + '@esbuild/linux-ia32@0.25.2': + resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.1': - resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + '@esbuild/linux-loong64@0.25.2': + resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.1': - resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + '@esbuild/linux-mips64el@0.25.2': + resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.1': - resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + '@esbuild/linux-ppc64@0.25.2': + resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.1': - resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + '@esbuild/linux-riscv64@0.25.2': + resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.1': - resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + '@esbuild/linux-s390x@0.25.2': + resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.1': - resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + '@esbuild/linux-x64@0.25.2': + resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.1': - resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + '@esbuild/netbsd-arm64@0.25.2': + resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.1': - resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + '@esbuild/netbsd-x64@0.25.2': + resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.1': - resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + '@esbuild/openbsd-arm64@0.25.2': + resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.1': - resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + '@esbuild/openbsd-x64@0.25.2': + resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.1': - resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + '@esbuild/sunos-x64@0.25.2': + resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.1': - resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + '@esbuild/win32-arm64@0.25.2': + resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.1': - resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + '@esbuild/win32-ia32@0.25.2': + resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.1': - resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + '@esbuild/win32-x64@0.25.2': + resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1345,8 +1345,8 @@ packages: peerDependencies: esbuild: latest - esbuild@0.25.1: - resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + esbuild@0.25.2: + resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} engines: {node: '>=18'} hasBin: true @@ -2656,8 +2656,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@6.2.3: - resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==} + vite@6.2.4: + resolution: {integrity: sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -2885,7 +2885,7 @@ snapshots: '@esbuild-kit/core-utils@3.3.2': dependencies: - esbuild: 0.25.1 + esbuild: 0.25.2 source-map-support: 0.5.21 '@esbuild-kit/esm-loader@2.6.5': @@ -2893,79 +2893,79 @@ snapshots: '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.10.0 - '@esbuild/aix-ppc64@0.25.1': + '@esbuild/aix-ppc64@0.25.2': optional: true - '@esbuild/android-arm64@0.25.1': + '@esbuild/android-arm64@0.25.2': optional: true - '@esbuild/android-arm@0.25.1': + '@esbuild/android-arm@0.25.2': optional: true - '@esbuild/android-x64@0.25.1': + '@esbuild/android-x64@0.25.2': optional: true - '@esbuild/darwin-arm64@0.25.1': + '@esbuild/darwin-arm64@0.25.2': optional: true - '@esbuild/darwin-x64@0.25.1': + '@esbuild/darwin-x64@0.25.2': optional: true - '@esbuild/freebsd-arm64@0.25.1': + '@esbuild/freebsd-arm64@0.25.2': optional: true - '@esbuild/freebsd-x64@0.25.1': + '@esbuild/freebsd-x64@0.25.2': optional: true - '@esbuild/linux-arm64@0.25.1': + '@esbuild/linux-arm64@0.25.2': optional: true - '@esbuild/linux-arm@0.25.1': + '@esbuild/linux-arm@0.25.2': optional: true - '@esbuild/linux-ia32@0.25.1': + '@esbuild/linux-ia32@0.25.2': optional: true - '@esbuild/linux-loong64@0.25.1': + '@esbuild/linux-loong64@0.25.2': optional: true - '@esbuild/linux-mips64el@0.25.1': + '@esbuild/linux-mips64el@0.25.2': optional: true - '@esbuild/linux-ppc64@0.25.1': + '@esbuild/linux-ppc64@0.25.2': optional: true - '@esbuild/linux-riscv64@0.25.1': + '@esbuild/linux-riscv64@0.25.2': optional: true - '@esbuild/linux-s390x@0.25.1': + '@esbuild/linux-s390x@0.25.2': optional: true - '@esbuild/linux-x64@0.25.1': + '@esbuild/linux-x64@0.25.2': optional: true - '@esbuild/netbsd-arm64@0.25.1': + '@esbuild/netbsd-arm64@0.25.2': optional: true - '@esbuild/netbsd-x64@0.25.1': + '@esbuild/netbsd-x64@0.25.2': optional: true - '@esbuild/openbsd-arm64@0.25.1': + '@esbuild/openbsd-arm64@0.25.2': optional: true - '@esbuild/openbsd-x64@0.25.1': + '@esbuild/openbsd-x64@0.25.2': optional: true - '@esbuild/sunos-x64@0.25.1': + '@esbuild/sunos-x64@0.25.2': optional: true - '@esbuild/win32-arm64@0.25.1': + '@esbuild/win32-arm64@0.25.2': optional: true - '@esbuild/win32-ia32@0.25.1': + '@esbuild/win32-ia32@0.25.2': optional: true - '@esbuild/win32-x64@0.25.1': + '@esbuild/win32-x64@0.25.2': optional: true '@eslint-community/eslint-utils@4.5.1(eslint@9.23.0(jiti@1.21.7))': @@ -3298,7 +3298,7 @@ snapshots: optionalDependencies: '@tanstack/react-router': 1.100.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tanstack/router-plugin@1.114.30(@tanstack/react-router@1.100.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.2.3(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1))': + '@tanstack/router-plugin@1.114.30(@tanstack/react-router@1.100.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.2.4(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) @@ -3319,7 +3319,7 @@ snapshots: zod: 3.24.2 optionalDependencies: '@tanstack/react-router': 1.100.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - vite: 6.2.3(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.2.4(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - supports-color @@ -3498,10 +3498,10 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react-swc@3.8.1(vite@6.2.3(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1))': + '@vitejs/plugin-react-swc@3.8.1(vite@6.2.4(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@swc/core': 1.11.13 - vite: 6.2.3(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.2.4(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - '@swc/helpers' @@ -3791,8 +3791,8 @@ snapshots: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 - esbuild: 0.25.1 - esbuild-register: 3.6.0(esbuild@0.25.1) + esbuild: 0.25.2 + esbuild-register: 3.6.0(esbuild@0.25.2) gel: 2.0.1 transitivePeerDependencies: - supports-color @@ -3933,40 +3933,40 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 - esbuild-register@3.6.0(esbuild@0.25.1): + esbuild-register@3.6.0(esbuild@0.25.2): dependencies: debug: 4.4.0 - esbuild: 0.25.1 + esbuild: 0.25.2 transitivePeerDependencies: - supports-color - esbuild@0.25.1: + esbuild@0.25.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.1 - '@esbuild/android-arm': 0.25.1 - '@esbuild/android-arm64': 0.25.1 - '@esbuild/android-x64': 0.25.1 - '@esbuild/darwin-arm64': 0.25.1 - '@esbuild/darwin-x64': 0.25.1 - '@esbuild/freebsd-arm64': 0.25.1 - '@esbuild/freebsd-x64': 0.25.1 - '@esbuild/linux-arm': 0.25.1 - '@esbuild/linux-arm64': 0.25.1 - '@esbuild/linux-ia32': 0.25.1 - '@esbuild/linux-loong64': 0.25.1 - '@esbuild/linux-mips64el': 0.25.1 - '@esbuild/linux-ppc64': 0.25.1 - '@esbuild/linux-riscv64': 0.25.1 - '@esbuild/linux-s390x': 0.25.1 - '@esbuild/linux-x64': 0.25.1 - '@esbuild/netbsd-arm64': 0.25.1 - '@esbuild/netbsd-x64': 0.25.1 - '@esbuild/openbsd-arm64': 0.25.1 - '@esbuild/openbsd-x64': 0.25.1 - '@esbuild/sunos-x64': 0.25.1 - '@esbuild/win32-arm64': 0.25.1 - '@esbuild/win32-ia32': 0.25.1 - '@esbuild/win32-x64': 0.25.1 + '@esbuild/aix-ppc64': 0.25.2 + '@esbuild/android-arm': 0.25.2 + '@esbuild/android-arm64': 0.25.2 + '@esbuild/android-x64': 0.25.2 + '@esbuild/darwin-arm64': 0.25.2 + '@esbuild/darwin-x64': 0.25.2 + '@esbuild/freebsd-arm64': 0.25.2 + '@esbuild/freebsd-x64': 0.25.2 + '@esbuild/linux-arm': 0.25.2 + '@esbuild/linux-arm64': 0.25.2 + '@esbuild/linux-ia32': 0.25.2 + '@esbuild/linux-loong64': 0.25.2 + '@esbuild/linux-mips64el': 0.25.2 + '@esbuild/linux-ppc64': 0.25.2 + '@esbuild/linux-riscv64': 0.25.2 + '@esbuild/linux-s390x': 0.25.2 + '@esbuild/linux-x64': 0.25.2 + '@esbuild/netbsd-arm64': 0.25.2 + '@esbuild/netbsd-x64': 0.25.2 + '@esbuild/openbsd-arm64': 0.25.2 + '@esbuild/openbsd-x64': 0.25.2 + '@esbuild/sunos-x64': 0.25.2 + '@esbuild/win32-arm64': 0.25.2 + '@esbuild/win32-ia32': 0.25.2 + '@esbuild/win32-x64': 0.25.2 escalade@3.2.0: {} @@ -5524,7 +5524,7 @@ snapshots: tsx@4.19.3: dependencies: - esbuild: 0.25.1 + esbuild: 0.25.2 get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 @@ -5655,9 +5655,9 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@6.2.3(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1): + vite@6.2.4(@types/node@22.13.14)(jiti@1.21.7)(tsx@4.19.3)(yaml@2.7.1): dependencies: - esbuild: 0.25.1 + esbuild: 0.25.2 postcss: 8.5.3 rollup: 4.38.0 optionalDependencies: From 0f6762559201fe0dedea55b6c1782dbbe127cada Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 13:07:24 -0700 Subject: [PATCH 21/35] remove wrapping tags --- apps/frontend/src/assets/offline.html | 154 ++++++++++++-------------- 1 file changed, 71 insertions(+), 83 deletions(-) diff --git a/apps/frontend/src/assets/offline.html b/apps/frontend/src/assets/offline.html index 682580b..ebe429c 100644 --- a/apps/frontend/src/assets/offline.html +++ b/apps/frontend/src/assets/offline.html @@ -1,90 +1,78 @@ - - - - - - Offline - +
+
+
+            (╥﹏╥)
+        
- -
+ network offline +

+ + +
+ -
-
-            (╥﹏╥)
-        
- -

- network offline -

-
+ go home +
-
- - go home - - - -
- - - + +
+ From 90cb9757e5323cb71eaab0c92acf39c2794c5a97 Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 13:19:54 -0700 Subject: [PATCH 22/35] don't copy `offline.html` to `dist` directory --- apps/frontend/scripts/generate-resource-list.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/apps/frontend/scripts/generate-resource-list.js b/apps/frontend/scripts/generate-resource-list.js index 434a3f2..50edf4c 100644 --- a/apps/frontend/scripts/generate-resource-list.js +++ b/apps/frontend/scripts/generate-resource-list.js @@ -26,11 +26,4 @@ const resourcesToCache = [...routesToCache, ...assetPaths, ...favicons] const resourceList = `const RESOURCE_LIST = ${JSON.stringify(resourcesToCache, null, 2)};` fs.writeFileSync(outputPath, resourceList) -const outputPathOffline = path.join(distDir, 'offline.html') -const offline = fs.readFileSync( - path.resolve('src/assets/offline.html'), - 'utf-8' -) -fs.writeFileSync(outputPathOffline, offline) - console.log('Resource list generated:', outputPath) From 82dd11955fb4a5dcc1d834f613397df3dbb70446 Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 13:24:51 -0700 Subject: [PATCH 23/35] remove `charset=utf-8` --- apps/frontend/public/service-worker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 1eb3800..ff17f94 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -49,7 +49,7 @@ addEventListener('install', (event) => { await cache.put( '/offline', new Response(offlineHtml, { - headers: { 'Content-Type': 'text/html; charset=utf-8' }, + headers: { 'Content-Type': 'text/html' }, }) ) })() @@ -114,7 +114,7 @@ addEventListener('fetch', (event) => { return new Response(offlineBody, { status: 503, statusText: 'Service Unavailable', - headers: { 'Content-Type': 'text/html; charset=utf-8' }, + headers: { 'Content-Type': 'text/html' }, }) } })() From 2ad5c13e23eb9b48511ccbdea9343efb912c037d Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 13:27:38 -0700 Subject: [PATCH 24/35] remove offline cache from service worker --- apps/frontend/public/service-worker.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index ff17f94..a782a97 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -1,7 +1,6 @@ /* eslint-env worker */ /* eslint-disable no-undef */ importScripts('/resource-list.js') -import offlineHtml from './assets/offline.html' const CACHE_NAME = 'devlin-frontend-v0.0.1' @@ -46,12 +45,6 @@ addEventListener('install', (event) => { (async () => { const cache = await getCache() await cache.addAll(RESOURCE_LIST) - await cache.put( - '/offline', - new Response(offlineHtml, { - headers: { 'Content-Type': 'text/html' }, - }) - ) })() ) @@ -107,15 +100,6 @@ addEventListener('fetch', (event) => { `Failed to fetch from network for ${event.request.url}:`, error ) - - const offlineResponse = await cache.match('/offline') - const offlineBody = await offlineResponse.text() - - return new Response(offlineBody, { - status: 503, - statusText: 'Service Unavailable', - headers: { 'Content-Type': 'text/html' }, - }) } })() ) From 04dd41074040ef7feaf62f08d687a9514d8b6b3e Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 14:00:57 -0700 Subject: [PATCH 25/35] fetch and cache offline page during service worker install --- apps/frontend/public/service-worker.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index a782a97..800e04a 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -45,6 +45,9 @@ addEventListener('install', (event) => { (async () => { const cache = await getCache() await cache.addAll(RESOURCE_LIST) + + const offlineResponse = await fetch('/assets/offline.html') + await cache.put('/offline', offlineResponse) })() ) @@ -100,6 +103,15 @@ addEventListener('fetch', (event) => { `Failed to fetch from network for ${event.request.url}:`, error ) + + const offlineResponse = await cache.match('/offline') + const offlineBody = await offlineResponse.text() + + return new Response(offlineBody, { + status: 503, + statusText: 'Service Unavailable', + headers: { 'Content-Type': 'text/html' }, + }) } })() ) From a660c52c8ee579d06b02b74253bd6112d43ed682 Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 14:11:09 -0700 Subject: [PATCH 26/35] take in a `message` to display --- apps/frontend/src/components/DefaultNotFound.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/components/DefaultNotFound.tsx b/apps/frontend/src/components/DefaultNotFound.tsx index d2178b1..656eeea 100644 --- a/apps/frontend/src/components/DefaultNotFound.tsx +++ b/apps/frontend/src/components/DefaultNotFound.tsx @@ -1,6 +1,12 @@ import { useRouter, Link } from '@tanstack/react-router' -export default function DefaultNotFound() { +type DefaultNotFoundProps = { + message?: string +} + +export default function DefaultNotFound({ + message = 'page not found', +}: DefaultNotFoundProps) { const router = useRouter() const faces = [ @@ -59,7 +65,7 @@ export default function DefaultNotFound() {

- page not found + {message}

From 6ab8463982d6d86eb3b295d21e1e1aff3a9d933a Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 14:13:51 -0700 Subject: [PATCH 27/35] use custom not found messages --- apps/frontend/src/routes/blog.$blogId.lazy.tsx | 4 ++-- apps/frontend/src/routes/blog.index.lazy.tsx | 5 +++-- apps/frontend/src/routes/blog.search.tsx | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/frontend/src/routes/blog.$blogId.lazy.tsx b/apps/frontend/src/routes/blog.$blogId.lazy.tsx index c882121..1a2eca4 100644 --- a/apps/frontend/src/routes/blog.$blogId.lazy.tsx +++ b/apps/frontend/src/routes/blog.$blogId.lazy.tsx @@ -30,8 +30,8 @@ function BlogPost() { ) - if (error) return - if (!post) return + if (error) return + if (!post) return return (
diff --git a/apps/frontend/src/routes/blog.index.lazy.tsx b/apps/frontend/src/routes/blog.index.lazy.tsx index f44b8d0..fc2add2 100644 --- a/apps/frontend/src/routes/blog.index.lazy.tsx +++ b/apps/frontend/src/routes/blog.index.lazy.tsx @@ -18,8 +18,9 @@ function Blog() { Loading... ) - if (error) return - if (!data || !data.length) return + if (error) return + if (!data || !data.length) + return const firstPost = data[0] diff --git a/apps/frontend/src/routes/blog.search.tsx b/apps/frontend/src/routes/blog.search.tsx index 1af2ed5..12ea552 100644 --- a/apps/frontend/src/routes/blog.search.tsx +++ b/apps/frontend/src/routes/blog.search.tsx @@ -47,8 +47,8 @@ function BlogSearch() { Loading... ) - if (error) return - if (!posts) return + if (error) return + if (!posts) return return (
Date: Tue, 1 Apr 2025 17:54:50 -0700 Subject: [PATCH 28/35] remove cached offline page --- apps/frontend/public/service-worker.js | 12 ---- apps/frontend/src/assets/offline.html | 78 -------------------------- 2 files changed, 90 deletions(-) delete mode 100644 apps/frontend/src/assets/offline.html diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 800e04a..a782a97 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -45,9 +45,6 @@ addEventListener('install', (event) => { (async () => { const cache = await getCache() await cache.addAll(RESOURCE_LIST) - - const offlineResponse = await fetch('/assets/offline.html') - await cache.put('/offline', offlineResponse) })() ) @@ -103,15 +100,6 @@ addEventListener('fetch', (event) => { `Failed to fetch from network for ${event.request.url}:`, error ) - - const offlineResponse = await cache.match('/offline') - const offlineBody = await offlineResponse.text() - - return new Response(offlineBody, { - status: 503, - statusText: 'Service Unavailable', - headers: { 'Content-Type': 'text/html' }, - }) } })() ) diff --git a/apps/frontend/src/assets/offline.html b/apps/frontend/src/assets/offline.html deleted file mode 100644 index ebe429c..0000000 --- a/apps/frontend/src/assets/offline.html +++ /dev/null @@ -1,78 +0,0 @@ -
-
-
-            (╥﹏╥)
-        
- -

- network offline -

-
- -
- - go home - - - -
-
From 291e49a2980214dfdfe023b93eb2d342f364bb4f Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 18:03:33 -0700 Subject: [PATCH 29/35] send response when network is offline --- apps/frontend/public/service-worker.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index a782a97..916012d 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -100,6 +100,12 @@ addEventListener('fetch', (event) => { `Failed to fetch from network for ${event.request.url}:`, error ) + + return new Response('network offline', { + status: 503, + statusText: 'Service Unavailable', + headers: { 'Content-Type': 'text/html' }, + }) } })() ) From 41015a49e88349212e03d324ba3666dc0e0be3ee Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 18:07:21 -0700 Subject: [PATCH 30/35] fix typecheck error --- apps/frontend/src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/src/App.tsx b/apps/frontend/src/App.tsx index ec02d5c..d9faece 100644 --- a/apps/frontend/src/App.tsx +++ b/apps/frontend/src/App.tsx @@ -11,7 +11,7 @@ import './index.css' const router = createRouter({ scrollRestoration: true, defaultHashScrollIntoView: { behavior: 'smooth' }, - defaultNotFoundComponent: DefaultNotFound, + defaultNotFoundComponent: () => , routeTree, }) From a4eb62bfd595f123ecd1a7ba27467666df756416 Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 18:11:48 -0700 Subject: [PATCH 31/35] send `undefined` response --- apps/frontend/public/service-worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 916012d..22620db 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -101,7 +101,7 @@ addEventListener('fetch', (event) => { error ) - return new Response('network offline', { + return new Response(undefined, { status: 503, statusText: 'Service Unavailable', headers: { 'Content-Type': 'text/html' }, From da057044ab0b9c06388424471723382e867f2abb Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 18:14:25 -0700 Subject: [PATCH 32/35] `throw notFound()` --- apps/frontend/public/service-worker.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 22620db..1d9cdfc 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -101,11 +101,7 @@ addEventListener('fetch', (event) => { error ) - return new Response(undefined, { - status: 503, - statusText: 'Service Unavailable', - headers: { 'Content-Type': 'text/html' }, - }) + throw notFound() } })() ) From b2a88a60d5998bf5954466b5aeef7cacea11cc50 Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 18:17:45 -0700 Subject: [PATCH 33/35] respond with `offline` --- apps/frontend/public/service-worker.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 1d9cdfc..84b7f98 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -101,7 +101,11 @@ addEventListener('fetch', (event) => { error ) - throw notFound() + return new Response(offline, { + status: 503, + statusText: 'Service Unavailable', + headers: { 'Content-Type': 'text/html' }, + }) } })() ) From e24728bb24da43fb9a34b1a4b463ae955de02b72 Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 18:19:17 -0700 Subject: [PATCH 34/35] respond with `offlineBody` from cache --- apps/frontend/public/service-worker.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index 84b7f98..dadb70e 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -101,7 +101,10 @@ addEventListener('fetch', (event) => { error ) - return new Response(offline, { + const offlineResponse = await cache.match('/offline') + const offlineBody = await offlineResponse.text() + + return new Response(offlineBody, { status: 503, statusText: 'Service Unavailable', headers: { 'Content-Type': 'text/html' }, From 74b697ecfaf202c197ede20502bab47305ed4b1d Mon Sep 17 00:00:00 2001 From: Devlin Date: Tue, 1 Apr 2025 18:23:58 -0700 Subject: [PATCH 35/35] cache offline response --- apps/frontend/public/service-worker.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/frontend/public/service-worker.js b/apps/frontend/public/service-worker.js index dadb70e..a8379ce 100644 --- a/apps/frontend/public/service-worker.js +++ b/apps/frontend/public/service-worker.js @@ -45,6 +45,9 @@ addEventListener('install', (event) => { (async () => { const cache = await getCache() await cache.addAll(RESOURCE_LIST) + + const offlineResponse = await fetch('/offline') + await cache.put('/offline', offlineResponse) })() )