Nuxt/packages/builder/test/builder.plugin.test.js

146 lines
4.8 KiB
JavaScript
Raw Normal View History

import Glob from 'glob'
import consola from 'consola'
import { isIndexFileAndFolder } from '@nuxt/utils'
import Builder from '../src/builder'
import { createNuxt } from './__utils__'
jest.mock('glob')
jest.mock('pify', () => fn => fn)
jest.mock('hash-sum', () => src => `hash(${src})`)
jest.mock('@nuxt/utils')
jest.mock('../src/ignore')
describe('builder: builder plugins', () => {
beforeEach(() => {
jest.clearAllMocks()
})
test('should normalize plugins', () => {
const nuxt = createNuxt()
nuxt.options.plugins = [
'/var/nuxt/plugins/test.js',
{ src: '/var/nuxt/plugins/test.server', mode: 'server' },
{ src: '/var/nuxt/plugins/test.client', ssr: false }
]
const builder = new Builder(nuxt, {})
const plugins = builder.normalizePlugins()
expect(plugins).toEqual([
{
mode: 'all',
name: 'nuxt_plugin_test_hash(/var/nuxt/plugins/test.js)',
src: 'resolveAlias(/var/nuxt/plugins/test.js)'
},
{
mode: 'server',
name: 'nuxt_plugin_test_hash(/var/nuxt/plugins/test.server)',
src: 'resolveAlias(/var/nuxt/plugins/test.server)'
},
{
mode: 'client',
name: 'nuxt_plugin_test_hash(/var/nuxt/plugins/test.client)',
src: 'resolveAlias(/var/nuxt/plugins/test.client)'
}
])
})
test('should warning and fallback invalid mode when normalize plugins', () => {
const nuxt = createNuxt()
nuxt.options.plugins = [
{ src: '/var/nuxt/plugins/test', mode: 'abc' }
]
const builder = new Builder(nuxt, {})
const plugins = builder.normalizePlugins()
expect(plugins).toEqual([
{
mode: 'all',
name: 'nuxt_plugin_test_hash(/var/nuxt/plugins/test)',
src: 'resolveAlias(/var/nuxt/plugins/test)'
}
])
expect(consola.warn).toBeCalledTimes(1)
expect(consola.warn).toBeCalledWith("Invalid plugin mode (server/client/all): 'abc'. Falling back to 'all'")
})
test('should resolve plugins', async () => {
const nuxt = createNuxt()
const builder = new Builder(nuxt, {})
builder.plugins = [
{ src: '/var/nuxt/plugins/test.js', mode: 'all' },
{ src: '/var/nuxt/plugins/test.client', mode: 'client' },
{ src: '/var/nuxt/plugins/test.server', mode: 'server' }
]
builder.relativeToBuild = jest.fn(src => `relative(${src})`)
for (let step = 0; step < builder.plugins.length; step++) {
Glob.mockImplementationOnce(src => [`${src.replace(/\{.*\}/, '')}.js`])
}
await builder.resolvePlugins()
expect(Glob).toBeCalledTimes(3)
expect(Glob).nthCalledWith(1, '/var/nuxt/plugins/test.js{?(.+([^.])),/index.+([^.])}')
expect(Glob).nthCalledWith(2, '/var/nuxt/plugins/test.client{?(.+([^.])),/index.+([^.])}')
expect(Glob).nthCalledWith(3, '/var/nuxt/plugins/test.server{?(.+([^.])),/index.+([^.])}')
expect(builder.plugins).toEqual([
{ mode: 'all', src: 'relative(/var/nuxt/plugins/test.js)' },
{ mode: 'client', src: 'relative(/var/nuxt/plugins/test.client)' },
{ mode: 'server', src: 'relative(/var/nuxt/plugins/test.server)' }
])
})
test('should throw error if plugin no existed', () => {
const nuxt = createNuxt()
const builder = new Builder(nuxt, {})
builder.plugins = [
{ src: '/var/nuxt/plugins/test.js', mode: 'all' }
]
Glob.mockImplementationOnce(() => [])
expect(builder.resolvePlugins()).rejects.toThrow('Plugin not found: /var/nuxt/plugins/test.js')
})
test('should warn if there are multiple files and not index', async () => {
const nuxt = createNuxt()
const builder = new Builder(nuxt, {})
builder.plugins = [
{ src: '/var/nuxt/plugins/test', mode: 'all' }
]
builder.relativeToBuild = jest.fn(src => `relative(${src})`)
Glob.mockImplementationOnce(src => [`${src}.js`, `${src}.ts`])
isIndexFileAndFolder.mockReturnValueOnce(false)
await builder.resolvePlugins()
expect(builder.plugins).toEqual([
{ mode: 'all', src: 'relative(/var/nuxt/plugins/test)' }
])
})
test('should detect plugin mode for client/server plugins', async () => {
const nuxt = createNuxt()
const builder = new Builder(nuxt, {})
builder.plugins = [
{ src: '/var/nuxt/plugins/test.js', mode: 'all' },
{ src: '/var/nuxt/plugins/test.client', mode: 'all' },
{ src: '/var/nuxt/plugins/test.server', mode: 'all' }
]
builder.relativeToBuild = jest.fn(src => `relative(${src})`)
for (let step = 0; step < builder.plugins.length; step++) {
Glob.mockImplementationOnce(src => [`${src.replace(/\{.*\}/, '')}.js`])
}
await builder.resolvePlugins()
expect(builder.plugins).toEqual([
{ mode: 'all', src: 'relative(/var/nuxt/plugins/test.js)' },
{ mode: 'client', src: 'relative(/var/nuxt/plugins/test.client)' },
{ mode: 'server', src: 'relative(/var/nuxt/plugins/test.server)' }
])
})
})