test(vue-app): add template compiler helper (#6299)

This commit is contained in:
Pim 2019-08-25 14:31:17 +02:00 committed by Xin Du (Clark)
parent facc056e66
commit 3eb1710b6d
3 changed files with 77 additions and 7 deletions

View File

@ -213,6 +213,10 @@ export default class Builder {
return `${path}/**/*.{${this.supportedExtensions.join(',')}}` return `${path}/**/*.{${this.supportedExtensions.join(',')}}`
} }
createTemplateContext () {
return new TemplateContext(this, this.options)
}
async generateRoutesAndFiles () { async generateRoutesAndFiles () {
consola.debug('Generating nuxt files') consola.debug('Generating nuxt files')
@ -223,7 +227,7 @@ export default class Builder {
// Plugins // Plugins
this.plugins = Array.from(this.normalizePlugins()) this.plugins = Array.from(this.normalizePlugins())
const templateContext = new TemplateContext(this, this.options) const templateContext = this.createTemplateContext()
await Promise.all([ await Promise.all([
this.resolveLayouts(templateContext), this.resolveLayouts(templateContext),
@ -527,6 +531,7 @@ export default class Builder {
// Render template to dst // Render template to dst
const fileContent = await fsExtra.readFile(src, 'utf8') const fileContent = await fsExtra.readFile(src, 'utf8')
let content let content
try { try {
const templateFunction = template(fileContent, templateOptions) const templateFunction = template(fileContent, templateOptions)

View File

@ -1,3 +1,71 @@
import path from 'path'
import { remove } from 'fs-extra'
import consola from 'consola'
import { getNuxtConfig, Nuxt, Builder } from '../../../../test/utils'
const rootDir = path.resolve(__dirname, '..')
export async function compileTemplate (template, destination, options = {}) {
if (arguments.length < 3) {
options = destination || {}
destination = undefined
}
const config = getNuxtConfig(options)
config.rootDir = rootDir
config.dev = false
config.test = false
config.server = false
const nuxt = new Nuxt(config)
const builder = new Builder(nuxt)
const templateContext = builder.createTemplateContext()
const multipleTemplates = Array.isArray(template)
if (!multipleTemplates) {
template = [template]
}
templateContext.templateFiles = template.map((template) => {
if (typeof template === 'string') {
return {
src: path.resolve(rootDir, '../template', template),
dst: path.join(rootDir, '.nuxt', path.basename(template)),
custom: false
}
}
return {
src: path.resolve(rootDir, '../template', template.src),
dst: path.join(rootDir, '.nuxt', template.dst),
custom: template.custom
}
})
try {
// clear all destinations
await Promise.all(templateContext.templateFiles.map(({ dst }) => remove(dst)))
await builder.compileTemplates(templateContext)
if (multipleTemplates) {
return templateContext.templateFiles.map(template => template.dst)
}
const [template] = templateContext.templateFiles
return template.dst
} catch (err) {
consola.error(`Could not compile template`, err.message, template)
return false
}
}
export function importComponent (componentPath) {
return import(componentPath).then(m => m.default || m)
}
export const vmTick = (vm) => { export const vmTick = (vm) => {
return new Promise((resolve) => { return new Promise((resolve) => {
vm.$nextTick(resolve) vm.$nextTick(resolve)

View File

@ -1,11 +1,9 @@
/** /**
* @jest-environment jsdom * @jest-environment jsdom
*/ */
import { resolve } from 'path'
import { mount, createLocalVue } from '@vue/test-utils' import { mount, createLocalVue } from '@vue/test-utils'
import { renderToString } from '@vue/server-test-utils' import { renderToString } from '@vue/server-test-utils'
import { loadFixture } from '../../../test/utils' import { compileTemplate, importComponent, vmTick } from './__utils__'
import { vmTick } from './__utils__'
jest.useFakeTimers() jest.useFakeTimers()
@ -14,11 +12,10 @@ describe('nuxt-loading', () => {
let Component let Component
beforeAll(async () => { beforeAll(async () => {
const config = await loadFixture('basic') const compiledTemplate = await compileTemplate('components/nuxt-loading.vue')
const componentDir = resolve(config.rootDir, '.nuxt/components') Component = await importComponent(compiledTemplate)
localVue = createLocalVue() localVue = createLocalVue()
Component = (await import(resolve(componentDir, 'nuxt-loading.vue'))).default
}) })
afterEach(() => jest.clearAllTimers()) afterEach(() => jest.clearAllTimers())