From a6e20eff2907f862d590bfe39530e1611e2ed4ef Mon Sep 17 00:00:00 2001 From: tobinio Date: Sun, 20 Jul 2025 13:21:04 +0200 Subject: [PATCH] use @nuxt/scripts instead of deprecated nuxt-umami --- .zed/settings.json | 4 +--- app/composables/useStatData.ts | 10 ---------- app/composables/useTracking.ts | 20 ++++++++++++++++++++ app/pages/charts.vue | 2 ++ app/pages/index.vue | 2 ++ bun.lock | 12 +++++++----- nuxt.config.ts | 10 ++++------ package.json | 2 +- server/routes/tracking.js.ts | 7 +++++++ 9 files changed, 44 insertions(+), 25 deletions(-) create mode 100644 app/composables/useTracking.ts create mode 100644 server/routes/tracking.js.ts diff --git a/.zed/settings.json b/.zed/settings.json index 6355582..c4d66d0 100644 --- a/.zed/settings.json +++ b/.zed/settings.json @@ -2,11 +2,9 @@ "languages": { "JavaScript": { "formatter": { "language_server": { "name": "biome" } } }, "TypeScript": { "formatter": { "language_server": { "name": "biome" } } }, - "JSX": { "formatter": { "language_server": { "name": "biome" } } }, "TSX": { "formatter": { "language_server": { "name": "biome" } } }, "JSON": { "formatter": { "language_server": { "name": "biome" } } }, "JSONC": { "formatter": { "language_server": { "name": "biome" } } }, - "CSS": { "formatter": { "language_server": { "name": "biome" } } }, - "GraphQL": { "formatter": { "language_server": { "name": "biome" } } } + "CSS": { "formatter": { "language_server": { "name": "biome" } } } } } diff --git a/app/composables/useStatData.ts b/app/composables/useStatData.ts index a2466b5..405e095 100644 --- a/app/composables/useStatData.ts +++ b/app/composables/useStatData.ts @@ -5,16 +5,6 @@ export function useStatData( // biome-ignore lint: can be any params: Record, ) { - watch( - () => Object.values(params).map((ref) => ref.value), - () => { - const unwrapped = Object.fromEntries( - Object.entries(params).map(([key, ref]) => [key, ref.value]), - ); - umTrackEvent("statsFilterChanged", unwrapped); - }, - ); - const url = computed(() => { if (isGlobalStats.value) { return "/api/stats/time/global"; diff --git a/app/composables/useTracking.ts b/app/composables/useTracking.ts new file mode 100644 index 0000000..37cf887 --- /dev/null +++ b/app/composables/useTracking.ts @@ -0,0 +1,20 @@ +let global_proxy: ReturnType | undefined; + +export function useTracking() { + const config = useRuntimeConfig(); + + if (global_proxy) { + return { proxy: global_proxy.proxy }; + } + + const umami = useScriptUmamiAnalytics({ + websiteId: config.public.umamiID as string, + + scriptInput: { + src: "/tracking.js", + }, + }); + + global_proxy = umami; + return { proxy: umami.proxy }; +} diff --git a/app/pages/charts.vue b/app/pages/charts.vue index 45275d8..9637d96 100644 --- a/app/pages/charts.vue +++ b/app/pages/charts.vue @@ -5,6 +5,8 @@ useHead({ title: title, }); +useTracking(); + const projectType = useFilterItem("projectType", "mod"); const stat = useFilterItem("stat", "count"); diff --git a/app/pages/index.vue b/app/pages/index.vue index 1c25860..5f44b66 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -3,6 +3,8 @@ useHead({ title: "Modrinth Statistics", }); +useTracking(); + const { data } = useFetch("/api/stats/global"); diff --git a/bun.lock b/bun.lock index 7196020..3dc28d6 100644 --- a/bun.lock +++ b/bun.lock @@ -9,7 +9,6 @@ "consola": "^3.4.2", "mongodb": "^6.17.0", "nuxt": "^4.0.0", - "nuxt-umami": "^3.2.0", "vue": "^3.5.17", "vue-chartjs": "^5.3.2", "vue-router": "^4.5.1", @@ -23,6 +22,7 @@ "@iconify-json/mdi": "^1.2.3", "@iconify-json/ph": "^1.2.2", "@nuxt/icon": "^1.15.0", + "@nuxt/scripts": "^0.11.10", "@nuxtjs/tailwindcss": "^6.14.0", "@vueuse/nuxt": "^13.5.0", "vue-tsc": "^3.0.1", @@ -272,6 +272,8 @@ "@nuxt/schema": ["@nuxt/schema@4.0.0", "", { "dependencies": { "@vue/shared": "^3.5.17", "consola": "^3.4.2", "defu": "^6.1.4", "pathe": "^2.0.3", "std-env": "^3.9.0" } }, "sha512-I1ygEGxGUxBBrwlGMJFCWye7rMQbnyGuuW97aM0X2IncsCE3/y2gIsrn0TaJglg5rAR8KM3kHLHDMUVb+IOM7A=="], + "@nuxt/scripts": ["@nuxt/scripts@0.11.10", "", { "dependencies": { "@nuxt/kit": "^4.0.0", "@vueuse/core": "^13.5.0", "consola": "^3.4.2", "defu": "^6.1.4", "h3": "^1.15.3", "magic-string": "^0.30.17", "ofetch": "^1.4.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.2.0", "sirv": "^3.0.1", "std-env": "^3.9.0", "ufo": "^1.6.1", "unplugin": "^2.3.5", "unstorage": "^1.16.1", "valibot": "^1.1.0" }, "peerDependencies": { "@stripe/stripe-js": "^7.0.0", "@types/google.maps": "^3.58.1", "@types/vimeo__player": "^2.18.3", "@types/youtube": "^0.1.0", "@unhead/vue": "^2.0.3" }, "optionalPeers": ["@stripe/stripe-js", "@types/google.maps", "@types/vimeo__player", "@types/youtube"] }, "sha512-w6CQcUSuRfCr/HYxOL3u2ztDvMgIHYPQj9EGTAxtxIT4EbDavjooHOEv7mwOeOjWFGRUlhrdNTc1bTV9ndwfww=="], + "@nuxt/telemetry": ["@nuxt/telemetry@2.6.6", "", { "dependencies": { "@nuxt/kit": "^3.15.4", "citty": "^0.1.6", "consola": "^3.4.2", "destr": "^2.0.3", "dotenv": "^16.4.7", "git-url-parse": "^16.0.1", "is-docker": "^3.0.0", "ofetch": "^1.4.1", "package-manager-detector": "^1.1.0", "pathe": "^2.0.3", "rc9": "^2.1.2", "std-env": "^3.8.1" }, "bin": { "nuxt-telemetry": "bin/nuxt-telemetry.mjs" } }, "sha512-Zh4HJLjzvm3Cq9w6sfzIFyH9ozK5ePYVfCUzzUQNiZojFsI2k1QkSBrVI9BGc6ArKXj/O6rkI6w7qQ+ouL8Cag=="], "@nuxt/vite-builder": ["@nuxt/vite-builder@4.0.0", "", { "dependencies": { "@nuxt/kit": "4.0.0", "@rollup/plugin-replace": "^6.0.2", "@vitejs/plugin-vue": "^6.0.0", "@vitejs/plugin-vue-jsx": "^5.0.1", "autoprefixer": "^10.4.21", "consola": "^3.4.2", "cssnano": "^7.1.0", "defu": "^6.1.4", "esbuild": "^0.25.6", "escape-string-regexp": "^5.0.0", "exsolve": "^1.0.7", "get-port-please": "^3.2.0", "h3": "^1.15.3", "jiti": "^2.4.2", "knitwork": "^1.2.0", "magic-string": "^0.30.17", "mlly": "^1.7.4", "mocked-exports": "^0.1.1", "nitropack": "2.12.0", "pathe": "^2.0.3", "pkg-types": "^2.2.0", "postcss": "^8.5.6", "rollup-plugin-visualizer": "^6.0.3", "std-env": "^3.9.0", "ufo": "^1.6.1", "unenv": "^2.0.0-rc.18", "vite": "^7.0.4", "vite-node": "^3.2.4", "vite-plugin-checker": "^0.10.0", "vue-bundle-renderer": "^2.1.1" }, "peerDependencies": { "vue": "^3.3.4" } }, "sha512-bg+t5CsHoVlyezx1L/3H/0DVi04HOnD80hwlQK8+AeFO6HpyqC9lg1+HCFgNWpgiA9k8j5T6y1Pt1rmIoB4L8A=="], @@ -1284,8 +1286,6 @@ "nuxt-site-config-kit": ["nuxt-site-config-kit@3.2.2", "", { "dependencies": { "@nuxt/kit": "^3.17.5", "pkg-types": "^2.1.0", "site-config-stack": "3.2.2", "std-env": "^3.9.0", "ufo": "^1.6.1" } }, "sha512-SmTBVm6JQd5zHBy04/qn0gWo3rg1HTRGT/H91hxk/o+mDB3ll+TkzpZekD46RUBO/AD02ArLG5n2ndu6zhWsHA=="], - "nuxt-umami": ["nuxt-umami@3.2.0", "", { "dependencies": { "@nuxt/kit": "^3.15.4", "request-ip": "^3.3.0" } }, "sha512-fqX5tX+2P/5J0fES3C7ykJP6H4bcP8fJzYZP7UcIW0ibwuLRbBzTRDdCd7gEkaXB0nABpSfKlCVInhMcIs07GA=="], - "nypm": ["nypm@0.6.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "pathe": "^2.0.3", "pkg-types": "^2.0.0", "tinyexec": "^0.3.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], @@ -1506,8 +1506,6 @@ "replace-in-file": ["replace-in-file@6.3.5", "", { "dependencies": { "chalk": "^4.1.2", "glob": "^7.2.0", "yargs": "^17.2.1" }, "bin": { "replace-in-file": "bin/cli.js" } }, "sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg=="], - "request-ip": ["request-ip@3.3.0", "", {}, "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "require-package-name": ["require-package-name@2.0.1", "", {}, "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q=="], @@ -1744,6 +1742,8 @@ "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + "valibot": ["valibot@1.1.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw=="], + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], @@ -1856,6 +1856,8 @@ "@netlify/zip-it-and-ship-it/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], + "@nuxt/scripts/@nuxt/kit": ["@nuxt/kit@4.0.0", "", { "dependencies": { "c12": "^3.1.0", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.7", "ignore": "^7.0.5", "jiti": "^2.4.2", "klona": "^2.0.6", "mlly": "^1.7.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.2.0", "scule": "^1.3.0", "semver": "^7.7.2", "std-env": "^3.9.0", "tinyglobby": "^0.2.14", "ufo": "^1.6.1", "unctx": "^2.4.1", "unimport": "^5.1.0", "untyped": "^2.0.0" } }, "sha512-/7ECqFBfoU8TZNCmdbz63WBemSISZ4wIKeh27ptQrjdnhF2NPcXFISRolS84+BBeGOUwmen3BYU/hSCje223mA=="], + "@nuxt/vite-builder/@nuxt/kit": ["@nuxt/kit@4.0.0", "", { "dependencies": { "c12": "^3.1.0", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.7", "ignore": "^7.0.5", "jiti": "^2.4.2", "klona": "^2.0.6", "mlly": "^1.7.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.2.0", "scule": "^1.3.0", "semver": "^7.7.2", "std-env": "^3.9.0", "tinyglobby": "^0.2.14", "ufo": "^1.6.1", "unctx": "^2.4.1", "unimport": "^5.1.0", "untyped": "^2.0.0" } }, "sha512-/7ECqFBfoU8TZNCmdbz63WBemSISZ4wIKeh27ptQrjdnhF2NPcXFISRolS84+BBeGOUwmen3BYU/hSCje223mA=="], "@parcel/watcher-wasm/napi-wasm": ["napi-wasm@1.1.3", "", { "bundled": true }, "sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg=="], diff --git a/nuxt.config.ts b/nuxt.config.ts index 05277ad..267305e 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -31,11 +31,6 @@ export default defineNuxtConfig({ future: { compatibilityVersion: 4, }, - umami: { - autoTrack: true, - ignoreLocalhost: true, - proxy: "cloak", - }, app: { head: { link: [ @@ -59,6 +54,9 @@ export default defineNuxtConfig({ databaseName: "", connectionString: "", }, + public: { + umamiID: "", + }, }, nitro: { preset: "bun", @@ -80,7 +78,7 @@ export default defineNuxtConfig({ "@nuxtjs/tailwindcss", "@vueuse/nuxt", "@nuxtjs/sitemap", - "nuxt-umami", + "@nuxt/scripts", ], compatibilityDate: "2025-07-16", }); diff --git a/package.json b/package.json index 10166a7..3ae0810 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "consola": "^3.4.2", "mongodb": "^6.17.0", "nuxt": "^4.0.0", - "nuxt-umami": "^3.2.0", "vue": "^3.5.17", "vue-chartjs": "^5.3.2", "vue-router": "^4.5.1" @@ -35,6 +34,7 @@ "@iconify-json/mdi": "^1.2.3", "@iconify-json/ph": "^1.2.2", "@nuxt/icon": "^1.15.0", + "@nuxt/scripts": "^0.11.10", "@nuxtjs/tailwindcss": "^6.14.0", "@vueuse/nuxt": "^13.5.0", "vue-tsc": "^3.0.1" diff --git a/server/routes/tracking.js.ts b/server/routes/tracking.js.ts new file mode 100644 index 0000000..22e35ad --- /dev/null +++ b/server/routes/tracking.js.ts @@ -0,0 +1,7 @@ +export default defineEventHandler(async (event): Promise => { + const scriptText = await fetch("https://cloud.umami.is/script.js"); + + setHeader(event, "Content-Type", "application/javascript"); + + return await scriptText.text(); +}); -- 2.51.2