feat: add polyfills option to auto-imports

This commit is contained in:
wattanx 2024-12-22 22:49:29 +09:00
parent f86d749077
commit 9fa3380af7
5 changed files with 66 additions and 25 deletions

View File

@ -9,28 +9,31 @@ import escapeRE from 'escape-string-regexp'
import { lookupNodeModuleSubpath, parseNodeModulePath } from 'mlly'
import { isDirectory } from '../utils'
import { TransformPlugin } from './transform'
import { defaultPresets } from './presets'
import { defaultPresets, appCompatPresets } from './presets'
export default defineNuxtModule<Partial<ImportsOptions>>({
meta: {
name: 'nuxt:imports',
configKey: 'imports',
},
defaults: nuxt => ({
autoImport: true,
scan: true,
presets: defaultPresets,
global: false,
imports: [],
dirs: [],
transform: {
include: [
new RegExp('^' + escapeRE(nuxt.options.buildDir)),
],
exclude: undefined,
},
virtualImports: ['#imports'],
}),
defaults: nuxt => {
return {
autoImport: true,
scan: true,
presets: nuxt.options.imports.polyfills ? [...defaultPresets, ...appCompatPresets] : defaultPresets,
global: false,
imports: [],
dirs: [],
transform: {
include: [
new RegExp('^' + escapeRE(nuxt.options.buildDir)),
],
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[]

View File

@ -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',
@ -256,6 +248,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,

View File

@ -32,4 +32,10 @@ export interface ImportsOptions extends UnimportOptions {
exclude?: RegExp[]
include?: RegExp[]
}
/**
* Add polyfills for setInterval, requestIdleCallback, and others
* @default true
*/
polyfills?: boolean
}

View File

@ -1,4 +1,4 @@
import { describe, expect, it } from 'vitest'
import { describe, expect, it, vi } from 'vitest'
import type { ComponentOptions } from 'vue'
import { Suspense, defineComponent, h, toDisplayString, useAttrs } from 'vue'
import { mountSuspended } from '@nuxt/test-utils/runtime'
@ -65,3 +65,29 @@ describe('client page', () => {
expect(wrapper.find('#fallback').exists()).toBe(false)
})
})
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()
})
})

View File

@ -21,6 +21,9 @@ export default defineVitestConfig({
experimental: {
appManifest: process.env.TEST_MANIFEST !== 'manifest-off',
},
imports: {
polyfills: false,
},
},
},
},