From bf7acd987f26401c917b1f058cb529a7ea0dd461 Mon Sep 17 00:00:00 2001 From: Valentyne Stigloher Date: Sun, 17 Mar 2024 23:02:44 +0100 Subject: [PATCH] (ts) convert used nuxt plugins --- nuxt.config.ts | 8 ++-- plugins/{axios.js => axios.ts} | 8 +++- .../{browserDetect.js => browserDetect.ts} | 8 +++- plugins/{datepicker.js => datepicker.ts} | 5 +- plugins/{track.js => track.ts} | 48 ++++++++++--------- plugins/vuejs-datepicker.d.ts | 3 ++ .../{timezone.test.js => timezone.test.ts} | 0 tsconfig.json | 3 +- 8 files changed, 51 insertions(+), 32 deletions(-) rename plugins/{axios.js => axios.ts} (65%) rename plugins/{browserDetect.js => browserDetect.ts} (60%) rename plugins/{datepicker.js => datepicker.ts} (56%) rename plugins/{track.js => track.ts} (64%) create mode 100644 plugins/vuejs-datepicker.d.ts rename test/plugins/{timezone.test.js => timezone.test.ts} (100%) diff --git a/nuxt.config.ts b/nuxt.config.ts index 4f7c3fd54..9a0e2027a 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -167,12 +167,12 @@ const nuxtConfig: NuxtConfig = { ], plugins: [ { src: '~/plugins/polyfill.ts', mode: 'client' }, - { src: '~/plugins/axios.js' }, + { src: '~/plugins/axios.ts' }, { src: '~/plugins/globals.ts' }, { src: '~/plugins/auth.ts' }, - { src: '~/plugins/datepicker.js', mode: 'client' }, - { src: '~/plugins/track.js', mode: 'client' }, - { src: '~/plugins/browserDetect.js' }, + { src: '~/plugins/datepicker.ts', mode: 'client' }, + { src: '~/plugins/track.ts', mode: 'client' }, + { src: '~/plugins/browserDetect.ts' }, ], components: true, buildModules: [ diff --git a/plugins/axios.js b/plugins/axios.ts similarity index 65% rename from plugins/axios.js rename to plugins/axios.ts index c9f318bcb..232ac382d 100644 --- a/plugins/axios.js +++ b/plugins/axios.ts @@ -1,4 +1,6 @@ -export default function ({ $axios, app }) { +import type { Plugin } from '@nuxt/types'; + +const plugin: Plugin = ({ $axios, app }) => { $axios.onRequest((config) => { const token = app.$csrfToken(); @@ -8,4 +10,6 @@ export default function ({ $axios, app }) { return config; }); -} +}; + +export default plugin; diff --git a/plugins/browserDetect.js b/plugins/browserDetect.ts similarity index 60% rename from plugins/browserDetect.js rename to plugins/browserDetect.ts index 189752e5f..312e83f3d 100644 --- a/plugins/browserDetect.js +++ b/plugins/browserDetect.ts @@ -1,9 +1,11 @@ +import type { Plugin } from '@nuxt/types'; + const SAFARI_REGEX = /^((?!chrome|android).)*safari/i; -export default ({ req }, inject) => { +const plugin: Plugin = ({ req }, inject) => { inject('isSafari', () => { if (process.server && req) { - return SAFARI_REGEX.test(req.headers['user-agent']); + return SAFARI_REGEX.test(req.headers['user-agent']!); } if (process.client) { @@ -13,3 +15,5 @@ export default ({ req }, inject) => { return false; }); }; + +export default plugin; diff --git a/plugins/datepicker.js b/plugins/datepicker.ts similarity index 56% rename from plugins/datepicker.js rename to plugins/datepicker.ts index eb095d428..545437636 100644 --- a/plugins/datepicker.js +++ b/plugins/datepicker.ts @@ -1,6 +1,9 @@ import Vue from 'vue'; import VuejsDatePicker from 'vuejs-datepicker'; +import type { Plugin } from '@nuxt/types'; -export default () => { +const plugin: Plugin = () => { Vue.component('Datepicker', VuejsDatePicker); }; + +export default plugin; diff --git a/plugins/track.js b/plugins/track.ts similarity index 64% rename from plugins/track.js rename to plugins/track.ts index d95f29aff..3053a225f 100644 --- a/plugins/track.js +++ b/plugins/track.ts @@ -1,32 +1,44 @@ import * as Sentry from '@sentry/vue'; +import type { Plugin } from '@nuxt/types'; +import type Plausible from 'plausible-tracker'; -function defaultHandler({ plausible, to }) { +interface PlausibleContext { + plausible: ReturnType; + to: URL; + from: URL; +} + +const defaultHandler = ({ plausible, to }: PlausibleContext): void => { console.debug('[analytics] Tracking default handler: %O', to); plausible.trackPageview({ url: to.toString(), }); -} -/** - * @param {(value: URL) => URL} redactor - * @param {(ctx) => void} base - * @return {(ctx) => void} - */ -function redact(redactor, base = defaultHandler) { +}; + +const redact = ( + redactor: (v: URL) => URL, + base: (ctx: PlausibleContext) => void = defaultHandler, +): (ctx: PlausibleContext) => void => { return (ctx) => base({ ...ctx, to: redactor(ctx.to), }); +}; + +interface TrackerOverride { + test(path: string): boolean; + handling(ctx: PlausibleContext): void; } const USER_AT = /^\/@.+/; const USER_SUBPAGE = /^\/(u|card)\/.*/; -const TRACKER_OVERRIDES = [ +const TRACKER_OVERRIDES: TrackerOverride[] = [ { - test(v) { + test(v: string): boolean { return USER_AT.test(v) || USER_SUBPAGE.test(v); }, - handling: redact((v) => { + handling: redact((v: URL): URL => { let pathname = v.pathname; if (USER_AT.test(pathname)) { pathname = pathname.replace(USER_AT, '/@--redacted--'); @@ -40,24 +52,16 @@ const TRACKER_OVERRIDES = [ }, ]; -export const plugin = function ({ app }) { +const plugin: Plugin = ({ app }) => { const plausible = app.$plausible; - app.router.afterEach((to, from) => { + app.router?.afterEach((to, from) => { let handler = defaultHandler; for (const trackerOverride of TRACKER_OVERRIDES) { if (!trackerOverride.test(to.fullPath)) { continue; } - - if (trackerOverride.handling === false) { - // console.debug("[analytics] Page is blocked from tracking"); - return; - } else if (typeof trackerOverride.handling === 'function') { - handler = trackerOverride.handling; - } else { - throw new Error('Tracking override handling is invalid'); - } + handler = trackerOverride.handling; break; } diff --git a/plugins/vuejs-datepicker.d.ts b/plugins/vuejs-datepicker.d.ts new file mode 100644 index 000000000..770781a6f --- /dev/null +++ b/plugins/vuejs-datepicker.d.ts @@ -0,0 +1,3 @@ +declare module 'vuejs-datepicker' { + export = unknown; +} diff --git a/test/plugins/timezone.test.js b/test/plugins/timezone.test.ts similarity index 100% rename from test/plugins/timezone.test.js rename to test/plugins/timezone.test.ts diff --git a/tsconfig.json b/tsconfig.json index 5a663e798..372b48ea6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,7 +21,8 @@ "@nuxt/typescript-build", "@nuxtjs/axios", "@nuxtjs/sentry", - "@types/node" + "@types/node", + "vue-plausible" ] }, "exclude": [