From 9eca4dca71e1901c423b6d62b4115a1082512839 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Wed, 24 Sep 2025 11:47:36 +0200 Subject: [PATCH 01/20] Update serwist dependencies. --- lib/package.json | 2 +- package.json | 16 +-- pnpm-lock.yaml | 348 +++++++++++++---------------------------------- 3 files changed, 106 insertions(+), 260 deletions(-) diff --git a/lib/package.json b/lib/package.json index 35f50e52..607388ff 100644 --- a/lib/package.json +++ b/lib/package.json @@ -71,5 +71,5 @@ "type": "git", "url": "https://github.com/geops/tree-app.git" }, - "packageManager": "pnpm@9.7.0+sha256.b35018fbfa8f583668b2649e407922a721355cd81f61beeb4ac1d4258e585559" + "packageManager": "pnpm@10.17.1+sha512.17c560fca4867ae9473a3899ad84a88334914f379be46d455cbf92e5cf4b39d34985d452d2583baf19967fa76cb5c17bc9e245529d0b98745721aa7200ecaf7a" } diff --git a/package.json b/package.json index 740b502f..684d9d46 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,11 @@ "@geops/tree-lib": "link:lib/build", "@headlessui/react": "2.0.4", "@heroicons/react": "2.1.5", - "@serwist/next": "9.0.7", - "@serwist/sw": "9.0.8", - "@types/react": "18.3.4", + "@serwist/next": "9.2.1", + "@serwist/sw": "9.2.1", "@tailwindcss/container-queries": "0.1.1", "@types/node": "20.16.2", + "@types/react": "18.3.4", "@upstash/redis": "1.34.3", "assert": "2.1.0", "docx": "9.1.0", @@ -43,17 +43,17 @@ "react-select": "5.8.3", "react-tooltip": "5.28.0", "save-svg-as-png": "1.4.17", + "serwist": "9.2.1", "sql.js": "1.11.0", - "url-loader": "4.1.1", - "uuid": "10.0.0", - "serwist": "9.0.7", "tailwindcss": "3.4.1", "typescript": "5.6.3", + "url-loader": "4.1.1", + "uuid": "10.0.0", "zustand": "5.0.0-rc.2" }, "devDependencies": { "@geops/eslint-config-react": "1.2.0", - "@serwist/build": "9.0.7", + "@serwist/build": "9.2.1", "@types/file-saver": "2.0.7", "@types/geojson": "7946.0.14", "@types/lodash.get": "4.4.9", @@ -77,5 +77,5 @@ "react-i18next": ">=11.16.4" }, "author": "geOps", - "packageManager": "pnpm@9.7.0+sha256.b35018fbfa8f583668b2649e407922a721355cd81f61beeb4ac1d4258e585559" + "packageManager": "pnpm@10.17.1+sha512.17c560fca4867ae9473a3899ad84a88334914f379be46d455cbf92e5cf4b39d34985d452d2583baf19967fa76cb5c17bc9e245529d0b98745721aa7200ecaf7a" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d47e7461..829c2ac0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,11 +21,11 @@ importers: specifier: 2.1.5 version: 2.1.5(react@18.3.1) '@serwist/next': - specifier: 9.0.7 - version: 9.0.7(next@14.2.32(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)(webpack@5.96.1) + specifier: 9.2.1 + version: 9.2.1(next@14.2.32(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)(webpack@5.96.1) '@serwist/sw': - specifier: 9.0.8 - version: 9.0.8(typescript@5.6.3) + specifier: 9.2.1 + version: 9.2.1(typescript@5.6.3) '@tailwindcss/container-queries': specifier: 0.1.1 version: 0.1.1(tailwindcss@3.4.1) @@ -108,8 +108,8 @@ importers: specifier: 1.4.17 version: 1.4.17 serwist: - specifier: 9.0.7 - version: 9.0.7(typescript@5.6.3) + specifier: 9.2.1 + version: 9.2.1(typescript@5.6.3) sql.js: specifier: 1.11.0 version: 1.11.0 @@ -133,8 +133,8 @@ importers: specifier: 1.2.0 version: 1.2.0(eslint@8.57.1)(typescript@5.6.3) '@serwist/build': - specifier: 9.0.7 - version: 9.0.7(typescript@5.6.3) + specifier: 9.2.1 + version: 9.2.1(typescript@5.6.3) '@types/file-saver': specifier: 2.0.7 version: 2.0.7 @@ -390,8 +390,8 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@mapbox/geojson-rewind@0.5.2': resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} @@ -550,94 +550,14 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@rollup/rollup-android-arm-eabi@4.21.0': - resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.21.0': - resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.21.0': - resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.21.0': - resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-linux-arm-gnueabihf@4.21.0': - resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.21.0': - resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.21.0': - resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.21.0': - resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': - resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.21.0': - resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.21.0': - resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.21.0': - resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.21.0': - resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.21.0': - resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.21.0': - resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.21.0': - resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} - cpu: [x64] - os: [win32] - '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} '@rushstack/eslint-patch@1.10.4': resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} - '@serwist/build@9.0.7': - resolution: {integrity: sha512-JHX3pBXH4wuvLrCZxa+HyWvoe8W0nIpEKNEfGVRuJrKXHQ1CTquMrB0k1XImv/D/SD6mB9UhW9zGyLaS2QCIjQ==} + '@serwist/build@9.2.1': + resolution: {integrity: sha512-mMCBZi82jVCxIhOu/D3ifkfmiuhdFHuelWK1zRlASLbkogH7YsS6qvGTl37vWBTVAWNKcKfVWLR6tq9AUB7BSg==} engines: {node: '>=18.0.0'} peerDependencies: typescript: '>=5.0.0' @@ -645,8 +565,8 @@ packages: typescript: optional: true - '@serwist/next@9.0.7': - resolution: {integrity: sha512-p6RHxv+uTo3UJ9Iqwuxew1JxQKhYji6jmxKG5in4czsuRFFj6JSzB5SuHyOUoO3S7zKYBze02Ski/68rHl0uvA==} + '@serwist/next@9.2.1': + resolution: {integrity: sha512-CCTvZYSWK1hCmANViGLd7LvVc9r9wd4aaVX4Uk0F6fC0/Xn05GY52di7LGZ2NveGr1g+NjQvQSBhfxCQK95NIg==} engines: {node: '>=18.0.0'} peerDependencies: next: '>=14.0.0' @@ -655,16 +575,16 @@ packages: typescript: optional: true - '@serwist/sw@9.0.8': - resolution: {integrity: sha512-EYFQcGzR4fr6nbfgW4NqxGdiNpQnfnZnV0nGaqcb+yPhbpGFectf/2WLF4tCJLY4o9H9ElmE9Pk4mol6H8DgEg==} + '@serwist/sw@9.2.1': + resolution: {integrity: sha512-SQygNDTB4w4HRjKiGH+Ybme+dy2rynt6RPFHw27SANQRK1rEzqYUZ1S4SyKjiwJgIoy+mQOA7+T23OqAfW7Eqg==} peerDependencies: typescript: '>=5.0.0' peerDependenciesMeta: typescript: optional: true - '@serwist/webpack-plugin@9.0.7': - resolution: {integrity: sha512-dVOjNpanJQ160YJj+utXcUmXDQdK7TJgqU4EHloxmuHP6q0Pl03Y/YDVonBvW58YPjakCrTFKuPG0cuVVz6Wog==} + '@serwist/webpack-plugin@9.2.1': + resolution: {integrity: sha512-tBVlKifGP96aV7A8HD0xXIJAu6/sTyfRc827LFuLajNaX2d/dpo/0sMxO45jEI+GS7vaUdTcSl5DqcaRkkQ9wQ==} engines: {node: '>=18.0.0'} peerDependencies: typescript: '>=5.0.0' @@ -675,8 +595,8 @@ packages: webpack: optional: true - '@serwist/window@9.0.7': - resolution: {integrity: sha512-eB2Odk3pc9QPSNddCBnPvdx96l/wvmf97sN0JQp+rZzy734nTVnZ2J6Lf5Mb2Nohh8CbHSFWKRaGW5MMia3aiQ==} + '@serwist/window@9.2.1': + resolution: {integrity: sha512-XkfV7+crhT4ArJCMcRle9AmzrxDjMRS6ExJwSPGmCqdb4JH/VyhcmJZljwoEpuZ1zh0cNvnWC8xEQ4p85jhxnQ==} peerDependencies: typescript: '>=5.0.0' peerDependenciesMeta: @@ -715,9 +635,6 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1197,6 +1114,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.8.6: + resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==} + hasBin: true + bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} @@ -1226,8 +1147,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.25.4: - resolution: {integrity: sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==} + browserslist@4.26.2: + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1271,6 +1192,9 @@ packages: caniuse-lite@1.0.30001739: resolution: {integrity: sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} + canvas@3.0.1: resolution: {integrity: sha512-PcpVF4f8RubAeN/jCQQ/UymDKzOiLmRPph8fOTzDnlsUihkO/AUlxuhaa7wGRc3vMcCbV1fzuvyu5cWZlIcn1w==} engines: {node: ^18.12.0 || >= 20.9.0} @@ -1282,8 +1206,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + chalk@5.6.0: + resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} check-more-types@2.24.0: @@ -1534,8 +1458,8 @@ packages: ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - electron-to-chromium@1.5.211: - resolution: {integrity: sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==} + electron-to-chromium@1.5.223: + resolution: {integrity: sha512-qKm55ic6nbEmagFlTFczML33rF90aU+WtrJ9MdTCThrcvDNdUHN4p6QfVN78U06ZmguqXIyMPyYhw2TrbDUwPQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1874,6 +1798,10 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} @@ -2090,8 +2018,8 @@ packages: i18next@23.15.1: resolution: {integrity: sha512-wB4abZ3uK7EWodYisHl/asf8UYEhrI/vj/8aoSsrj/ZDxj4/UXPOa1KvFt1Fq5hkUHquNqwFlDprmjZ8iySgYA==} - idb@8.0.0: - resolution: {integrity: sha512-l//qvlAKGmQO31Qn7xdzagVPPaHTxXx199MhrAFuVBTPqydcPYBWjkrbv4Y0ktB+GmWOiwHl237UUOrLmQxLvw==} + idb@8.0.3: + resolution: {integrity: sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2619,8 +2547,8 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -3092,11 +3020,6 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.21.0: - resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3152,16 +3075,8 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - serwist@9.0.7: - resolution: {integrity: sha512-OcvOArMLFYhPWpK5LKqmSsyCS71Egn8SkUZQRBQVUJmAtsI3Aj+ixNDeEvUgyYtFArtvHsVRXgfdg4L5LkhAHA==} - peerDependencies: - typescript: '>=5.0.0' - peerDependenciesMeta: - typescript: - optional: true - - serwist@9.0.8: - resolution: {integrity: sha512-pE9sG0GROVdqjIK51kjghH7RrMY8MOkekLCPid3KOuhxllKZnp7PU4F1qDAPgMN2zrGvmKs4CewYCKobuvBiSg==} + serwist@9.2.1: + resolution: {integrity: sha512-icp1GQB3h9q1OqYeSw+iTTY0OZ3io+fzNG0Ot3p6Xe5DEZlSRn61FmGx9mq76q0CeMtZYBmmuw4tyIS1O76Lbw==} peerDependencies: typescript: '>=5.0.0' peerDependenciesMeta: @@ -3392,8 +3307,8 @@ packages: uglify-js: optional: true - terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + terser@5.44.0: + resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} hasBin: true @@ -3670,8 +3585,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@4.1.5: + resolution: {integrity: sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==} zstddec@0.1.0: resolution: {integrity: sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==} @@ -3953,7 +3868,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -3968,7 +3883,7 @@ snapshots: '@jridgewell/source-map@0.3.11': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/sourcemap-codec@1.5.0': {} @@ -3979,7 +3894,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping@0.3.30': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 @@ -4126,103 +4041,54 @@ snapshots: dependencies: react: 18.3.1 - '@rollup/rollup-android-arm-eabi@4.21.0': - optional: true - - '@rollup/rollup-android-arm64@4.21.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.21.0': - optional: true - - '@rollup/rollup-darwin-x64@4.21.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.21.0': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.21.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.21.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.21.0': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.21.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.21.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.21.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.21.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.21.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.21.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.21.0': - optional: true - '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.10.4': {} - '@serwist/build@9.0.7(typescript@5.6.3)': + '@serwist/build@9.2.1(typescript@5.6.3)': dependencies: common-tags: 1.8.2 glob: 10.4.5 pretty-bytes: 6.1.1 - rollup: 4.21.0 source-map: 0.8.0-beta.0 - zod: 3.23.8 + zod: 4.1.5 optionalDependencies: typescript: 5.6.3 - '@serwist/next@9.0.7(next@14.2.32(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)(webpack@5.96.1)': + '@serwist/next@9.2.1(next@14.2.32(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)(webpack@5.96.1)': dependencies: - '@serwist/build': 9.0.7(typescript@5.6.3) - '@serwist/webpack-plugin': 9.0.7(typescript@5.6.3)(webpack@5.96.1) - '@serwist/window': 9.0.7(typescript@5.6.3) - chalk: 5.3.0 + '@serwist/build': 9.2.1(typescript@5.6.3) + '@serwist/webpack-plugin': 9.2.1(typescript@5.6.3)(webpack@5.96.1) + '@serwist/window': 9.2.1(typescript@5.6.3) + chalk: 5.6.0 glob: 10.4.5 next: 14.2.32(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - serwist: 9.0.7(typescript@5.6.3) - zod: 3.23.8 + serwist: 9.2.1(typescript@5.6.3) + zod: 4.1.5 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - webpack - '@serwist/sw@9.0.8(typescript@5.6.3)': + '@serwist/sw@9.2.1(typescript@5.6.3)': dependencies: - serwist: 9.0.8(typescript@5.6.3) + serwist: 9.2.1(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 - '@serwist/webpack-plugin@9.0.7(typescript@5.6.3)(webpack@5.96.1)': + '@serwist/webpack-plugin@9.2.1(typescript@5.6.3)(webpack@5.96.1)': dependencies: - '@serwist/build': 9.0.7(typescript@5.6.3) + '@serwist/build': 9.2.1(typescript@5.6.3) pretty-bytes: 6.1.1 - zod: 3.23.8 + zod: 4.1.5 optionalDependencies: typescript: 5.6.3 webpack: 5.96.1 - '@serwist/window@9.0.7(typescript@5.6.3)': + '@serwist/window@9.2.1(typescript@5.6.3)': dependencies: '@types/trusted-types': 2.0.7 - serwist: 9.0.7(typescript@5.6.3) + serwist: 9.2.1(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -4261,8 +4127,6 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/estree@1.0.5': {} - '@types/estree@1.0.8': {} '@types/file-saver@2.0.7': {} @@ -4834,6 +4698,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.8.6: {} + bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 @@ -4866,12 +4732,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.25.4: + browserslist@4.26.2: dependencies: - caniuse-lite: 1.0.30001739 - electron-to-chromium: 1.5.211 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.4) + baseline-browser-mapping: 2.8.6 + caniuse-lite: 1.0.30001743 + electron-to-chromium: 1.5.223 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.2) buffer-crc32@0.2.13: {} @@ -4912,6 +4779,8 @@ snapshots: caniuse-lite@1.0.30001739: {} + caniuse-lite@1.0.30001743: {} + canvas@3.0.1: dependencies: node-addon-api: 7.1.1 @@ -4926,7 +4795,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} + chalk@5.6.0: {} check-more-types@2.24.0: {} @@ -5213,7 +5082,7 @@ snapshots: jsbn: 0.1.1 safer-buffer: 2.1.2 - electron-to-chromium@1.5.211: {} + electron-to-chromium@1.5.223: {} emoji-regex@8.0.0: {} @@ -5386,7 +5255,7 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -5409,7 +5278,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: debug: 3.2.7(supports-color@8.1.1) optionalDependencies: @@ -5701,6 +5570,11 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + forever-agent@0.6.1: {} form-data@4.0.1: @@ -5823,7 +5697,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -5958,7 +5832,7 @@ snapshots: dependencies: '@babel/runtime': 7.26.0 - idb@8.0.0: {} + idb@8.0.3: {} ieee754@1.2.1: {} @@ -6458,7 +6332,7 @@ snapshots: node-addon-api@7.1.1: optional: true - node-releases@2.0.19: {} + node-releases@2.0.21: {} normalize-path@3.0.0: {} @@ -6910,28 +6784,6 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.21.0: - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.0 - '@rollup/rollup-android-arm64': 4.21.0 - '@rollup/rollup-darwin-arm64': 4.21.0 - '@rollup/rollup-darwin-x64': 4.21.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.0 - '@rollup/rollup-linux-arm-musleabihf': 4.21.0 - '@rollup/rollup-linux-arm64-gnu': 4.21.0 - '@rollup/rollup-linux-arm64-musl': 4.21.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0 - '@rollup/rollup-linux-riscv64-gnu': 4.21.0 - '@rollup/rollup-linux-s390x-gnu': 4.21.0 - '@rollup/rollup-linux-x64-gnu': 4.21.0 - '@rollup/rollup-linux-x64-musl': 4.21.0 - '@rollup/rollup-win32-arm64-msvc': 4.21.0 - '@rollup/rollup-win32-ia32-msvc': 4.21.0 - '@rollup/rollup-win32-x64-msvc': 4.21.0 - fsevents: 2.3.3 - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -6990,15 +6842,9 @@ snapshots: dependencies: randombytes: 2.1.0 - serwist@9.0.7(typescript@5.6.3): - dependencies: - idb: 8.0.0 - optionalDependencies: - typescript: 5.6.3 - - serwist@9.0.8(typescript@5.6.3): + serwist@9.2.1(typescript@5.6.3): dependencies: - idb: 8.0.0 + idb: 8.0.3 optionalDependencies: typescript: 5.6.3 @@ -7270,14 +7116,14 @@ snapshots: terser-webpack-plugin@5.3.14(webpack@5.96.1): dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 - terser: 5.43.1 + terser: 5.44.0 webpack: 5.96.1 - terser@5.43.1: + terser@5.44.0: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 @@ -7402,9 +7248,9 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.25.4): + update-browserslist-db@1.1.3(browserslist@4.26.2): dependencies: - browserslist: 4.25.4 + browserslist: 4.26.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -7478,7 +7324,7 @@ snapshots: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 - browserslist: 4.25.4 + browserslist: 4.26.2 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -7595,7 +7441,7 @@ snapshots: yocto-queue@0.1.0: {} - zod@3.23.8: {} + zod@4.1.5: {} zstddec@0.1.0: {} From 8332173574380caceaa3ba8ce54b3907c1323209 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Wed, 24 Sep 2025 13:00:23 +0200 Subject: [PATCH 02/20] Increase maximumFileSizeToCacheInBytes to 5MB. --- next.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/next.config.mjs b/next.config.mjs index 7f56bd33..28ad16a1 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -61,6 +61,7 @@ const getNextConfig = async (phase) => { if (phase === PHASE_PRODUCTION_BUILD) { const withSerwist = (await import("@serwist/next")).default({ + maximumFileSizeToCacheInBytes: 5000000, swSrc: "sw.ts", swDest: "public/sw.js", reloadOnOnline: true, From 96a8430e9e36d555c4662530eb4f3d3b70adc302 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Wed, 24 Sep 2025 13:00:46 +0200 Subject: [PATCH 03/20] Disable fetch event listener for testing. --- sw.ts | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/sw.ts b/sw.ts index 4699bf91..17884744 100644 --- a/sw.ts +++ b/sw.ts @@ -140,22 +140,22 @@ self.addEventListener("activate", (event) => { }); // eslint-disable-next-line no-restricted-globals -self.addEventListener("fetch", (event) => { - const cacheUrls = [ - process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT, - process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT, - ]; - const shouldFetchFromCache = cacheUrls.some( - (url) => url && event.request.url.startsWith(url), - ); - if (shouldFetchFromCache) { - event.respondWith( - caches - .match(event.request) - .then((response) => response ?? fetch(event.request)), - ); - } -}); +// self.addEventListener("fetch", (event) => { +// const cacheUrls = [ +// process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT, +// process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT, +// ]; +// const shouldFetchFromCache = cacheUrls.some( +// (url) => url && event.request.url.startsWith(url), +// ); +// if (shouldFetchFromCache) { +// event.respondWith( +// caches +// .match(event.request) +// .then((response) => response ?? fetch(event.request)), +// ); +// } +// }); const serwist = new Serwist({ clientsClaim: true, From d5ac67cb9b342008703f71ea053386fc5e69aeff Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Wed, 24 Sep 2025 13:15:39 +0200 Subject: [PATCH 04/20] disable other event listener for testing --- sw.ts | 244 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 122 insertions(+), 122 deletions(-) diff --git a/sw.ts b/sw.ts index 17884744..a72231e1 100644 --- a/sw.ts +++ b/sw.ts @@ -15,131 +15,131 @@ declare global { declare const self: ServiceWorkerGlobalScope; -const treePdfCacheString = "tree-data-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore -const currentTreePdfVersion = 1; // Current Tree PDF version, needs to be increased every time new PDFs are deployed -const TREE_CACHE_NAME = `${treePdfCacheString}${currentTreePdfVersion}`; // Cache name for Tree profile data - -// Create an array of 'tree-data-v[1 - currentVersion]' strings for the caches to be removed -const OLD_TREE_PDF_CACHES = Array.from(Array(currentTreePdfVersion).keys()).map( - (version) => `${treePdfCacheString}${version}`, -); - -const soPdfCacheString = "so-data-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore -const currentSoPdfVersion = 3; // Current SO PDF version, needs to be increased every time new PDFs are deployed -const SO_CACHE_NAME = `${soPdfCacheString}${currentSoPdfVersion}`; // Cache name for SO profile data - -// Create an array of 'so-data-v[1 - currentVersion]' strings for the caches to be removed -const OLD_SO_PDF_CACHES = Array.from(Array(currentSoPdfVersion).keys()).map( - (version) => `${soPdfCacheString}${version}`, -); - -const tileCacheString = "tree-app-tiles-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore -const currentTileVersion = 25; // Current tile version, needs to be increased every time new tiles are deployed -const TILE_CACHE_NAME = `${tileCacheString}${currentTileVersion}`; - -// Create an array of 'tree-app-tiles-v[1 - currentVersion]' strings for the caches to be removed -const OLD_TILE_CACHES = Array.from(Array(currentTileVersion).keys()).map( - (version) => `${tileCacheString}${version}`, -); - -// This allows the web app to trigger skipWaiting via -// registration.waiting.postMessage({type: 'SKIP_WAITING'}) -self.addEventListener("message", (event) => { - if (event.data && (event.data as MessageEvent).type === "SKIP_WAITING") { - void self.skipWaiting(); - } -}); +// const treePdfCacheString = "tree-data-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore +// const currentTreePdfVersion = 1; // Current Tree PDF version, needs to be increased every time new PDFs are deployed +// const TREE_CACHE_NAME = `${treePdfCacheString}${currentTreePdfVersion}`; // Cache name for Tree profile data + +// // Create an array of 'tree-data-v[1 - currentVersion]' strings for the caches to be removed +// const OLD_TREE_PDF_CACHES = Array.from(Array(currentTreePdfVersion).keys()).map( +// (version) => `${treePdfCacheString}${version}`, +// ); + +// const soPdfCacheString = "so-data-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore +// const currentSoPdfVersion = 3; // Current SO PDF version, needs to be increased every time new PDFs are deployed +// const SO_CACHE_NAME = `${soPdfCacheString}${currentSoPdfVersion}`; // Cache name for SO profile data + +// // Create an array of 'so-data-v[1 - currentVersion]' strings for the caches to be removed +// const OLD_SO_PDF_CACHES = Array.from(Array(currentSoPdfVersion).keys()).map( +// (version) => `${soPdfCacheString}${version}`, +// ); + +// const tileCacheString = "tree-app-tiles-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore +// const currentTileVersion = 25; // Current tile version, needs to be increased every time new tiles are deployed +// const TILE_CACHE_NAME = `${tileCacheString}${currentTileVersion}`; + +// // Create an array of 'tree-app-tiles-v[1 - currentVersion]' strings for the caches to be removed +// const OLD_TILE_CACHES = Array.from(Array(currentTileVersion).keys()).map( +// (version) => `${tileCacheString}${version}`, +// ); + +// // This allows the web app to trigger skipWaiting via +// // registration.waiting.postMessage({type: 'SKIP_WAITING'}) +// self.addEventListener("message", (event) => { +// if (event.data && (event.data as MessageEvent).type === "SKIP_WAITING") { +// void self.skipWaiting(); +// } +// }); -[...OLD_SO_PDF_CACHES, ...OLD_TILE_CACHES, ...OLD_TREE_PDF_CACHES].forEach( - (OLD_CACHE) => void caches.delete(OLD_CACHE), -); - -self.addEventListener("install", (event) => { - const soPdfEndpoint = process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT; - const vectorTilesEndpoint = process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT; - const treePdfEndpoint = process.env.NEXT_PUBLIC_TREE_PDF_ENDPOINT; - event.waitUntil( - (async () => { - await caches.open(TILE_CACHE_NAME).then((cache) => - fetch(`${vectorTilesEndpoint}/tiles.txt`) - .then((response) => response.text()) - .then(async (response) => { - const tiles = response.split(/\r?\n/); - // eslint-disable-next-line no-plusplus - for (const tile of tiles) { - const tileUrl = `${vectorTilesEndpoint}/${tile}`; - // eslint-disable-next-line no-await-in-loop - if (tile && !(await cache.match(tileUrl))) { - try { - // eslint-disable-next-line no-await-in-loop - const tileResponse = await fetch(tileUrl); - void cache.put(tileUrl, tileResponse); - } catch (error) { - // Some tiles do not exist. - } - } - } - return true; - }), - ); - - await caches.open(SO_CACHE_NAME).then((cache) => - fetch(`${soPdfEndpoint}/list.txt`) - .then((response) => response.text()) - .then(async (response) => { - const forestTypes = response.split(/\r?\n/); - for (const forestType of forestTypes) { - const pdfUrl = `${soPdfEndpoint}/${forestType}`; - if (forestType && !(await cache.match(pdfUrl))) { - try { - const pdfResponse = await fetch(pdfUrl); - void cache.put(pdfUrl, pdfResponse); - } catch (error) { - // Some PDFs do not exist. - } - } - } - return true; - }), - ); - - await caches.open(TREE_CACHE_NAME).then((cache) => - fetch(`${treePdfEndpoint}/list.txt`) - .then((response) => response.text()) - .then(async (response) => { - const treeTypes = response.split(/\r?\n/); - for (const treeType of treeTypes) { - const pdfUrl = `${treePdfEndpoint}/${treeType}`; - if (treeType && !(await cache.match(pdfUrl))) { - try { - const pdfResponse = await fetch(pdfUrl); - void cache.put(pdfUrl, pdfResponse); - } catch (error) { - // Some PDFs do not exist. - } - } - } - return true; - }), - ); - })(), - ); -}); +// [...OLD_SO_PDF_CACHES, ...OLD_TILE_CACHES, ...OLD_TREE_PDF_CACHES].forEach( +// (OLD_CACHE) => void caches.delete(OLD_CACHE), +// ); + +// self.addEventListener("install", (event) => { +// const soPdfEndpoint = process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT; +// const vectorTilesEndpoint = process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT; +// const treePdfEndpoint = process.env.NEXT_PUBLIC_TREE_PDF_ENDPOINT; +// event.waitUntil( +// (async () => { +// await caches.open(TILE_CACHE_NAME).then((cache) => +// fetch(`${vectorTilesEndpoint}/tiles.txt`) +// .then((response) => response.text()) +// .then(async (response) => { +// const tiles = response.split(/\r?\n/); +// // eslint-disable-next-line no-plusplus +// for (const tile of tiles) { +// const tileUrl = `${vectorTilesEndpoint}/${tile}`; +// // eslint-disable-next-line no-await-in-loop +// if (tile && !(await cache.match(tileUrl))) { +// try { +// // eslint-disable-next-line no-await-in-loop +// const tileResponse = await fetch(tileUrl); +// void cache.put(tileUrl, tileResponse); +// } catch (error) { +// // Some tiles do not exist. +// } +// } +// } +// return true; +// }), +// ); + +// await caches.open(SO_CACHE_NAME).then((cache) => +// fetch(`${soPdfEndpoint}/list.txt`) +// .then((response) => response.text()) +// .then(async (response) => { +// const forestTypes = response.split(/\r?\n/); +// for (const forestType of forestTypes) { +// const pdfUrl = `${soPdfEndpoint}/${forestType}`; +// if (forestType && !(await cache.match(pdfUrl))) { +// try { +// const pdfResponse = await fetch(pdfUrl); +// void cache.put(pdfUrl, pdfResponse); +// } catch (error) { +// // Some PDFs do not exist. +// } +// } +// } +// return true; +// }), +// ); + +// await caches.open(TREE_CACHE_NAME).then((cache) => +// fetch(`${treePdfEndpoint}/list.txt`) +// .then((response) => response.text()) +// .then(async (response) => { +// const treeTypes = response.split(/\r?\n/); +// for (const treeType of treeTypes) { +// const pdfUrl = `${treePdfEndpoint}/${treeType}`; +// if (treeType && !(await cache.match(pdfUrl))) { +// try { +// const pdfResponse = await fetch(pdfUrl); +// void cache.put(pdfUrl, pdfResponse); +// } catch (error) { +// // Some PDFs do not exist. +// } +// } +// } +// return true; +// }), +// ); +// })(), +// ); +// }); -self.addEventListener("activate", (event) => { - event.waitUntil( - (async () => { - const clients = await self.clients.matchAll({ - includeUncontrolled: true, - }); - clients.forEach((client) => { - client.postMessage({ type: "CACHE_READY" }); - }); - })(), - ); -}); +// self.addEventListener("activate", (event) => { +// event.waitUntil( +// (async () => { +// const clients = await self.clients.matchAll({ +// includeUncontrolled: true, +// }); +// clients.forEach((client) => { +// client.postMessage({ type: "CACHE_READY" }); +// }); +// })(), +// ); +// }); -// eslint-disable-next-line no-restricted-globals +// // eslint-disable-next-line no-restricted-globals // self.addEventListener("fetch", (event) => { // const cacheUrls = [ // process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT, From 92db635a6c816ef45b6cd70c537bddf3fb23a8ed Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Tue, 30 Sep 2025 15:38:24 +0200 Subject: [PATCH 05/20] Remove runtimeCaching modification. --- next.config.mjs | 2 -- sw.ts | 13 ++----------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index 28ad16a1..a8b32e27 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -61,10 +61,8 @@ const getNextConfig = async (phase) => { if (phase === PHASE_PRODUCTION_BUILD) { const withSerwist = (await import("@serwist/next")).default({ - maximumFileSizeToCacheInBytes: 5000000, swSrc: "sw.ts", swDest: "public/sw.js", - reloadOnOnline: true, }); return withSerwist(nextConfig); } diff --git a/sw.ts b/sw.ts index a72231e1..41d69009 100644 --- a/sw.ts +++ b/sw.ts @@ -1,5 +1,5 @@ import { defaultCache } from "@serwist/next/worker"; -import { NetworkOnly, Serwist } from "serwist"; +import { Serwist } from "serwist"; import type { PrecacheEntry, SerwistGlobalConfig } from "serwist"; @@ -161,16 +161,7 @@ const serwist = new Serwist({ clientsClaim: true, navigationPreload: true, precacheEntries: self.__SW_MANIFEST, - runtimeCaching: [ - ...defaultCache, - { - handler: new NetworkOnly(), - matcher: ({ url }) => - /^https:\/\/wmts10\.geo\.admin\.ch\/1\.0\.0\/ch\.swisstopo\.(pixelkarte-grau|swissimage)\/default\/current\/3857\/.*\.jpeg$/i.test( - url.href, - ), - }, - ], + runtimeCaching: defaultCache, skipWaiting: true, }); From e342f53c87a45261fef56c90e0bba093b86b7417 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Wed, 1 Oct 2025 12:31:53 +0200 Subject: [PATCH 06/20] Reactivate runtimeCaching modification. --- sw.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/sw.ts b/sw.ts index 41d69009..a72231e1 100644 --- a/sw.ts +++ b/sw.ts @@ -1,5 +1,5 @@ import { defaultCache } from "@serwist/next/worker"; -import { Serwist } from "serwist"; +import { NetworkOnly, Serwist } from "serwist"; import type { PrecacheEntry, SerwistGlobalConfig } from "serwist"; @@ -161,7 +161,16 @@ const serwist = new Serwist({ clientsClaim: true, navigationPreload: true, precacheEntries: self.__SW_MANIFEST, - runtimeCaching: defaultCache, + runtimeCaching: [ + ...defaultCache, + { + handler: new NetworkOnly(), + matcher: ({ url }) => + /^https:\/\/wmts10\.geo\.admin\.ch\/1\.0\.0\/ch\.swisstopo\.(pixelkarte-grau|swissimage)\/default\/current\/3857\/.*\.jpeg$/i.test( + url.href, + ), + }, + ], skipWaiting: true, }); From adc2d3fa72c51de02b8c23692cc82d507d51f8e6 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Wed, 8 Oct 2025 12:29:51 +0200 Subject: [PATCH 07/20] Move Serwist to top and reactivate install event listener again. --- sw.ts | 194 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 97 insertions(+), 97 deletions(-) diff --git a/sw.ts b/sw.ts index a72231e1..cbe7a65c 100644 --- a/sw.ts +++ b/sw.ts @@ -15,27 +15,44 @@ declare global { declare const self: ServiceWorkerGlobalScope; -// const treePdfCacheString = "tree-data-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore -// const currentTreePdfVersion = 1; // Current Tree PDF version, needs to be increased every time new PDFs are deployed -// const TREE_CACHE_NAME = `${treePdfCacheString}${currentTreePdfVersion}`; // Cache name for Tree profile data +const serwist = new Serwist({ + clientsClaim: true, + navigationPreload: true, + precacheEntries: self.__SW_MANIFEST, + runtimeCaching: [ + ...defaultCache, + { + handler: new NetworkOnly(), + matcher: ({ url }) => + /^https:\/\/wmts10\.geo\.admin\.ch\/1\.0\.0\/ch\.swisstopo\.(pixelkarte-grau|swissimage)\/default\/current\/3857\/.*\.jpeg$/i.test( + url.href, + ), + }, + ], + skipWaiting: true, +}); + +const treePdfCacheString = "tree-data-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore +const currentTreePdfVersion = 1; // Current Tree PDF version, needs to be increased every time new PDFs are deployed +const TREE_CACHE_NAME = `${treePdfCacheString}${currentTreePdfVersion}`; // Cache name for Tree profile data // // Create an array of 'tree-data-v[1 - currentVersion]' strings for the caches to be removed // const OLD_TREE_PDF_CACHES = Array.from(Array(currentTreePdfVersion).keys()).map( // (version) => `${treePdfCacheString}${version}`, // ); -// const soPdfCacheString = "so-data-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore -// const currentSoPdfVersion = 3; // Current SO PDF version, needs to be increased every time new PDFs are deployed -// const SO_CACHE_NAME = `${soPdfCacheString}${currentSoPdfVersion}`; // Cache name for SO profile data +const soPdfCacheString = "so-data-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore +const currentSoPdfVersion = 3; // Current SO PDF version, needs to be increased every time new PDFs are deployed +const SO_CACHE_NAME = `${soPdfCacheString}${currentSoPdfVersion}`; // Cache name for SO profile data // // Create an array of 'so-data-v[1 - currentVersion]' strings for the caches to be removed // const OLD_SO_PDF_CACHES = Array.from(Array(currentSoPdfVersion).keys()).map( // (version) => `${soPdfCacheString}${version}`, // ); -// const tileCacheString = "tree-app-tiles-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore -// const currentTileVersion = 25; // Current tile version, needs to be increased every time new tiles are deployed -// const TILE_CACHE_NAME = `${tileCacheString}${currentTileVersion}`; +const tileCacheString = "tree-app-tiles-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore +const currentTileVersion = 25; // Current tile version, needs to be increased every time new tiles are deployed +const TILE_CACHE_NAME = `${tileCacheString}${currentTileVersion}`; // // Create an array of 'tree-app-tiles-v[1 - currentVersion]' strings for the caches to be removed // const OLD_TILE_CACHES = Array.from(Array(currentTileVersion).keys()).map( @@ -54,77 +71,77 @@ declare const self: ServiceWorkerGlobalScope; // (OLD_CACHE) => void caches.delete(OLD_CACHE), // ); -// self.addEventListener("install", (event) => { -// const soPdfEndpoint = process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT; -// const vectorTilesEndpoint = process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT; -// const treePdfEndpoint = process.env.NEXT_PUBLIC_TREE_PDF_ENDPOINT; -// event.waitUntil( -// (async () => { -// await caches.open(TILE_CACHE_NAME).then((cache) => -// fetch(`${vectorTilesEndpoint}/tiles.txt`) -// .then((response) => response.text()) -// .then(async (response) => { -// const tiles = response.split(/\r?\n/); -// // eslint-disable-next-line no-plusplus -// for (const tile of tiles) { -// const tileUrl = `${vectorTilesEndpoint}/${tile}`; -// // eslint-disable-next-line no-await-in-loop -// if (tile && !(await cache.match(tileUrl))) { -// try { -// // eslint-disable-next-line no-await-in-loop -// const tileResponse = await fetch(tileUrl); -// void cache.put(tileUrl, tileResponse); -// } catch (error) { -// // Some tiles do not exist. -// } -// } -// } -// return true; -// }), -// ); - -// await caches.open(SO_CACHE_NAME).then((cache) => -// fetch(`${soPdfEndpoint}/list.txt`) -// .then((response) => response.text()) -// .then(async (response) => { -// const forestTypes = response.split(/\r?\n/); -// for (const forestType of forestTypes) { -// const pdfUrl = `${soPdfEndpoint}/${forestType}`; -// if (forestType && !(await cache.match(pdfUrl))) { -// try { -// const pdfResponse = await fetch(pdfUrl); -// void cache.put(pdfUrl, pdfResponse); -// } catch (error) { -// // Some PDFs do not exist. -// } -// } -// } -// return true; -// }), -// ); - -// await caches.open(TREE_CACHE_NAME).then((cache) => -// fetch(`${treePdfEndpoint}/list.txt`) -// .then((response) => response.text()) -// .then(async (response) => { -// const treeTypes = response.split(/\r?\n/); -// for (const treeType of treeTypes) { -// const pdfUrl = `${treePdfEndpoint}/${treeType}`; -// if (treeType && !(await cache.match(pdfUrl))) { -// try { -// const pdfResponse = await fetch(pdfUrl); -// void cache.put(pdfUrl, pdfResponse); -// } catch (error) { -// // Some PDFs do not exist. -// } -// } -// } -// return true; -// }), -// ); -// })(), -// ); -// }); +self.addEventListener("install", (event) => { + const soPdfEndpoint = process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT; + const vectorTilesEndpoint = process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT; + const treePdfEndpoint = process.env.NEXT_PUBLIC_TREE_PDF_ENDPOINT; + event.waitUntil( + (async () => { + await caches.open(TILE_CACHE_NAME).then((cache) => + fetch(`${vectorTilesEndpoint}/tiles.txt`) + .then((response) => response.text()) + .then(async (response) => { + const tiles = response.split(/\r?\n/); + // eslint-disable-next-line no-plusplus + for (const tile of tiles) { + const tileUrl = `${vectorTilesEndpoint}/${tile}`; + // eslint-disable-next-line no-await-in-loop + if (tile && !(await cache.match(tileUrl))) { + try { + // eslint-disable-next-line no-await-in-loop + const tileResponse = await fetch(tileUrl); + void cache.put(tileUrl, tileResponse); + } catch (error) { + // Some tiles do not exist. + } + } + } + return true; + }), + ); + + await caches.open(SO_CACHE_NAME).then((cache) => + fetch(`${soPdfEndpoint}/list.txt`) + .then((response) => response.text()) + .then(async (response) => { + const forestTypes = response.split(/\r?\n/); + for (const forestType of forestTypes) { + const pdfUrl = `${soPdfEndpoint}/${forestType}`; + if (forestType && !(await cache.match(pdfUrl))) { + try { + const pdfResponse = await fetch(pdfUrl); + void cache.put(pdfUrl, pdfResponse); + } catch (error) { + // Some PDFs do not exist. + } + } + } + return true; + }), + ); + + await caches.open(TREE_CACHE_NAME).then((cache) => + fetch(`${treePdfEndpoint}/list.txt`) + .then((response) => response.text()) + .then(async (response) => { + const treeTypes = response.split(/\r?\n/); + for (const treeType of treeTypes) { + const pdfUrl = `${treePdfEndpoint}/${treeType}`; + if (treeType && !(await cache.match(pdfUrl))) { + try { + const pdfResponse = await fetch(pdfUrl); + void cache.put(pdfUrl, pdfResponse); + } catch (error) { + // Some PDFs do not exist. + } + } + } + return true; + }), + ); + })(), + ); +}); // self.addEventListener("activate", (event) => { // event.waitUntil( @@ -157,21 +174,4 @@ declare const self: ServiceWorkerGlobalScope; // } // }); -const serwist = new Serwist({ - clientsClaim: true, - navigationPreload: true, - precacheEntries: self.__SW_MANIFEST, - runtimeCaching: [ - ...defaultCache, - { - handler: new NetworkOnly(), - matcher: ({ url }) => - /^https:\/\/wmts10\.geo\.admin\.ch\/1\.0\.0\/ch\.swisstopo\.(pixelkarte-grau|swissimage)\/default\/current\/3857\/.*\.jpeg$/i.test( - url.href, - ), - }, - ], - skipWaiting: true, -}); - serwist.addEventListeners(); From a25221650506acc455019bf11f68f9b9a9eca2e0 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Wed, 8 Oct 2025 13:07:51 +0200 Subject: [PATCH 08/20] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 684d9d46..8910e12c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tree-app", - "version": "3.0.1", + "version": "3.0.1a", "private": true, "scripts": { "dev": "next dev", From dc555e26b9b0dec813e52ebc514837b1f1d008de Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Wed, 8 Oct 2025 13:19:46 +0200 Subject: [PATCH 09/20] Reactivate Serwist fetch event listener. --- package.json | 2 +- sw.ts | 33 ++++++++++++++++----------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 8910e12c..dca71392 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tree-app", - "version": "3.0.1a", + "version": "3.0.1b", "private": true, "scripts": { "dev": "next dev", diff --git a/sw.ts b/sw.ts index cbe7a65c..24e25dfa 100644 --- a/sw.ts +++ b/sw.ts @@ -156,22 +156,21 @@ self.addEventListener("install", (event) => { // ); // }); -// // eslint-disable-next-line no-restricted-globals -// self.addEventListener("fetch", (event) => { -// const cacheUrls = [ -// process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT, -// process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT, -// ]; -// const shouldFetchFromCache = cacheUrls.some( -// (url) => url && event.request.url.startsWith(url), -// ); -// if (shouldFetchFromCache) { -// event.respondWith( -// caches -// .match(event.request) -// .then((response) => response ?? fetch(event.request)), -// ); -// } -// }); +self.addEventListener("fetch", (event) => { + const cacheUrls = [ + process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT, + process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT, + ]; + const shouldFetchFromCache = cacheUrls.some( + (url) => url && event.request.url.startsWith(url), + ); + if (shouldFetchFromCache) { + event.respondWith( + caches + .match(event.request) + .then((response) => response ?? fetch(event.request)), + ); + } +}); serwist.addEventListeners(); From 5efdb3a542970371d9e362137cee6312f4bb982e Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Tue, 21 Oct 2025 09:43:42 +0200 Subject: [PATCH 10/20] Ignore all URL parameters for precache. --- sw.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sw.ts b/sw.ts index 24e25dfa..0239183e 100644 --- a/sw.ts +++ b/sw.ts @@ -19,6 +19,10 @@ const serwist = new Serwist({ clientsClaim: true, navigationPreload: true, precacheEntries: self.__SW_MANIFEST, + precacheOptions: { + // Ignore all URL parameters. + ignoreURLParametersMatching: [/.*/], + }, runtimeCaching: [ ...defaultCache, { From a3fe66f2e3946dcdd68be257d8ce6e69f6c771b7 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Tue, 21 Oct 2025 09:48:38 +0200 Subject: [PATCH 11/20] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dca71392..2288ffca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tree-app", - "version": "3.0.1b", + "version": "3.0.1c", "private": true, "scripts": { "dev": "next dev", From 91fc781fc566779393c1d99184c6d278d0b61966 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Fri, 31 Oct 2025 11:59:26 +0100 Subject: [PATCH 12/20] activate CACHE_READY and disable ignoreURLParametersMatching --- package.json | 2 +- sw.ts | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 2288ffca..daa42e7e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tree-app", - "version": "3.0.1c", + "version": "3.0.1d", "private": true, "scripts": { "dev": "next dev", diff --git a/sw.ts b/sw.ts index 0239183e..606ad9b3 100644 --- a/sw.ts +++ b/sw.ts @@ -19,10 +19,10 @@ const serwist = new Serwist({ clientsClaim: true, navigationPreload: true, precacheEntries: self.__SW_MANIFEST, - precacheOptions: { - // Ignore all URL parameters. - ignoreURLParametersMatching: [/.*/], - }, + // precacheOptions: { + // // Ignore all URL parameters. + // ignoreURLParametersMatching: [/.*/], + // }, runtimeCaching: [ ...defaultCache, { @@ -147,18 +147,18 @@ self.addEventListener("install", (event) => { ); }); -// self.addEventListener("activate", (event) => { -// event.waitUntil( -// (async () => { -// const clients = await self.clients.matchAll({ -// includeUncontrolled: true, -// }); -// clients.forEach((client) => { -// client.postMessage({ type: "CACHE_READY" }); -// }); -// })(), -// ); -// }); +self.addEventListener("activate", (event) => { + event.waitUntil( + (async () => { + const clients = await self.clients.matchAll({ + includeUncontrolled: true, + }); + clients.forEach((client) => { + client.postMessage({ type: "CACHE_READY" }); + }); + })(), + ); +}); self.addEventListener("fetch", (event) => { const cacheUrls = [ From 45e0e9d2e883cd8b667ce11520047c4f9f371a12 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Fri, 31 Oct 2025 12:55:38 +0100 Subject: [PATCH 13/20] Add Serwist event listeners first --- sw.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sw.ts b/sw.ts index 606ad9b3..9249e531 100644 --- a/sw.ts +++ b/sw.ts @@ -160,10 +160,15 @@ self.addEventListener("activate", (event) => { ); }); +// Add Serwist event listeners first +serwist.addEventListeners(); + +// Then add custom fetch handler for cached resources self.addEventListener("fetch", (event) => { const cacheUrls = [ process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT, process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT, + process.env.NEXT_PUBLIC_TREE_PDF_ENDPOINT, ]; const shouldFetchFromCache = cacheUrls.some( (url) => url && event.request.url.startsWith(url), @@ -176,5 +181,3 @@ self.addEventListener("fetch", (event) => { ); } }); - -serwist.addEventListeners(); From 75db2dba915e35e851c529789b2966616b1ac5c7 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Fri, 31 Oct 2025 13:01:12 +0100 Subject: [PATCH 14/20] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index daa42e7e..4692cc6d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tree-app", - "version": "3.0.1d", + "version": "3.0.1e", "private": true, "scripts": { "dev": "next dev", From 16b6b4bde982a968a914abf31b4bdc35dfe1cbda Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Mon, 3 Nov 2025 11:26:51 +0100 Subject: [PATCH 15/20] reactivate original code --- package.json | 2 +- sw.ts | 52 ++++++++++++++++++++++++---------------------------- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 4692cc6d..79568987 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tree-app", - "version": "3.0.1e", + "version": "3.0.2", "private": true, "scripts": { "dev": "next dev", diff --git a/sw.ts b/sw.ts index 9249e531..995f8acd 100644 --- a/sw.ts +++ b/sw.ts @@ -19,10 +19,6 @@ const serwist = new Serwist({ clientsClaim: true, navigationPreload: true, precacheEntries: self.__SW_MANIFEST, - // precacheOptions: { - // // Ignore all URL parameters. - // ignoreURLParametersMatching: [/.*/], - // }, runtimeCaching: [ ...defaultCache, { @@ -40,40 +36,40 @@ const treePdfCacheString = "tree-data-v"; // IMPORTANT: This string should NEVER const currentTreePdfVersion = 1; // Current Tree PDF version, needs to be increased every time new PDFs are deployed const TREE_CACHE_NAME = `${treePdfCacheString}${currentTreePdfVersion}`; // Cache name for Tree profile data -// // Create an array of 'tree-data-v[1 - currentVersion]' strings for the caches to be removed -// const OLD_TREE_PDF_CACHES = Array.from(Array(currentTreePdfVersion).keys()).map( -// (version) => `${treePdfCacheString}${version}`, -// ); +// Create an array of 'tree-data-v[1 - currentVersion]' strings for the caches to be removed +const OLD_TREE_PDF_CACHES = Array.from(Array(currentTreePdfVersion).keys()).map( + (version) => `${treePdfCacheString}${version}`, +); const soPdfCacheString = "so-data-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore const currentSoPdfVersion = 3; // Current SO PDF version, needs to be increased every time new PDFs are deployed const SO_CACHE_NAME = `${soPdfCacheString}${currentSoPdfVersion}`; // Cache name for SO profile data -// // Create an array of 'so-data-v[1 - currentVersion]' strings for the caches to be removed -// const OLD_SO_PDF_CACHES = Array.from(Array(currentSoPdfVersion).keys()).map( -// (version) => `${soPdfCacheString}${version}`, -// ); +// Create an array of 'so-data-v[1 - currentVersion]' strings for the caches to be removed +const OLD_SO_PDF_CACHES = Array.from(Array(currentSoPdfVersion).keys()).map( + (version) => `${soPdfCacheString}${version}`, +); const tileCacheString = "tree-app-tiles-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore const currentTileVersion = 25; // Current tile version, needs to be increased every time new tiles are deployed const TILE_CACHE_NAME = `${tileCacheString}${currentTileVersion}`; -// // Create an array of 'tree-app-tiles-v[1 - currentVersion]' strings for the caches to be removed -// const OLD_TILE_CACHES = Array.from(Array(currentTileVersion).keys()).map( -// (version) => `${tileCacheString}${version}`, -// ); - -// // This allows the web app to trigger skipWaiting via -// // registration.waiting.postMessage({type: 'SKIP_WAITING'}) -// self.addEventListener("message", (event) => { -// if (event.data && (event.data as MessageEvent).type === "SKIP_WAITING") { -// void self.skipWaiting(); -// } -// }); - -// [...OLD_SO_PDF_CACHES, ...OLD_TILE_CACHES, ...OLD_TREE_PDF_CACHES].forEach( -// (OLD_CACHE) => void caches.delete(OLD_CACHE), -// ); +// Create an array of 'tree-app-tiles-v[1 - currentVersion]' strings for the caches to be removed +const OLD_TILE_CACHES = Array.from(Array(currentTileVersion).keys()).map( + (version) => `${tileCacheString}${version}`, +); + +// This allows the web app to trigger skipWaiting via +// registration.waiting.postMessage({type: 'SKIP_WAITING'}) +self.addEventListener("message", (event) => { + if (event.data && (event.data as MessageEvent).type === "SKIP_WAITING") { + void self.skipWaiting(); + } +}); + +[...OLD_SO_PDF_CACHES, ...OLD_TILE_CACHES, ...OLD_TREE_PDF_CACHES].forEach( + (OLD_CACHE) => void caches.delete(OLD_CACHE), +); self.addEventListener("install", (event) => { const soPdfEndpoint = process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT; From 4ec6204b5ba80fd2a67246865de02079bce69cac Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Mon, 3 Nov 2025 11:50:52 +0100 Subject: [PATCH 16/20] try ignoreURLParametersMatching --- package.json | 2 +- sw.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 79568987..c1f5b552 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tree-app", - "version": "3.0.2", + "version": "3.0.2a", "private": true, "scripts": { "dev": "next dev", diff --git a/sw.ts b/sw.ts index 995f8acd..dfc1871d 100644 --- a/sw.ts +++ b/sw.ts @@ -19,6 +19,10 @@ const serwist = new Serwist({ clientsClaim: true, navigationPreload: true, precacheEntries: self.__SW_MANIFEST, + precacheOptions: { + // Ignore all URL parameters. + ignoreURLParametersMatching: [/.*/], + }, runtimeCaching: [ ...defaultCache, { From 0fceeff08cc2b8b4a9ab60bdea7a97856293ceb5 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Mon, 3 Nov 2025 12:05:00 +0100 Subject: [PATCH 17/20] try addToPrecacheList --- package.json | 2 +- sw.ts | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c1f5b552..d3027296 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tree-app", - "version": "3.0.2a", + "version": "3.0.2b", "private": true, "scripts": { "dev": "next dev", diff --git a/sw.ts b/sw.ts index dfc1871d..22760bd2 100644 --- a/sw.ts +++ b/sw.ts @@ -36,6 +36,12 @@ const serwist = new Serwist({ skipWaiting: true, }); +serwist.addToPrecacheList([ + { url: "/" }, + { url: "/info" }, + { url: "/projection" }, +]); + const treePdfCacheString = "tree-data-v"; // IMPORTANT: This string should NEVER be changed, otherwise the old caches will not be identifyable anymore const currentTreePdfVersion = 1; // Current Tree PDF version, needs to be increased every time new PDFs are deployed const TREE_CACHE_NAME = `${treePdfCacheString}${currentTreePdfVersion}`; // Cache name for Tree profile data From 5ae1d637930541ef06486d97de03ab9757d44ab8 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Mon, 3 Nov 2025 12:16:21 +0100 Subject: [PATCH 18/20] fix version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d3027296..79568987 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tree-app", - "version": "3.0.2b", + "version": "3.0.2", "private": true, "scripts": { "dev": "next dev", From c00d539a65963144b04bf66a55e58582310d666c Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Tue, 25 Nov 2025 15:01:51 +0100 Subject: [PATCH 19/20] disable tile caching for testing --- sw.ts | 176 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/sw.ts b/sw.ts index 22760bd2..c4be00a7 100644 --- a/sw.ts +++ b/sw.ts @@ -81,77 +81,77 @@ self.addEventListener("message", (event) => { (OLD_CACHE) => void caches.delete(OLD_CACHE), ); -self.addEventListener("install", (event) => { - const soPdfEndpoint = process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT; - const vectorTilesEndpoint = process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT; - const treePdfEndpoint = process.env.NEXT_PUBLIC_TREE_PDF_ENDPOINT; - event.waitUntil( - (async () => { - await caches.open(TILE_CACHE_NAME).then((cache) => - fetch(`${vectorTilesEndpoint}/tiles.txt`) - .then((response) => response.text()) - .then(async (response) => { - const tiles = response.split(/\r?\n/); - // eslint-disable-next-line no-plusplus - for (const tile of tiles) { - const tileUrl = `${vectorTilesEndpoint}/${tile}`; - // eslint-disable-next-line no-await-in-loop - if (tile && !(await cache.match(tileUrl))) { - try { - // eslint-disable-next-line no-await-in-loop - const tileResponse = await fetch(tileUrl); - void cache.put(tileUrl, tileResponse); - } catch (error) { - // Some tiles do not exist. - } - } - } - return true; - }), - ); - - await caches.open(SO_CACHE_NAME).then((cache) => - fetch(`${soPdfEndpoint}/list.txt`) - .then((response) => response.text()) - .then(async (response) => { - const forestTypes = response.split(/\r?\n/); - for (const forestType of forestTypes) { - const pdfUrl = `${soPdfEndpoint}/${forestType}`; - if (forestType && !(await cache.match(pdfUrl))) { - try { - const pdfResponse = await fetch(pdfUrl); - void cache.put(pdfUrl, pdfResponse); - } catch (error) { - // Some PDFs do not exist. - } - } - } - return true; - }), - ); - - await caches.open(TREE_CACHE_NAME).then((cache) => - fetch(`${treePdfEndpoint}/list.txt`) - .then((response) => response.text()) - .then(async (response) => { - const treeTypes = response.split(/\r?\n/); - for (const treeType of treeTypes) { - const pdfUrl = `${treePdfEndpoint}/${treeType}`; - if (treeType && !(await cache.match(pdfUrl))) { - try { - const pdfResponse = await fetch(pdfUrl); - void cache.put(pdfUrl, pdfResponse); - } catch (error) { - // Some PDFs do not exist. - } - } - } - return true; - }), - ); - })(), - ); -}); +// self.addEventListener("install", (event) => { +// const soPdfEndpoint = process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT; +// const vectorTilesEndpoint = process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT; +// const treePdfEndpoint = process.env.NEXT_PUBLIC_TREE_PDF_ENDPOINT; +// event.waitUntil( +// (async () => { +// await caches.open(TILE_CACHE_NAME).then((cache) => +// fetch(`${vectorTilesEndpoint}/tiles.txt`) +// .then((response) => response.text()) +// .then(async (response) => { +// const tiles = response.split(/\r?\n/); +// // eslint-disable-next-line no-plusplus +// for (const tile of tiles) { +// const tileUrl = `${vectorTilesEndpoint}/${tile}`; +// // eslint-disable-next-line no-await-in-loop +// if (tile && !(await cache.match(tileUrl))) { +// try { +// // eslint-disable-next-line no-await-in-loop +// const tileResponse = await fetch(tileUrl); +// void cache.put(tileUrl, tileResponse); +// } catch (error) { +// // Some tiles do not exist. +// } +// } +// } +// return true; +// }), +// ); + +// await caches.open(SO_CACHE_NAME).then((cache) => +// fetch(`${soPdfEndpoint}/list.txt`) +// .then((response) => response.text()) +// .then(async (response) => { +// const forestTypes = response.split(/\r?\n/); +// for (const forestType of forestTypes) { +// const pdfUrl = `${soPdfEndpoint}/${forestType}`; +// if (forestType && !(await cache.match(pdfUrl))) { +// try { +// const pdfResponse = await fetch(pdfUrl); +// void cache.put(pdfUrl, pdfResponse); +// } catch (error) { +// // Some PDFs do not exist. +// } +// } +// } +// return true; +// }), +// ); + +// await caches.open(TREE_CACHE_NAME).then((cache) => +// fetch(`${treePdfEndpoint}/list.txt`) +// .then((response) => response.text()) +// .then(async (response) => { +// const treeTypes = response.split(/\r?\n/); +// for (const treeType of treeTypes) { +// const pdfUrl = `${treePdfEndpoint}/${treeType}`; +// if (treeType && !(await cache.match(pdfUrl))) { +// try { +// const pdfResponse = await fetch(pdfUrl); +// void cache.put(pdfUrl, pdfResponse); +// } catch (error) { +// // Some PDFs do not exist. +// } +// } +// } +// return true; +// }), +// ); +// })(), +// ); +// }); self.addEventListener("activate", (event) => { event.waitUntil( @@ -170,20 +170,20 @@ self.addEventListener("activate", (event) => { serwist.addEventListeners(); // Then add custom fetch handler for cached resources -self.addEventListener("fetch", (event) => { - const cacheUrls = [ - process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT, - process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT, - process.env.NEXT_PUBLIC_TREE_PDF_ENDPOINT, - ]; - const shouldFetchFromCache = cacheUrls.some( - (url) => url && event.request.url.startsWith(url), - ); - if (shouldFetchFromCache) { - event.respondWith( - caches - .match(event.request) - .then((response) => response ?? fetch(event.request)), - ); - } -}); +// self.addEventListener("fetch", (event) => { +// const cacheUrls = [ +// process.env.NEXT_PUBLIC_VECTOR_TILES_ENDPOINT, +// process.env.NEXT_PUBLIC_SO_PDF_ENDPOINT, +// process.env.NEXT_PUBLIC_TREE_PDF_ENDPOINT, +// ]; +// const shouldFetchFromCache = cacheUrls.some( +// (url) => url && event.request.url.startsWith(url), +// ); +// if (shouldFetchFromCache) { +// event.respondWith( +// caches +// .match(event.request) +// .then((response) => response ?? fetch(event.request)), +// ); +// } +// }); From 30b87fa94685d8bcc6474dfdd5dfa63c09e4d165 Mon Sep 17 00:00:00 2001 From: Friedjoff Trautwein Date: Tue, 25 Nov 2025 15:34:01 +0100 Subject: [PATCH 20/20] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 79568987..4605b27b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tree-app", - "version": "3.0.2", + "version": "3.0.3", "private": true, "scripts": { "dev": "next dev",