diff --git a/web/app/serwist/[path]/route.ts b/web/app/serwist/[path]/route.ts index beca2cd412..ad371756b5 100644 --- a/web/app/serwist/[path]/route.ts +++ b/web/app/serwist/[path]/route.ts @@ -1,11 +1,14 @@ +import { spawnSync } from 'node:child_process' +import { randomUUID } from 'node:crypto' import { createSerwistRoute } from '@serwist/turbopack' const basePath = process.env.NEXT_PUBLIC_BASE_PATH || '' +const revision = spawnSync('git', ['rev-parse', 'HEAD'], { encoding: 'utf-8' }).stdout?.trim() || randomUUID() export const { dynamic, dynamicParams, revalidate, generateStaticParams, GET } = createSerwistRoute({ + additionalPrecacheEntries: [{ url: `${basePath}/_offline.html`, revision }], swSrc: 'app/sw.ts', nextConfig: { basePath, }, - useNativeEsbuild: true, }) diff --git a/web/app/sw.ts b/web/app/sw.ts index f4011ee224..99ef2c3544 100644 --- a/web/app/sw.ts +++ b/web/app/sw.ts @@ -3,9 +3,7 @@ /// import type { PrecacheEntry, SerwistGlobalConfig } from 'serwist' -import { defaultCache } from '@serwist/turbopack/worker' -import { Serwist } from 'serwist' -import { withLeadingSlash } from 'ufo' +import { CacheableResponsePlugin, CacheFirst, ExpirationPlugin, NetworkFirst, Serwist, StaleWhileRevalidate } from 'serwist' declare global { // eslint-disable-next-line ts/consistent-type-definitions @@ -20,30 +18,78 @@ const scopePathname = new URL(self.registration.scope).pathname const basePath = scopePathname.replace(/\/serwist\/$/, '').replace(/\/$/, '') const offlineUrl = `${basePath}/_offline.html` -const normalizeManifestUrl = (url: string): string => { - if (url.startsWith('/serwist/')) - return url.replace(/^\/serwist\//, '/') - - return withLeadingSlash(url) -} - -const manifest = self.__SW_MANIFEST?.map((entry) => { - if (typeof entry === 'string') - return normalizeManifestUrl(entry) - - return { - ...entry, - url: normalizeManifestUrl(entry.url), - } -}) - const serwist = new Serwist({ - precacheEntries: manifest, + precacheEntries: self.__SW_MANIFEST, skipWaiting: true, disableDevLogs: true, clientsClaim: true, navigationPreload: true, - runtimeCaching: defaultCache, + runtimeCaching: [ + { + matcher: ({ url }) => url.origin === 'https://fonts.googleapis.com', + handler: new CacheFirst({ + cacheName: 'google-fonts', + plugins: [ + new CacheableResponsePlugin({ statuses: [0, 200] }), + new ExpirationPlugin({ + maxEntries: 4, + maxAgeSeconds: 365 * 24 * 60 * 60, + }), + ], + }), + }, + { + matcher: ({ url }) => url.origin === 'https://fonts.gstatic.com', + handler: new CacheFirst({ + cacheName: 'google-fonts-webfonts', + plugins: [ + new CacheableResponsePlugin({ statuses: [0, 200] }), + new ExpirationPlugin({ + maxEntries: 4, + maxAgeSeconds: 365 * 24 * 60 * 60, + }), + ], + }), + }, + { + matcher: ({ request }) => request.destination === 'image', + handler: new CacheFirst({ + cacheName: 'images', + plugins: [ + new CacheableResponsePlugin({ statuses: [0, 200] }), + new ExpirationPlugin({ + maxEntries: 64, + maxAgeSeconds: 30 * 24 * 60 * 60, + }), + ], + }), + }, + { + matcher: ({ request }) => request.destination === 'script' || request.destination === 'style', + handler: new StaleWhileRevalidate({ + cacheName: 'static-resources', + plugins: [ + new ExpirationPlugin({ + maxEntries: 32, + maxAgeSeconds: 24 * 60 * 60, + }), + ], + }), + }, + { + matcher: ({ url, sameOrigin }) => sameOrigin && url.pathname.startsWith('/api/'), + handler: new NetworkFirst({ + cacheName: 'api-cache', + networkTimeoutSeconds: 10, + plugins: [ + new ExpirationPlugin({ + maxEntries: 16, + maxAgeSeconds: 60 * 60, + }), + ], + }), + }, + ], fallbacks: { entries: [ { diff --git a/web/next.config.ts b/web/next.config.ts index a7debda835..4d690188ed 100644 --- a/web/next.config.ts +++ b/web/next.config.ts @@ -30,7 +30,7 @@ const remoteImageURLs = ([hasSetWebPrefix ? new URL(`${process.env.NEXT_PUBLIC_W const nextConfig: NextConfig = { basePath: process.env.NEXT_PUBLIC_BASE_PATH || '', - serverExternalPackages: ['esbuild'], + serverExternalPackages: ['esbuild-wasm'], transpilePackages: ['echarts', 'zrender'], turbopack: { rules: codeInspectorPlugin({ diff --git a/web/package.json b/web/package.json index b6a55121d0..645c438634 100644 --- a/web/package.json +++ b/web/package.json @@ -162,7 +162,6 @@ "string-ts": "2.3.1", "tailwind-merge": "2.6.0", "tldts": "7.0.17", - "ufo": "1.6.3", "use-context-selector": "2.0.0", "uuid": "10.0.0", "wa-sqlite": "1.0.0", @@ -180,7 +179,7 @@ "@next/eslint-plugin-next": "16.1.6", "@next/mdx": "16.1.5", "@rgrove/parse-xml": "4.2.0", - "@serwist/turbopack": "9.5.4", + "@serwist/turbopack": "9.5.0", "@storybook/addon-docs": "10.2.0", "@storybook/addon-links": "10.2.0", "@storybook/addon-onboarding": "10.2.0", @@ -218,7 +217,7 @@ "autoprefixer": "10.4.21", "code-inspector-plugin": "1.3.6", "cross-env": "10.1.0", - "esbuild": "0.27.2", + "esbuild-wasm": "0.27.2", "eslint": "9.39.2", "eslint-plugin-react-hooks": "7.0.1", "eslint-plugin-react-refresh": "0.4.26", @@ -234,7 +233,7 @@ "postcss": "8.5.6", "react-scan": "0.4.3", "sass": "1.93.2", - "serwist": "9.5.4", + "serwist": "9.5.0", "storybook": "10.2.0", "tailwindcss": "3.4.18", "tsx": "4.21.0", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index ad7c900808..5988fa2ca6 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -362,9 +362,6 @@ importers: tldts: specifier: 7.0.17 version: 7.0.17 - ufo: - specifier: 1.6.3 - version: 1.6.3 use-context-selector: specifier: 2.0.0 version: 2.0.0(react@19.2.4)(scheduler@0.27.0) @@ -412,8 +409,8 @@ importers: specifier: 4.2.0 version: 4.2.0 '@serwist/turbopack': - specifier: 9.5.4 - version: 9.5.4(@swc/helpers@0.5.18)(esbuild-wasm@0.27.2)(esbuild@0.27.2)(next@16.1.5(@babel/core@7.28.6)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(react@19.2.4)(typescript@5.9.3) + specifier: 9.5.0 + version: 9.5.0(@swc/helpers@0.5.18)(esbuild-wasm@0.27.2)(next@16.1.5(@babel/core@7.28.6)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(react@19.2.4)(typescript@5.9.3) '@storybook/addon-docs': specifier: 10.2.0 version: 10.2.0(@types/react@19.2.9)(esbuild@0.27.2)(rollup@4.56.0)(storybook@10.2.0(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@18.15.0)(jiti@1.21.7)(sass@1.93.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.27.2)(uglify-js@3.19.3)) @@ -525,7 +522,7 @@ importers: cross-env: specifier: 10.1.0 version: 10.1.0 - esbuild: + esbuild-wasm: specifier: 0.27.2 version: 0.27.2 eslint: @@ -574,8 +571,8 @@ importers: specifier: 1.93.2 version: 1.93.2 serwist: - specifier: 9.5.4 - version: 9.5.4(browserslist@4.28.1)(typescript@5.9.3) + specifier: 9.5.0 + version: 9.5.0(typescript@5.9.3) storybook: specifier: 10.2.0 version: 10.2.0(@testing-library/dom@10.4.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -2631,8 +2628,8 @@ packages: peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x - '@serwist/build@9.5.4': - resolution: {integrity: sha512-FTiNsNb3luKsLIxjKCvkPiqFZSbx7yVNOFGSUhp4lyfzgnelT1M3/lMC88kLiak90emkuFjSkQgwa6OnyhMZlQ==} + '@serwist/build@9.5.0': + resolution: {integrity: sha512-8D330WwYjBI5MadyVOphwUqJLMNQK76KWBoDykIPrbtt0C3uGFPxG4XNZCFXBkRG3O1QLedv9BWqH27SeqhcLg==} engines: {node: '>=18.0.0'} peerDependencies: typescript: '>=5.0.0' @@ -2640,33 +2637,23 @@ packages: typescript: optional: true - '@serwist/turbopack@9.5.4': - resolution: {integrity: sha512-HerOIc2z3LWbFVq/gXK44I99KdF+x0uBI7cPHb+Q3q0WpF50d/i5fV5pZZXCf3LCqtc9oH0VlY6FWDcjWjHI8g==} + '@serwist/turbopack@9.5.0': + resolution: {integrity: sha512-MPxDapkN6LPG25I8LgOxQHc2ifIWK8WY+4pOdAbAFmN4FvsgLwYJ/W4531lsRWu08sq5IZ9JlRtt6KLNm5DHSQ==} engines: {node: '>=18.0.0'} peerDependencies: - esbuild: 0.27.2 esbuild-wasm: '>=0.25.0 <1.0.0' next: '>=14.0.0' react: '>=18.0.0' typescript: '>=5.0.0' peerDependenciesMeta: - esbuild: - optional: true - esbuild-wasm: - optional: true typescript: optional: true - '@serwist/utils@9.5.4': - resolution: {integrity: sha512-uyriGQF1qjNEHXXfsd8XJ5kfK3/MezEaUw//XdHjZeJ0LvLamrgnLJGQQoyJqUfEPCiJ4jJwc4uYMB9LjLiHxA==} - peerDependencies: - browserslist: '>=4' - peerDependenciesMeta: - browserslist: - optional: true + '@serwist/utils@9.5.0': + resolution: {integrity: sha512-DBzmJgL63/VYcQ/TpSYXW1FJKRILesOxytu+1MHY0vW2WFhW7pYkLgVuHqksP5K+3ypt54M3+2QNDDMixrnutQ==} - '@serwist/window@9.5.4': - resolution: {integrity: sha512-52t2G+TgiWDdRwGG0ArU28uy6/oQYICQfNLHs4ywybyS6mHy3BxHFl+JjB5vhg8znIG1LMpGvOmS5b7AuPVYDw==} + '@serwist/window@9.5.0': + resolution: {integrity: sha512-WqmEZjJ+u841sbUJh2LAbtPNrz8mU/wCTo9sEVqsMOk+EM5oBz5FRpF3kDzx1cF5rTIfXer1df0D354lIdFw1Q==} peerDependencies: typescript: '>=5.0.0' peerDependenciesMeta: @@ -2821,72 +2808,72 @@ packages: '@svgdotjs/svg.js@3.2.5': resolution: {integrity: sha512-/VNHWYhNu+BS7ktbYoVGrCmsXDh+chFMaONMwGNdIBcFHrWqk2jY8fNyr3DLdtQUIalvkPfM554ZSFa3dm3nxQ==} - '@swc/core-darwin-arm64@1.15.11': - resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==} + '@swc/core-darwin-arm64@1.15.8': + resolution: {integrity: sha512-M9cK5GwyWWRkRGwwCbREuj6r8jKdES/haCZ3Xckgkl8MUQJZA3XB7IXXK1IXRNeLjg6m7cnoMICpXv1v1hlJOg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.11': - resolution: {integrity: sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==} + '@swc/core-darwin-x64@1.15.8': + resolution: {integrity: sha512-j47DasuOvXl80sKJHSi2X25l44CMc3VDhlJwA7oewC1nV1VsSzwX+KOwE5tLnfORvVJJyeiXgJORNYg4jeIjYQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.11': - resolution: {integrity: sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==} + '@swc/core-linux-arm-gnueabihf@1.15.8': + resolution: {integrity: sha512-siAzDENu2rUbwr9+fayWa26r5A9fol1iORG53HWxQL1J8ym4k7xt9eME0dMPXlYZDytK5r9sW8zEA10F2U3Xwg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.11': - resolution: {integrity: sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==} + '@swc/core-linux-arm64-gnu@1.15.8': + resolution: {integrity: sha512-o+1y5u6k2FfPYbTRUPvurwzNt5qd0NTumCTFscCNuBksycloXY16J8L+SMW5QRX59n4Hp9EmFa3vpvNHRVv1+Q==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [glibc] - '@swc/core-linux-arm64-musl@1.15.11': - resolution: {integrity: sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==} + '@swc/core-linux-arm64-musl@1.15.8': + resolution: {integrity: sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [musl] - '@swc/core-linux-x64-gnu@1.15.11': - resolution: {integrity: sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==} + '@swc/core-linux-x64-gnu@1.15.8': + resolution: {integrity: sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [glibc] - '@swc/core-linux-x64-musl@1.15.11': - resolution: {integrity: sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==} + '@swc/core-linux-x64-musl@1.15.8': + resolution: {integrity: sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [musl] - '@swc/core-win32-arm64-msvc@1.15.11': - resolution: {integrity: sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==} + '@swc/core-win32-arm64-msvc@1.15.8': + resolution: {integrity: sha512-djQPJ9Rh9vP8GTS/Df3hcc6XP6xnG5c8qsngWId/BLA9oX6C7UzCPAn74BG/wGb9a6j4w3RINuoaieJB3t+7iQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.11': - resolution: {integrity: sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==} + '@swc/core-win32-ia32-msvc@1.15.8': + resolution: {integrity: sha512-/wfAgxORg2VBaUoFdytcVBVCgf1isWZIEXB9MZEUty4wwK93M/PxAkjifOho9RN3WrM3inPLabICRCEgdHpKKQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.11': - resolution: {integrity: sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==} + '@swc/core-win32-x64-msvc@1.15.8': + resolution: {integrity: sha512-GpMePrh9Sl4d61o4KAHOOv5is5+zt6BEXCOCgs/H0FLGeii7j9bWDE8ExvKFy2GRRZVNR1ugsnzaGWHKM6kuzA==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.11': - resolution: {integrity: sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==} + '@swc/core@1.15.8': + resolution: {integrity: sha512-T8keoJjXaSUoVBCIjgL6wAnhADIb09GOELzKg10CjNg+vLX48P93SME6jTfte9MZIm5m+Il57H3rTSk/0kzDUw==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -5005,13 +4992,11 @@ packages: glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true globals@14.0.0: @@ -6764,8 +6749,8 @@ packages: server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} - serwist@9.5.4: - resolution: {integrity: sha512-uTHBzpIeA6rE3oyRt392MbtNQDs2JVZelKD1KkT18UkhX6HRwCeassoI1Nd1h52DqYqa7ZfBeldJ4awy+PYrnQ==} + serwist@9.5.0: + resolution: {integrity: sha512-wjrsPWHI5ZM20jIsVKZGN/uAdS2aKOgmIOE4dqUaFhK6SVIzgoJZjTnZ3v29T+NmneuD753jlhGui9eYypsj0A==} peerDependencies: typescript: '>=5.0.0' peerDependenciesMeta: @@ -7670,6 +7655,9 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.3.5: + resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} + zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} @@ -9796,51 +9784,43 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.2.4 - '@serwist/build@9.5.4(browserslist@4.28.1)(typescript@5.9.3)': + '@serwist/build@9.5.0(typescript@5.9.3)': dependencies: - '@serwist/utils': 9.5.4(browserslist@4.28.1) + '@serwist/utils': 9.5.0 common-tags: 1.8.2 glob: 10.5.0 pretty-bytes: 6.1.1 source-map: 0.8.0-beta.0 - zod: 4.3.6 + zod: 4.3.5 optionalDependencies: typescript: 5.9.3 - transitivePeerDependencies: - - browserslist - '@serwist/turbopack@9.5.4(@swc/helpers@0.5.18)(esbuild-wasm@0.27.2)(esbuild@0.27.2)(next@16.1.5(@babel/core@7.28.6)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(react@19.2.4)(typescript@5.9.3)': + '@serwist/turbopack@9.5.0(@swc/helpers@0.5.18)(esbuild-wasm@0.27.2)(next@16.1.5(@babel/core@7.28.6)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2))(react@19.2.4)(typescript@5.9.3)': dependencies: - '@serwist/build': 9.5.4(browserslist@4.28.1)(typescript@5.9.3) - '@serwist/utils': 9.5.4(browserslist@4.28.1) - '@serwist/window': 9.5.4(browserslist@4.28.1)(typescript@5.9.3) - '@swc/core': 1.15.11(@swc/helpers@0.5.18) - browserslist: 4.28.1 + '@serwist/build': 9.5.0(typescript@5.9.3) + '@serwist/utils': 9.5.0 + '@serwist/window': 9.5.0(typescript@5.9.3) + '@swc/core': 1.15.8(@swc/helpers@0.5.18) + esbuild-wasm: 0.27.2 kolorist: 1.8.0 next: 16.1.5(@babel/core@7.28.6)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.93.2) react: 19.2.4 semver: 7.7.3 - serwist: 9.5.4(browserslist@4.28.1)(typescript@5.9.3) - zod: 4.3.6 + serwist: 9.5.0(typescript@5.9.3) + zod: 4.3.5 optionalDependencies: - esbuild: 0.27.2 - esbuild-wasm: 0.27.2 typescript: 5.9.3 transitivePeerDependencies: - '@swc/helpers' - '@serwist/utils@9.5.4(browserslist@4.28.1)': - optionalDependencies: - browserslist: 4.28.1 + '@serwist/utils@9.5.0': {} - '@serwist/window@9.5.4(browserslist@4.28.1)(typescript@5.9.3)': + '@serwist/window@9.5.0(typescript@5.9.3)': dependencies: '@types/trusted-types': 2.0.7 - serwist: 9.5.4(browserslist@4.28.1)(typescript@5.9.3) + serwist: 9.5.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - transitivePeerDependencies: - - browserslist '@sindresorhus/base62@1.0.0': {} @@ -10024,51 +10004,51 @@ snapshots: '@svgdotjs/svg.js@3.2.5': {} - '@swc/core-darwin-arm64@1.15.11': + '@swc/core-darwin-arm64@1.15.8': optional: true - '@swc/core-darwin-x64@1.15.11': + '@swc/core-darwin-x64@1.15.8': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.11': + '@swc/core-linux-arm-gnueabihf@1.15.8': optional: true - '@swc/core-linux-arm64-gnu@1.15.11': + '@swc/core-linux-arm64-gnu@1.15.8': optional: true - '@swc/core-linux-arm64-musl@1.15.11': + '@swc/core-linux-arm64-musl@1.15.8': optional: true - '@swc/core-linux-x64-gnu@1.15.11': + '@swc/core-linux-x64-gnu@1.15.8': optional: true - '@swc/core-linux-x64-musl@1.15.11': + '@swc/core-linux-x64-musl@1.15.8': optional: true - '@swc/core-win32-arm64-msvc@1.15.11': + '@swc/core-win32-arm64-msvc@1.15.8': optional: true - '@swc/core-win32-ia32-msvc@1.15.11': + '@swc/core-win32-ia32-msvc@1.15.8': optional: true - '@swc/core-win32-x64-msvc@1.15.11': + '@swc/core-win32-x64-msvc@1.15.8': optional: true - '@swc/core@1.15.11(@swc/helpers@0.5.18)': + '@swc/core@1.15.8(@swc/helpers@0.5.18)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.25 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.11 - '@swc/core-darwin-x64': 1.15.11 - '@swc/core-linux-arm-gnueabihf': 1.15.11 - '@swc/core-linux-arm64-gnu': 1.15.11 - '@swc/core-linux-arm64-musl': 1.15.11 - '@swc/core-linux-x64-gnu': 1.15.11 - '@swc/core-linux-x64-musl': 1.15.11 - '@swc/core-win32-arm64-msvc': 1.15.11 - '@swc/core-win32-ia32-msvc': 1.15.11 - '@swc/core-win32-x64-msvc': 1.15.11 + '@swc/core-darwin-arm64': 1.15.8 + '@swc/core-darwin-x64': 1.15.8 + '@swc/core-linux-arm-gnueabihf': 1.15.8 + '@swc/core-linux-arm64-gnu': 1.15.8 + '@swc/core-linux-arm64-musl': 1.15.8 + '@swc/core-linux-x64-gnu': 1.15.8 + '@swc/core-linux-x64-musl': 1.15.8 + '@swc/core-win32-arm64-msvc': 1.15.8 + '@swc/core-win32-ia32-msvc': 1.15.8 + '@swc/core-win32-x64-msvc': 1.15.8 '@swc/helpers': 0.5.18 '@swc/counter@0.1.3': {} @@ -11880,8 +11860,7 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 - esbuild-wasm@0.27.2: - optional: true + esbuild-wasm@0.27.2: {} esbuild@0.27.2: optionalDependencies: @@ -14831,14 +14810,12 @@ snapshots: server-only@0.0.1: {} - serwist@9.5.4(browserslist@4.28.1)(typescript@5.9.3): + serwist@9.5.0(typescript@5.9.3): dependencies: - '@serwist/utils': 9.5.4(browserslist@4.28.1) + '@serwist/utils': 9.5.0 idb: 8.0.3 optionalDependencies: typescript: 5.9.3 - transitivePeerDependencies: - - browserslist sharp@0.33.5: dependencies: @@ -15781,6 +15758,8 @@ snapshots: zod@3.25.76: {} + zod@4.3.5: {} + zod@4.3.6: {} zrender@5.6.1: