From 90d8518c84f6ba78d69bb5e1844afd50069327f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Fri, 19 Jan 2024 23:38:15 +0100 Subject: [PATCH] feat(nuxt): throw error if `setInterval` is used on server (#25259) --- packages/nuxt/src/app/compat/interval.ts | 14 ++++++++++++++ packages/nuxt/src/app/composables/ssr.ts | 2 +- packages/nuxt/src/imports/presets.ts | 4 ++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 packages/nuxt/src/app/compat/interval.ts diff --git a/packages/nuxt/src/app/compat/interval.ts b/packages/nuxt/src/app/compat/interval.ts new file mode 100644 index 0000000000..74adf6c39c --- /dev/null +++ b/packages/nuxt/src/app/compat/interval.ts @@ -0,0 +1,14 @@ +import { createError } from '../composables/error' + +const intervalError = '[nuxt] `setInterval` should not be used on the server. Consider wrapping it with an `onNuxtReady`, `onBeforeMount` or `onMounted` lifecycle hook, or ensure you only call it in the browser by checking `import.meta.client`.' + +export const setInterval = import.meta.client ? window.setInterval : () => { + if (import.meta.dev) { + throw createError({ + statusCode: 500, + message: intervalError + }) + } + + console.error(intervalError) +} diff --git a/packages/nuxt/src/app/composables/ssr.ts b/packages/nuxt/src/app/composables/ssr.ts index 398138660f..29c720d9b5 100644 --- a/packages/nuxt/src/app/composables/ssr.ts +++ b/packages/nuxt/src/app/composables/ssr.ts @@ -29,7 +29,7 @@ export function useRequestHeaders (include?: any[]) { } /** @since 3.9.0 */ -export function useRequestHeader(header: string) { +export function useRequestHeader (header: string) { if (import.meta.client) { return undefined } const event = useRequestEvent() return event ? getRequestHeader(event, header) : undefined diff --git a/packages/nuxt/src/imports/presets.ts b/packages/nuxt/src/imports/presets.ts index 2296d8610b..8259fa6020 100644 --- a/packages/nuxt/src/imports/presets.ts +++ b/packages/nuxt/src/imports/presets.ts @@ -25,6 +25,10 @@ const granularAppPresets: InlinePreset[] = [ imports: ['requestIdleCallback', 'cancelIdleCallback'], from: '#app/compat/idle-callback' }, + { + imports: ['setInterval'], + from: '#app/compat/interval' + }, { imports: ['useAppConfig', 'updateAppConfig'], from: '#app/config'