From 41d49732796b9842f38c085de5a2df15210b03db Mon Sep 17 00:00:00 2001 From: Ryota Watanabe <43837308+wattanx@users.noreply.github.com> Date: Sun, 9 Feb 2025 15:48:37 +0900 Subject: [PATCH] feat(nuxt): allow disabling auto-imported polyfills (#30332) --- packages/nuxt/src/imports/module.ts | 7 ++++++- packages/nuxt/src/imports/presets.ts | 19 ++++++++++-------- packages/schema/src/types/imports.ts | 6 ++++++ test/nuxt/polyfills.test.ts | 29 ++++++++++++++++++++++++++++ vitest.nuxt.config.ts | 3 +++ 5 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 test/nuxt/polyfills.test.ts diff --git a/packages/nuxt/src/imports/module.ts b/packages/nuxt/src/imports/module.ts index 1d669b2eaa..5ba65ab75b 100644 --- a/packages/nuxt/src/imports/module.ts +++ b/packages/nuxt/src/imports/module.ts @@ -9,7 +9,7 @@ import escapeRE from 'escape-string-regexp' import { lookupNodeModuleSubpath, parseNodeModulePath } from 'mlly' import { isDirectory, logger } from '../utils' import { TransformPlugin } from './transform' -import { defaultPresets } from './presets' +import { appCompatPresets, defaultPresets } from './presets' export default defineNuxtModule>({ meta: { @@ -30,11 +30,16 @@ export default defineNuxtModule>({ exclude: undefined, }, virtualImports: ['#imports'], + polyfills: true, }), async setup (options, nuxt) { // TODO: fix sharing of defaults between invocations of modules const presets = JSON.parse(JSON.stringify(options.presets)) as ImportPresetWithDeprecation[] + if (nuxt.options.imports.polyfills) { + presets.push(...appCompatPresets) + } + // Allow modules extending sources await nuxt.callHook('imports:sources', presets) diff --git a/packages/nuxt/src/imports/presets.ts b/packages/nuxt/src/imports/presets.ts index cdc55c529e..a48ca2f426 100644 --- a/packages/nuxt/src/imports/presets.ts +++ b/packages/nuxt/src/imports/presets.ts @@ -21,14 +21,6 @@ const granularAppPresets: InlinePreset[] = [ imports: ['useNuxtApp', 'tryUseNuxtApp', 'defineNuxtPlugin', 'definePayloadPlugin', 'useRuntimeConfig', 'defineAppConfig'], from: '#app/nuxt', }, - { - imports: ['requestIdleCallback', 'cancelIdleCallback'], - from: '#app/compat/idle-callback', - }, - { - imports: ['setInterval'], - from: '#app/compat/interval', - }, { imports: ['useAppConfig', 'updateAppConfig'], from: '#app/config', @@ -258,6 +250,17 @@ const vueTypesPreset = defineUnimportPreset({ ], }) +export const appCompatPresets: InlinePreset[] = [ + { + imports: ['requestIdleCallback', 'cancelIdleCallback'], + from: '#app/compat/idle-callback', + }, + { + imports: ['setInterval'], + from: '#app/compat/interval', + }, +] + export const defaultPresets: InlinePreset[] = [ ...commonPresets, ...granularAppPresets, diff --git a/packages/schema/src/types/imports.ts b/packages/schema/src/types/imports.ts index 96171ecf87..5dc26e22c4 100644 --- a/packages/schema/src/types/imports.ts +++ b/packages/schema/src/types/imports.ts @@ -32,4 +32,10 @@ export interface ImportsOptions extends UnimportOptions { exclude?: RegExp[] include?: RegExp[] } + + /** + * Add polyfills for setInterval, requestIdleCallback, and others + * @default true + */ + polyfills?: boolean } diff --git a/test/nuxt/polyfills.test.ts b/test/nuxt/polyfills.test.ts new file mode 100644 index 0000000000..6fb4b3ec75 --- /dev/null +++ b/test/nuxt/polyfills.test.ts @@ -0,0 +1,29 @@ +import { mount } from '@vue/test-utils' +import { describe, expect, it, vi } from 'vitest' +import { defineComponent, h } from 'vue' + +describe('app/compat', () => { + const Component = defineComponent({ + setup () { + const visible = ref(false) + setInterval(() => { + visible.value = true + }, 1000) + + return () => h('div', {}, visible.value ? h('span', { id: 'child' }) : {}) + }, + }) + it('setInterval is not auto-imported', async () => { + vi.useFakeTimers() + + const wrapper = mount(Component) + + vi.advanceTimersByTime(1000) + + await wrapper.vm.$nextTick() + + expect(wrapper.find('#child').exists()).toBe(true) + + vi.useRealTimers() + }) +}) diff --git a/vitest.nuxt.config.ts b/vitest.nuxt.config.ts index 31f2c9e6a2..2aeda8d9eb 100644 --- a/vitest.nuxt.config.ts +++ b/vitest.nuxt.config.ts @@ -22,6 +22,9 @@ export default defineVitestConfig({ experimental: { appManifest: process.env.TEST_MANIFEST !== 'manifest-off', }, + imports: { + polyfills: false, + }, }, }, },