From 33216b6e387460465b5667ffcaa089543384fb98 Mon Sep 17 00:00:00 2001 From: Vercel Date: Fri, 5 Dec 2025 00:32:50 +0000 Subject: [PATCH] Install Vercel Speed Insights for Next.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Vercel Speed Insights Integration Successfully installed and configured Vercel Speed Insights for this Next.js 16.0.7 project with App Router. ### Changes Made: 1. **Package Installation:** - Installed `@vercel/speed-insights` version 1.3.1 - Updated `package.json` with the new dependency - Updated `package-lock.json` with resolved dependencies 2. **Root Layout Integration (src/app/layout.tsx):** - Added import: `import { SpeedInsights } from "@vercel/speed-insights/next"` - Added `` component inside the `` tag, after the ThemeProvider - Placement follows Next.js App Router best practices for Next.js 13.5+ 3. **Build Artifacts:** - Updated `public/sw.js` (service worker) as a result of the production build ### Implementation Details: Since this project uses Next.js 16.0.7 with App Router (which is newer than 13.5), I used the standard Next.js integration: - Imported from `@vercel/speed-insights/next` (not React) - No need for 'use client' directive or usePathname() hook - Component automatically handles route tracking The SpeedInsights component is now positioned at the root level, ensuring it tracks all page navigations throughout the application. ### Verification: ✅ Production build completed successfully ✅ All 860 tests passed ✅ No new linting errors introduced (pre-existing linting issues remain unchanged) ✅ Lock files updated correctly The integration is complete and ready for deployment. Speed Insights will automatically collect and report performance metrics when deployed to Vercel. Co-authored-by: Vercel --- package-lock.json | 127 ++++++++++++++++++++++++++++++--------------- package.json | 1 + public/sw.js | 2 +- src/app/layout.tsx | 2 + 4 files changed, 88 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29ecdef..02f419b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@supabase/ssr": "^0.7.0", "@supabase/supabase-js": "^2.85.0", "@tailwindcss/typography": "^0.5.19", + "@vercel/speed-insights": "^1.3.1", "date-fns": "^4.1.0", "lucide-react": "^0.555.0", "next": "^16.0.7", @@ -146,7 +147,6 @@ "node_modules/@babel/core": { "version": "7.28.5", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1647,7 +1647,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -1691,7 +1690,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -3663,7 +3661,6 @@ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.85.0.tgz", "integrity": "sha512-eTu28YKZ6te7Gv9KeDIVo+2/gibYudPng6iW4NovbaAlbRfar6hb2RCdOiJ84hk8O4ERgXgqJCe9hAx5JaZW+A==", "license": "MIT", - "peer": true, "dependencies": { "@supabase/auth-js": "2.85.0", "@supabase/functions-js": "2.85.0", @@ -4085,7 +4082,6 @@ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -4220,6 +4216,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -4230,6 +4227,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -4313,7 +4311,6 @@ "node_modules/@types/react": { "version": "19.2.7", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -4322,7 +4319,6 @@ "version": "19.2.3", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -4403,7 +4399,6 @@ "version": "8.48.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.48.0", "@typescript-eslint/types": "8.48.0", @@ -4879,6 +4874,40 @@ "win32" ] }, + "node_modules/@vercel/speed-insights": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.3.1.tgz", + "integrity": "sha512-PbEr7FrMkUrGYvlcLHGkXdCkxnylCWePx7lPxxq36DNdfo9mcUjLOmqOyPDHAOgnfqgGGdmE3XI9L/4+5fr+vQ==", + "license": "Apache-2.0", + "peerDependencies": { + "@sveltejs/kit": "^1 || ^2", + "next": ">= 13", + "react": "^18 || ^19 || ^19.0.0-rc", + "svelte": ">= 4", + "vue": "^3", + "vue-router": "^4" + }, + "peerDependenciesMeta": { + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, "node_modules/@vitejs/plugin-react": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.1.tgz", @@ -5016,6 +5045,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -5025,25 +5055,29 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -5054,13 +5088,15 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -5073,6 +5109,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "license": "MIT", + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -5082,6 +5119,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -5090,13 +5128,15 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -5113,6 +5153,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -5126,6 +5167,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -5138,6 +5180,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -5152,6 +5195,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -5161,18 +5205,19 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/acorn": { "version": "8.15.0", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5185,6 +5230,7 @@ "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.13.0" }, @@ -5213,7 +5259,6 @@ "node_modules/ajv": { "version": "6.12.6", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5669,7 +5714,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -5849,6 +5893,7 @@ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.0" } @@ -6748,7 +6793,6 @@ "version": "9.39.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -6920,7 +6964,6 @@ "version": "2.32.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -7158,6 +7201,7 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.x" } @@ -7556,7 +7600,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "peer": true }, "node_modules/globals": { "version": "14.0.0", @@ -8480,7 +8525,6 @@ "integrity": "sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@acemir/cssom": "^0.9.23", "@asamuzakjp/dom-selector": "^6.7.4", @@ -8534,7 +8578,8 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-schema": { "version": "0.4.0", @@ -8903,6 +8948,7 @@ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.11.5" }, @@ -9704,6 +9750,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -9713,6 +9760,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -9791,7 +9839,8 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/next": { "version": "16.0.7", @@ -10520,7 +10569,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz", "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10530,7 +10578,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.1.tgz", "integrity": "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -10540,8 +10587,7 @@ }, "node_modules/react-is": { "version": "16.13.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/react-markdown": { "version": "10.1.0", @@ -10604,7 +10650,6 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "license": "MIT", - "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -10681,8 +10726,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -11580,8 +11624,7 @@ }, "node_modules/tailwindcss": { "version": "4.1.17", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tapable": { "version": "2.3.0", @@ -11678,7 +11721,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -11782,7 +11824,6 @@ "version": "4.0.3", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -11919,7 +11960,6 @@ "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -12029,7 +12069,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12377,7 +12416,6 @@ "integrity": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -12471,7 +12509,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12597,6 +12634,7 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "license": "MIT", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12669,6 +12707,7 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.13.0" } @@ -12695,6 +12734,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -12707,6 +12747,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -12720,6 +12761,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=4.0" } @@ -12728,13 +12770,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/webpack/node_modules/schema-utils": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", + "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -13070,7 +13114,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -13122,7 +13165,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "license": "MIT", - "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -13416,7 +13458,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 6f7f3a9..291f99f 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@supabase/ssr": "^0.7.0", "@supabase/supabase-js": "^2.85.0", "@tailwindcss/typography": "^0.5.19", + "@vercel/speed-insights": "^1.3.1", "date-fns": "^4.1.0", "lucide-react": "^0.555.0", "next": "^16.0.7", diff --git a/public/sw.js b/public/sw.js index 9209ed1..eeac2a6 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1 +1 @@ -if(!self.define){let e,a={};const s=(s,c)=>(s=new URL(s+".js",c).href,a[s]||new Promise(a=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=a,document.head.appendChild(e)}else e=s,importScripts(s),a()}).then(()=>{let e=a[s];if(!e)throw new Error(`Module ${s} didn’t register its module`);return e}));self.define=(c,n)=>{const t=e||("document"in self?document.currentScript.src:"")||location.href;if(a[t])return;let i={};const d=e=>s(e,t),r={module:{uri:t},exports:i,require:d};a[t]=Promise.all(c.map(e=>r[e]||d(e))).then(e=>(n(...e),i))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/static/chunks/244-25f05e2471582beb.js",revision:"25f05e2471582beb"},{url:"/_next/static/chunks/2619-a89a807e1dfcf7d1.js",revision:"a89a807e1dfcf7d1"},{url:"/_next/static/chunks/2944-a3f9a913d37d48b1.js",revision:"a3f9a913d37d48b1"},{url:"/_next/static/chunks/3794-b16d22429af19980.js",revision:"b16d22429af19980"},{url:"/_next/static/chunks/4086-5baffd3431ad83c2.js",revision:"5baffd3431ad83c2"},{url:"/_next/static/chunks/4bd1b696-43ba64781d20dbb7.js",revision:"43ba64781d20dbb7"},{url:"/_next/static/chunks/6043.e795870169027efe.js",revision:"e795870169027efe"},{url:"/_next/static/chunks/8956.b488bed4e1bc7f8f.js",revision:"b488bed4e1bc7f8f"},{url:"/_next/static/chunks/9080.4055cb24e5639605.js",revision:"4055cb24e5639605"},{url:"/_next/static/chunks/947-ea6e5baceae0ffdb.js",revision:"ea6e5baceae0ffdb"},{url:"/_next/static/chunks/9743-9e38b1fdd800b12b.js",revision:"9e38b1fdd800b12b"},{url:"/_next/static/chunks/9819-bed7a2b699b5c725.js",revision:"bed7a2b699b5c725"},{url:"/_next/static/chunks/9b0008ae.321fa6d65f8e1836.js",revision:"321fa6d65f8e1836"},{url:"/_next/static/chunks/app/(app)/admin/tags/page-508afe72488c0b81.js",revision:"508afe72488c0b81"},{url:"/_next/static/chunks/app/(app)/course/%5BcourseId%5D/page-010dc740a095e9ed.js",revision:"010dc740a095e9ed"},{url:"/_next/static/chunks/app/(app)/dashboard/loading-37e7e2149ddf3dca.js",revision:"37e7e2149ddf3dca"},{url:"/_next/static/chunks/app/(app)/dashboard/page-244af65c1fb140bc.js",revision:"244af65c1fb140bc"},{url:"/_next/static/chunks/app/(app)/decks/%5BdeckId%5D/add-bulk/page-cd8260a8ec706698.js",revision:"cd8260a8ec706698"},{url:"/_next/static/chunks/app/(app)/decks/%5BdeckId%5D/cards/%5BcardId%5D/edit/page-2eff717ff7c87c54.js",revision:"2eff717ff7c87c54"},{url:"/_next/static/chunks/app/(app)/decks/%5BdeckId%5D/loading-37e7e2149ddf3dca.js",revision:"37e7e2149ddf3dca"},{url:"/_next/static/chunks/app/(app)/decks/%5BdeckId%5D/page-4d47cbc099c14d69.js",revision:"4d47cbc099c14d69"},{url:"/_next/static/chunks/app/(app)/error-acb490bd2b43e8ed.js",revision:"acb490bd2b43e8ed"},{url:"/_next/static/chunks/app/(app)/layout-d9cb13d3d896771b.js",revision:"d9cb13d3d896771b"},{url:"/_next/static/chunks/app/(app)/lesson/%5BlessonId%5D/overview/page-e3cdbb68a79a6442.js",revision:"e3cdbb68a79a6442"},{url:"/_next/static/chunks/app/(app)/lesson/%5BlessonId%5D/page-2721ba103cac6f2a.js",revision:"2721ba103cac6f2a"},{url:"/_next/static/chunks/app/(app)/library/my/page-fdafc9cf1753aa55.js",revision:"fdafc9cf1753aa55"},{url:"/_next/static/chunks/app/(app)/library/page-57f35608581be540.js",revision:"57f35608581be540"},{url:"/_next/static/chunks/app/(app)/not-found-e3cdbb68a79a6442.js",revision:"e3cdbb68a79a6442"},{url:"/_next/static/chunks/app/(app)/stats/page-3d4aa8a6c60c4012.js",revision:"3d4aa8a6c60c4012"},{url:"/_next/static/chunks/app/(app)/study/%5BdeckId%5D/loading-37e7e2149ddf3dca.js",revision:"37e7e2149ddf3dca"},{url:"/_next/static/chunks/app/(app)/study/%5BdeckId%5D/page-247ca4eaed085cc2.js",revision:"247ca4eaed085cc2"},{url:"/_next/static/chunks/app/(app)/study/custom/page-3c373c8327d16d2d.js",revision:"3c373c8327d16d2d"},{url:"/_next/static/chunks/app/(app)/study/global/loading-37e7e2149ddf3dca.js",revision:"37e7e2149ddf3dca"},{url:"/_next/static/chunks/app/(app)/study/global/page-38bb6e13e1be5dfd.js",revision:"38bb6e13e1be5dfd"},{url:"/_next/static/chunks/app/(app)/study/mcq/%5BdeckId%5D/page-bcd3e5fb20a03fe8.js",revision:"bcd3e5fb20a03fe8"},{url:"/_next/static/chunks/app/(auth)/layout-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/app/(auth)/login/page-ca62f3d480319f27.js",revision:"ca62f3d480319f27"},{url:"/_next/static/chunks/app/_global-error/page-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/app/_not-found/page-53791d4aebb758cc.js",revision:"53791d4aebb758cc"},{url:"/_next/static/chunks/app/api/lesson/%5BlessonId%5D/route-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/app/auth/callback/route-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/app/global-error-67f8b36c240a27ea.js",revision:"67f8b36c240a27ea"},{url:"/_next/static/chunks/app/layout-3314b24378b77a27.js",revision:"3314b24378b77a27"},{url:"/_next/static/chunks/app/page-6bd007eb0dbcbaf0.js",revision:"6bd007eb0dbcbaf0"},{url:"/_next/static/chunks/framework-ce757b396f77691a.js",revision:"ce757b396f77691a"},{url:"/_next/static/chunks/main-app-a62e0cd8fce17020.js",revision:"a62e0cd8fce17020"},{url:"/_next/static/chunks/main-d750b3eb7b56bbee.js",revision:"d750b3eb7b56bbee"},{url:"/_next/static/chunks/next/dist/client/components/builtin/app-error-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/next/dist/client/components/builtin/forbidden-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/next/dist/client/components/builtin/not-found-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/next/dist/client/components/builtin/unauthorized-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-5abd3c1d10eac584.js",revision:"5abd3c1d10eac584"},{url:"/_next/static/css/45c4ad85d39dcf2d.css",revision:"45c4ad85d39dcf2d"},{url:"/_next/static/css/8df816e5401a2f72.css",revision:"8df816e5401a2f72"},{url:"/_next/static/media/4cf2300e9c8272f7-s.p.woff2",revision:"18bae71b1e1b2bb25321090a3b563103"},{url:"/_next/static/media/747892c23ea88013-s.woff2",revision:"a0761690ccf4441ace5cec893b82d4ab"},{url:"/_next/static/media/8d697b304b401681-s.woff2",revision:"cc728f6c0adb04da0dfcb0fc436a8ae5"},{url:"/_next/static/media/93f479601ee12b01-s.p.woff2",revision:"da83d5f06d825c5ae65b7cca706cb312"},{url:"/_next/static/media/9610d9e46709d722-s.woff2",revision:"7b7c0ef93df188a852344fc272fc096b"},{url:"/_next/static/media/ba015fad6dcf6784-s.woff2",revision:"8ea4f719af3312a055caf09f34c89a77"},{url:"/_next/static/oDMYFM2-7BdCQESuYBtMk/_buildManifest.js",revision:"2f337520095e5a3648e20f25e1229d16"},{url:"/_next/static/oDMYFM2-7BdCQESuYBtMk/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/apple-touch-icon.svg",revision:"1c3b22536a94434e2a3321165ddd959c"},{url:"/file.svg",revision:"d09f95206c3fa0bb9bd9fefabfd0ea71"},{url:"/globe.svg",revision:"2aaafa6a49b6563925fe440891e32717"},{url:"/icon-192x192.svg",revision:"04f61806c14177966c114c58054a5269"},{url:"/icon-512x512.svg",revision:"7d4b392f07b76fa8535ac143fd5075b1"},{url:"/manifest.json",revision:"efd4ce1dd74553ee738cae6451e9d1f3"},{url:"/next.svg",revision:"8e061864f388b47f33a1c3780831193e"},{url:"/vercel.svg",revision:"c0af2f507b369b085b35ef4bbe3bcf1e"},{url:"/window.svg",revision:"a2760511c65806022ad20adf74370ff3"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:a,event:s,state:c})=>a&&"opaqueredirect"===a.type?new Response(a.body,{status:200,statusText:"OK",headers:a.headers}):a}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;const a=e.pathname;return!a.startsWith("/api/auth/")&&!!a.startsWith("/api/")},new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")},new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>!(self.origin===e.origin),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")}); +if(!self.define){let e,s={};const a=(a,c)=>(a=new URL(a+".js",c).href,s[a]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=a,e.onload=s,document.head.appendChild(e)}else e=a,importScripts(a),s()}).then(()=>{let e=s[a];if(!e)throw new Error(`Module ${a} didn’t register its module`);return e}));self.define=(c,n)=>{const t=e||("document"in self?document.currentScript.src:"")||location.href;if(s[t])return;let i={};const d=e=>a(e,t),r={module:{uri:t},exports:i,require:d};s[t]=Promise.all(c.map(e=>r[e]||d(e))).then(e=>(n(...e),i))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/static/chunks/1515-30bccbac4ef4deb7.js",revision:"30bccbac4ef4deb7"},{url:"/_next/static/chunks/244-25f05e2471582beb.js",revision:"25f05e2471582beb"},{url:"/_next/static/chunks/2619-a89a807e1dfcf7d1.js",revision:"a89a807e1dfcf7d1"},{url:"/_next/static/chunks/2944-a3f9a913d37d48b1.js",revision:"a3f9a913d37d48b1"},{url:"/_next/static/chunks/3794-b16d22429af19980.js",revision:"b16d22429af19980"},{url:"/_next/static/chunks/4086-5baffd3431ad83c2.js",revision:"5baffd3431ad83c2"},{url:"/_next/static/chunks/4bd1b696-43ba64781d20dbb7.js",revision:"43ba64781d20dbb7"},{url:"/_next/static/chunks/6043.e795870169027efe.js",revision:"e795870169027efe"},{url:"/_next/static/chunks/8956.3662059d1c1552e1.js",revision:"3662059d1c1552e1"},{url:"/_next/static/chunks/9080.4055cb24e5639605.js",revision:"4055cb24e5639605"},{url:"/_next/static/chunks/9743-9e38b1fdd800b12b.js",revision:"9e38b1fdd800b12b"},{url:"/_next/static/chunks/9819-bed7a2b699b5c725.js",revision:"bed7a2b699b5c725"},{url:"/_next/static/chunks/9b0008ae.e763e12de5463d95.js",revision:"e763e12de5463d95"},{url:"/_next/static/chunks/app/(app)/admin/tags/page-be05fec35a56f36f.js",revision:"be05fec35a56f36f"},{url:"/_next/static/chunks/app/(app)/course/%5BcourseId%5D/page-aa9f551c48375cdb.js",revision:"aa9f551c48375cdb"},{url:"/_next/static/chunks/app/(app)/dashboard/loading-c6946eef3eac2ca3.js",revision:"c6946eef3eac2ca3"},{url:"/_next/static/chunks/app/(app)/dashboard/page-a3501b11fbbf805a.js",revision:"a3501b11fbbf805a"},{url:"/_next/static/chunks/app/(app)/decks/%5BdeckId%5D/add-bulk/page-0b8aa1b801fc85e0.js",revision:"0b8aa1b801fc85e0"},{url:"/_next/static/chunks/app/(app)/decks/%5BdeckId%5D/cards/%5BcardId%5D/edit/page-7d0c2683fc241594.js",revision:"7d0c2683fc241594"},{url:"/_next/static/chunks/app/(app)/decks/%5BdeckId%5D/loading-c6946eef3eac2ca3.js",revision:"c6946eef3eac2ca3"},{url:"/_next/static/chunks/app/(app)/decks/%5BdeckId%5D/page-242fdd43ea1cd908.js",revision:"242fdd43ea1cd908"},{url:"/_next/static/chunks/app/(app)/error-ba8cd01051491f33.js",revision:"ba8cd01051491f33"},{url:"/_next/static/chunks/app/(app)/layout-3ed2bd109e36dbc5.js",revision:"3ed2bd109e36dbc5"},{url:"/_next/static/chunks/app/(app)/lesson/%5BlessonId%5D/overview/page-d84d17986b89727d.js",revision:"d84d17986b89727d"},{url:"/_next/static/chunks/app/(app)/lesson/%5BlessonId%5D/page-150de2f260c7361a.js",revision:"150de2f260c7361a"},{url:"/_next/static/chunks/app/(app)/library/my/page-0fcf7c393024ddc6.js",revision:"0fcf7c393024ddc6"},{url:"/_next/static/chunks/app/(app)/library/page-0757158df5f1a8d3.js",revision:"0757158df5f1a8d3"},{url:"/_next/static/chunks/app/(app)/not-found-d84d17986b89727d.js",revision:"d84d17986b89727d"},{url:"/_next/static/chunks/app/(app)/stats/page-87b6d0ab035e087a.js",revision:"87b6d0ab035e087a"},{url:"/_next/static/chunks/app/(app)/study/%5BdeckId%5D/loading-c6946eef3eac2ca3.js",revision:"c6946eef3eac2ca3"},{url:"/_next/static/chunks/app/(app)/study/%5BdeckId%5D/page-3cfbc60ac8d70b3a.js",revision:"3cfbc60ac8d70b3a"},{url:"/_next/static/chunks/app/(app)/study/custom/page-543beedd3288bbd0.js",revision:"543beedd3288bbd0"},{url:"/_next/static/chunks/app/(app)/study/global/loading-c6946eef3eac2ca3.js",revision:"c6946eef3eac2ca3"},{url:"/_next/static/chunks/app/(app)/study/global/page-7408493842fa8424.js",revision:"7408493842fa8424"},{url:"/_next/static/chunks/app/(app)/study/mcq/%5BdeckId%5D/page-e2d87afe044f5286.js",revision:"e2d87afe044f5286"},{url:"/_next/static/chunks/app/(auth)/layout-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/app/(auth)/login/page-dbebca1334e83a3d.js",revision:"dbebca1334e83a3d"},{url:"/_next/static/chunks/app/_global-error/page-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/app/_not-found/page-b40b6fb91b693952.js",revision:"b40b6fb91b693952"},{url:"/_next/static/chunks/app/api/lesson/%5BlessonId%5D/route-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/app/auth/callback/route-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/app/global-error-77183d637bed5c11.js",revision:"77183d637bed5c11"},{url:"/_next/static/chunks/app/layout-dd1c66623e8dbe00.js",revision:"dd1c66623e8dbe00"},{url:"/_next/static/chunks/app/page-09c475520163eda8.js",revision:"09c475520163eda8"},{url:"/_next/static/chunks/framework-ce757b396f77691a.js",revision:"ce757b396f77691a"},{url:"/_next/static/chunks/main-app-04d19508e616fc12.js",revision:"04d19508e616fc12"},{url:"/_next/static/chunks/main-d750b3eb7b56bbee.js",revision:"d750b3eb7b56bbee"},{url:"/_next/static/chunks/next/dist/client/components/builtin/app-error-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/next/dist/client/components/builtin/forbidden-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/next/dist/client/components/builtin/not-found-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/next/dist/client/components/builtin/unauthorized-8c945a0598d000a7.js",revision:"8c945a0598d000a7"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-7b459cd91b08a4f9.js",revision:"7b459cd91b08a4f9"},{url:"/_next/static/css/45c4ad85d39dcf2d.css",revision:"45c4ad85d39dcf2d"},{url:"/_next/static/css/8df816e5401a2f72.css",revision:"8df816e5401a2f72"},{url:"/_next/static/media/4cf2300e9c8272f7-s.p.woff2",revision:"18bae71b1e1b2bb25321090a3b563103"},{url:"/_next/static/media/747892c23ea88013-s.woff2",revision:"a0761690ccf4441ace5cec893b82d4ab"},{url:"/_next/static/media/8d697b304b401681-s.woff2",revision:"cc728f6c0adb04da0dfcb0fc436a8ae5"},{url:"/_next/static/media/93f479601ee12b01-s.p.woff2",revision:"da83d5f06d825c5ae65b7cca706cb312"},{url:"/_next/static/media/9610d9e46709d722-s.woff2",revision:"7b7c0ef93df188a852344fc272fc096b"},{url:"/_next/static/media/ba015fad6dcf6784-s.woff2",revision:"8ea4f719af3312a055caf09f34c89a77"},{url:"/_next/static/y0ZaCF05Q5MDs3TOd4Nj8/_buildManifest.js",revision:"2f337520095e5a3648e20f25e1229d16"},{url:"/_next/static/y0ZaCF05Q5MDs3TOd4Nj8/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/apple-touch-icon.svg",revision:"1c3b22536a94434e2a3321165ddd959c"},{url:"/file.svg",revision:"d09f95206c3fa0bb9bd9fefabfd0ea71"},{url:"/globe.svg",revision:"2aaafa6a49b6563925fe440891e32717"},{url:"/icon-192x192.svg",revision:"04f61806c14177966c114c58054a5269"},{url:"/icon-512x512.svg",revision:"7d4b392f07b76fa8535ac143fd5075b1"},{url:"/manifest.json",revision:"efd4ce1dd74553ee738cae6451e9d1f3"},{url:"/next.svg",revision:"8e061864f388b47f33a1c3780831193e"},{url:"/vercel.svg",revision:"c0af2f507b369b085b35ef4bbe3bcf1e"},{url:"/window.svg",revision:"a2760511c65806022ad20adf74370ff3"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:a,state:c})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")},new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")},new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>!(self.origin===e.origin),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")}); diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 26e9529..c7f01b5 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,6 +2,7 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import { ThemeProvider } from "@/components/providers/ThemeProvider"; import { InstallBanner } from "@/components/pwa/InstallBanner"; +import { SpeedInsights } from "@vercel/speed-insights/next"; import "./globals.css"; const geistSans = Geist({ @@ -46,6 +47,7 @@ export default function RootLayout({ {children} + );