diff --git a/Jenkinsfile b/Jenkinsfile index ec10c15..68b531d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -3,6 +3,9 @@ pipeline { registry = "trance0/notenextra" version = "1.1" NODE_OPTIONS = "--max-old-space-size=8192" + // NEXT_SEARCH_ALGOLIA_APP_ID = "${NEXT_SEARCH_ALGOLIA_APP_ID}" + // NEXT_SEARCH_ALGOLIA_API_KEY = "${NEXT_SEARCH_ALGOLIA_API_KEY}" + // NEXT_SEARCH_ALGOLIA_INDEX_NAME = "${NEXT_SEARCH_ALGOLIA_INDEX_NAME}" } agent any diff --git a/app/layout.tsx b/app/layout.tsx index c8870eb..252442f 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -6,6 +6,7 @@ import 'nextra-theme-docs/style.css' import { SpeedInsights } from "@vercel/speed-insights/next" import { Analytics } from "@vercel/analytics/react" import 'katex/dist/katex.min.css' +import AlgoliaSearch from '../components/docsearch' export const metadata = { metadataBase: new URL('https://notenextra.trance-0.com'), @@ -80,6 +81,8 @@ export default async function RootLayout({ children }) { docsRepositoryBase="https://github.com/Trance-0/NoteNextra/tree/main" sidebar={{ defaultMenuCollapseLevel: 1 }} pageMap={pageMap} + // TODO: fix algolia search + // search={} > {children} {/* SpeedInsights in vercel */} diff --git a/components/docsearch.tsx b/components/docsearch.tsx new file mode 100644 index 0000000..ae95a40 --- /dev/null +++ b/components/docsearch.tsx @@ -0,0 +1,18 @@ +'use client' +// sample code from https://docsearch.algolia.com/docs/docsearch + +import { DocSearch } from '@docsearch/react'; + +import '@docsearch/css'; + +function AlgoliaSearch() { + return ( + + ); +} + +export default AlgoliaSearch; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a04b488..183239b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "packages": { "": { "dependencies": { + "@docsearch/react": "^4.0.0-beta.2", "@next/bundle-analyzer": "^15.3.5", "@vercel/analytics": "^1.5.0", "@vercel/speed-insights": "^1.2.0", @@ -23,6 +24,288 @@ "@types/react": "19.1.8" } }, + "node_modules/@ai-sdk/provider": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", + "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", + "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@ai-sdk/react": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz", + "integrity": "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "2.2.8", + "@ai-sdk/ui-utils": "1.2.11", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/ui-utils": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", + "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.34.0.tgz", + "integrity": "sha512-d6ardhDtQsnMpyr/rPrS3YuIE9NYpY4rftkC7Ap9tyuhZ/+V3E/LH+9uEewPguKzVqduApdwJzYq2k+vAXVEbQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0", + "@algolia/requester-browser-xhr": "5.34.0", + "@algolia/requester-fetch": "5.34.0", + "@algolia/requester-node-http": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.34.0.tgz", + "integrity": "sha512-WXIByjHNA106JO1Dj6b4viSX/yMN3oIB4qXr2MmyEmNq0MgfuPfPw8ayLRIZPa9Dp27hvM3G8MWJ4RG978HYFw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0", + "@algolia/requester-browser-xhr": "5.34.0", + "@algolia/requester-fetch": "5.34.0", + "@algolia/requester-node-http": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.34.0.tgz", + "integrity": "sha512-JeN1XJLZIkkv6yK0KT93CIXXk+cDPUGNg5xeH4fN9ZykYFDWYRyqgaDo+qvg4RXC3WWkdQ+hogQuuCk4Y3Eotw==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.34.0.tgz", + "integrity": "sha512-gdFlcQa+TWXJUsihHDlreFWniKPFIQ15i5oynCY4m9K3DCex5g5cVj9VG4Hsquxf2t6Y0yv8w6MvVTGDO8oRLw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0", + "@algolia/requester-browser-xhr": "5.34.0", + "@algolia/requester-fetch": "5.34.0", + "@algolia/requester-node-http": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.34.0.tgz", + "integrity": "sha512-g91NHhIZDkh1IUeNtsUd8V/ZxuBc2ByOfDqhCkoQY3Z/mZszhpn3Czn6AR5pE81fx793vMaiOZvQVB5QttArkQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0", + "@algolia/requester-browser-xhr": "5.34.0", + "@algolia/requester-fetch": "5.34.0", + "@algolia/requester-node-http": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.34.0.tgz", + "integrity": "sha512-cvRApDfFrlJ3Vcn37U4Nd/7S6T8cx7FW3mVLJPqkkzixv8DQ/yV+x4VLirxOtGDdq3KohcIbIGWbg1QuyOZRvQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0", + "@algolia/requester-browser-xhr": "5.34.0", + "@algolia/requester-fetch": "5.34.0", + "@algolia/requester-node-http": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.34.0.tgz", + "integrity": "sha512-m9tK4IqJmn+flEPRtuxuHgiHmrKV0su5fuVwVpq8/es4DMjWMgX1a7Lg1PktvO8AbKaTp9kTtBAPnwXpuCwmEg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0", + "@algolia/requester-browser-xhr": "5.34.0", + "@algolia/requester-fetch": "5.34.0", + "@algolia/requester-node-http": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.34.0.tgz", + "integrity": "sha512-2rxy4XoeRtIpzxEh5u5UgDC5HY4XbNdjzNgFx1eDrfFkSHpEVjirtLhISMy2N5uSFqYu1uUby5/NC1Soq8J7iw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0", + "@algolia/requester-browser-xhr": "5.34.0", + "@algolia/requester-fetch": "5.34.0", + "@algolia/requester-node-http": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.34.0.tgz", + "integrity": "sha512-OJiDhlJX8ZdWAndc50Z6aUEW/YmnhFK2ul3rahMw5/c9Damh7+oY9SufoK2LimJejy+65Qka06YPG29v2G/vww==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0", + "@algolia/requester-browser-xhr": "5.34.0", + "@algolia/requester-fetch": "5.34.0", + "@algolia/requester-node-http": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.34.0.tgz", + "integrity": "sha512-fzNQZAdVxu/Gnbavy8KW5gurApwdYcPW6+pjO7Pw8V5drCR3eSqnOxSvp79rhscDX8ezwqMqqK4F3Hsq+KpRzg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0", + "@algolia/requester-browser-xhr": "5.34.0", + "@algolia/requester-fetch": "5.34.0", + "@algolia/requester-node-http": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.34.0.tgz", + "integrity": "sha512-gEI0xjzA/xvMpEdYmgQnf6AQKllhgKRtnEWmwDrnct+YPIruEHlx1dd7nRJTy/33MiYcCxkB4khXpNrHuqgp3Q==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.34.0.tgz", + "integrity": "sha512-5SwGOttpbACT4jXzfSJ3mnTcF46SVNSnZ1JjxC3qBa3qKi4U0CJGzuVVy3L798u8dG5H0SZ2MAB5v7180Gnqew==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.34.0.tgz", + "integrity": "sha512-409XlyIyEXrxyGjWxd0q5RASizHSRVUU0AXPCEdqnbcGEzbCgL1n7oYI8YxzE/RqZLha+PNwWCcTVn7EE5tyyQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@antfu/install-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", @@ -105,6 +388,45 @@ "node": ">=10.0.0" } }, + "node_modules/@docsearch/css": { + "version": "4.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.0.0-beta.2.tgz", + "integrity": "sha512-BQFu7UXjuj9xBwuHCQH1Sbr1MPdwtn3+9uNqMprGOjS4TNGEP0/x9Okp7Omz7M2/3OrrhHT5PbKMV9FTfp5aUw==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.0.0-beta.2.tgz", + "integrity": "sha512-lInIY6wmJDyB04gRjPKPqRTgp29MSsQzDAIMRk/mtkIHbSRL6Rmd3G5jqW/MX+84fZVuq9vhWLz52SjvAsNJ5Q==", + "license": "MIT", + "dependencies": { + "@ai-sdk/react": "^1.2.12", + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/css": "4.0.0-beta.2", + "algoliasearch": "^5.28.0", + "marked": "^15.0.12" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, "node_modules/@emnapi/runtime": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", @@ -1881,6 +2203,30 @@ "node": ">=0.4.0" } }, + "node_modules/algoliasearch": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.34.0.tgz", + "integrity": "sha512-wioVnf/8uuG8Bmywhk5qKIQ3wzCCtmdvicPRb0fa3kKYGGoewfgDqLEaET1MV2NbTc3WGpPv+AgauLVBp1nB9A==", + "license": "MIT", + "dependencies": { + "@algolia/client-abtesting": "5.34.0", + "@algolia/client-analytics": "5.34.0", + "@algolia/client-common": "5.34.0", + "@algolia/client-insights": "5.34.0", + "@algolia/client-personalization": "5.34.0", + "@algolia/client-query-suggestions": "5.34.0", + "@algolia/client-search": "5.34.0", + "@algolia/ingestion": "1.34.0", + "@algolia/monitoring": "1.34.0", + "@algolia/recommend": "5.34.0", + "@algolia/requester-browser-xhr": "5.34.0", + "@algolia/requester-fetch": "5.34.0", + "@algolia/requester-node-http": "5.34.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -3682,6 +4028,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, "node_modules/katex": { "version": "0.16.22", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", @@ -6102,6 +6454,19 @@ "compute-scroll-into-view": "^3.0.2" } }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" + }, "node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -6374,6 +6739,19 @@ "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", "license": "MIT" }, + "node_modules/swr": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.4.tgz", + "integrity": "sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/system-architecture": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", @@ -6392,6 +6770,18 @@ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", "license": "MIT" }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tinyexec": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", @@ -6918,6 +7308,15 @@ "url": "https://github.com/sponsors/colinhacks" } }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, "node_modules/zod-validation-error": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.5.2.tgz", diff --git a/package.json b/package.json index 5d82549..bf20f2e 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "start": "next start" }, "dependencies": { + "@docsearch/react": "^4.0.0-beta.2", "@next/bundle-analyzer": "^15.3.5", "@vercel/analytics": "^1.5.0", "@vercel/speed-insights": "^1.2.0",