From bfdcabb9a68df3e4e6ff21759b41608a882df3ed Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 28 Aug 2026 18:48:00 +0000 Subject: [PATCH] Add Vercel Web Analytics to the marketing site Hook the official @vercel/analytics React component into the Vite landing entry so page views on ulpaso.app can be counted. The Tauri app stays unchanged. Co-authored-by: Minkyu Lee --- website/package-lock.json | 46 +++++++++++++++++++++++++++-- website/package.json | 1 + website/src/main.jsx | 2 ++ website/tests/sites-worker.test.mjs | 8 +++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/website/package-lock.json b/website/package-lock.json index f6346a1..74d69f5 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -9,12 +9,12 @@ "version": "0.0.0", "dependencies": { "@tabler/icons-react": "^3.46.0", + "@vercel/analytics": "2.0.1", "@vitejs/plugin-react": "5.0.4", "react": "19.2.0", "react-dom": "19.2.0", "vite": "6.4.2" - }, - "devDependencies": {} + } }, "node_modules/@babel/code-frame": { "version": "7.29.7", @@ -1144,6 +1144,48 @@ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "license": "MIT" }, + "node_modules/@vercel/analytics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-2.0.1.tgz", + "integrity": "sha512-MTQG6V9qQrt1tsDeF+2Uoo5aPjqbVPys1xvnIftXSJYG2SrwXRHnqEvVoYID7BTruDz4lCd2Z7rM1BdkUehk2g==", + "license": "MIT", + "peerDependencies": { + "@remix-run/react": "^2", + "@sveltejs/kit": "^1 || ^2", + "next": ">= 13", + "nuxt": ">= 3", + "react": "^18 || ^19 || ^19.0.0-rc", + "svelte": ">= 4", + "vue": "^3", + "vue-router": "^4" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "nuxt": { + "optional": true + }, + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, "node_modules/@vitejs/plugin-react": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.4.tgz", diff --git a/website/package.json b/website/package.json index 93b0f1c..8bb91f3 100644 --- a/website/package.json +++ b/website/package.json @@ -12,6 +12,7 @@ }, "dependencies": { "@tabler/icons-react": "^3.46.0", + "@vercel/analytics": "2.0.1", "@vitejs/plugin-react": "5.0.4", "react": "19.2.0", "react-dom": "19.2.0", diff --git a/website/src/main.jsx b/website/src/main.jsx index f718e37..3265865 100644 --- a/website/src/main.jsx +++ b/website/src/main.jsx @@ -1,5 +1,6 @@ import React from "react"; import { createRoot } from "react-dom/client"; +import { Analytics } from "@vercel/analytics/react"; import { App } from "./App.jsx"; import { I18nProvider } from "./I18n.jsx"; import "./styles.css"; @@ -8,6 +9,7 @@ createRoot(document.getElementById("root")).render( + , ); diff --git a/website/tests/sites-worker.test.mjs b/website/tests/sites-worker.test.mjs index 6498550..d3df074 100644 --- a/website/tests/sites-worker.test.mjs +++ b/website/tests/sites-worker.test.mjs @@ -129,6 +129,14 @@ test("ships complete share metadata for every public page", async () => { } }); +test("includes the Vercel Web Analytics beacon in the client bundle", async () => { + const html = await readFile(new URL("../dist/client/index.html", import.meta.url), "utf8"); + const script = html.match(/src="(\/assets\/index-[^"]+\.js)"/); + assert.ok(script, "client bundle script tag"); + const js = await readFile(new URL(`../dist/client${script[1]}`, import.meta.url), "utf8"); + assert.ok(js.includes("/_vercel/insights/script.js")); +}); + test("ships the exact 1200 by 630 social card and crawler files", async () => { const png = await readFile(new URL("../dist/client/og.png", import.meta.url)); assert.equal(png.subarray(1, 4).toString(), "PNG");