diff --git a/lib/builder/builder.js b/lib/builder/builder.js index cebeeb4d6d..eb891f9858 100644 --- a/lib/builder/builder.js +++ b/lib/builder/builder.js @@ -161,14 +161,18 @@ export default class Builder extends Tapable { // -- Layouts -- if (fs.existsSync(resolve(this.options.srcDir, 'layouts'))) { - const layoutsFiles = await glob('layouts/*.vue', { cwd: this.options.srcDir }) + const layoutsFiles = await glob('layouts/*.{vue,js}', { cwd: this.options.srcDir }) + let hasErrorLayout = false layoutsFiles.forEach((file) => { - let name = file.split('/').slice(-1)[0].replace('.vue', '') - if (name === 'error') return + let name = file.split('/').slice(-1)[0].replace(/\.(js|vue)$/, '') + if (name === 'error') { + hasErrorLayout = true + return + } templateVars.layouts[name] = this.relativeToBuild(this.options.srcDir, file) }) - if (layoutsFiles.includes('layouts/error.vue') && !templateVars.components.ErrorPage) { - templateVars.components.ErrorPage = this.relativeToBuild(this.options.srcDir, 'layouts/error.vue') + if (!templateVars.components.ErrorPage && hasErrorLayout) { + templateVars.components.ErrorPage = this.relativeToBuild(this.options.srcDir, 'layouts/error') } } // If no default layout, create its folder and add the default folder @@ -183,7 +187,7 @@ export default class Builder extends Tapable { // If user defined a custom method to create routes if (this._nuxtPages) { // Use nuxt.js createRoutes bases on pages/ - const files = await glob('pages/**/*.vue', { cwd: this.options.srcDir }) + const files = await glob('pages/**/*.{vue,js}', { cwd: this.options.srcDir }) templateVars.router.routes = createRoutes(files, this.options.srcDir) } else { templateVars.router.routes = this.options.build.createRoutes(this.options.srcDir) @@ -431,13 +435,13 @@ export default class Builder extends Tapable { r(this.options.srcDir, 'layouts'), r(this.options.srcDir, 'store'), r(this.options.srcDir, 'middleware'), - r(this.options.srcDir, 'layouts/*.vue'), - r(this.options.srcDir, 'layouts/**/*.vue') + r(this.options.srcDir, 'layouts/*.{vue,js}'), + r(this.options.srcDir, 'layouts/**/*.{vue,js}') ] if (this._nuxtPages) { patterns.push(r(this.options.srcDir, 'pages')) - patterns.push(r(this.options.srcDir, 'pages/*.vue')) - patterns.push(r(this.options.srcDir, 'pages/**/*.vue')) + patterns.push(r(this.options.srcDir, 'pages/*.{vue,js}')) + patterns.push(r(this.options.srcDir, 'pages/**/*.{vue,js}')) } const options = Object.assign({}, this.options.watchers.chokidar, { ignoreInitial: true diff --git a/lib/common/utils.js b/lib/common/utils.js index 7e5f846d08..e3ffa32059 100644 --- a/lib/common/utils.js +++ b/lib/common/utils.js @@ -186,7 +186,7 @@ export function cleanChildrenRoutes (routes, isChild = false) { export function createRoutes (files, srcDir) { let routes = [] files.forEach((file) => { - let keys = file.replace(/^pages/, '').replace(/\.vue$/, '').replace(/\/{2,}/g, '/').split('/').slice(1) + let keys = file.replace(/^pages/, '').replace(/\.(vue|js)$/, '').replace(/\/{2,}/g, '/').split('/').slice(1) let route = { name: '', path: '', component: r(srcDir, file) } let parent = routes keys.forEach((key, i) => { diff --git a/test/basic.test.js b/test/basic.test.js index 624916b74d..4603ee0df0 100755 --- a/test/basic.test.js +++ b/test/basic.test.js @@ -26,6 +26,11 @@ test('/stateless', async t => { t.true(html.includes('

My component!

')) }) +test('/jsfile', async t => { + const { html } = await nuxt.renderRoute('/jsfile') + t.true(html.includes('support js pages')) +}) + /* ** Example of testing via dom checking */ diff --git a/test/fixtures/basic/pages/jsfile.js b/test/fixtures/basic/pages/jsfile.js new file mode 100644 index 0000000000..05932477ab --- /dev/null +++ b/test/fixtures/basic/pages/jsfile.js @@ -0,0 +1,5 @@ +export default { + render (h) { + return h('span', ['support js pages']) + } +} diff --git a/test/fixtures/with-config/layouts/js.js b/test/fixtures/with-config/layouts/js.js new file mode 100644 index 0000000000..d1fcb2afe2 --- /dev/null +++ b/test/fixtures/with-config/layouts/js.js @@ -0,0 +1,10 @@ +export default { + render () { + return ( +
+

JS layout

+ +
+ ) + } +} diff --git a/test/fixtures/with-config/pages/js.js b/test/fixtures/with-config/pages/js.js new file mode 100644 index 0000000000..ccd1941aa4 --- /dev/null +++ b/test/fixtures/with-config/pages/js.js @@ -0,0 +1,11 @@ +export default { + layout: 'js', + render () { + return ( +
+

About JS page

+ Home page +
+ ) + } +} diff --git a/test/with-config.test.js b/test/with-config.test.js index 73ef45ef0e..0a7bcad3ec 100644 --- a/test/with-config.test.js +++ b/test/with-config.test.js @@ -57,6 +57,14 @@ test('/test/about (custom layout)', async t => { t.true(html.includes('

About page

')) }) +test('/test/js (custom js layout)', async t => { + const window = await nuxt.renderAndGetWindow(url('/test/js')) + const html = window.document.body.innerHTML + t.is(window.__NUXT__.layout, 'js') + t.true(html.includes('

JS layout

')) + t.true(html.includes('

About JS page

')) +}) + test('/test/env', async t => { const window = await nuxt.renderAndGetWindow(url('/test/env')) const html = window.document.body.innerHTML @@ -87,7 +95,7 @@ test('/test/about-bis (added with extendRoutes)', async t => { test('Check stats.json generated by build.analyze', t => { const stats = require(resolve(__dirname, 'fixtures/with-config/.nuxt/dist/stats.json')) - t.is(stats.assets.length, 27) + t.is(stats.assets.length, 31) }) test('Check /test.txt with custom serve-static options', async t => {