From 92ef65c8edfa38f6106ac8ab7d2171c0f2e73b99 Mon Sep 17 00:00:00 2001 From: pooya parsa Date: Tue, 16 Jun 2020 17:53:29 +0200 Subject: [PATCH] fix(generator): encode routes and show error summary (#7518) --- packages/generator/src/generator.js | 26 ++++++++++++------- packages/generator/test/generator.gen.test.js | 5 ---- .../generator/test/generator.route.test.js | 2 +- packages/vue-app/template/App.js | 2 +- test/fixtures/full-static/layouts/default.vue | 5 +++- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/packages/generator/src/generator.js b/packages/generator/src/generator.js index 6a67f63631..66c1b1338f 100644 --- a/packages/generator/src/generator.js +++ b/packages/generator/src/generator.js @@ -23,7 +23,6 @@ export default class Generator { this.distPath, isUrl(this.options.build.publicPath) ? '' : this.options.build.publicPath ) - this.generatedRoutes = new Set() // Shared payload this._payload = null @@ -153,9 +152,16 @@ export default class Generator { async generateRoutes (routes) { const errors = [] - this.routes = routes - // Add routes to the tracked generated routes (for crawler) - this.routes.forEach(({ route }) => this.generatedRoutes.add(route)) + this.routes = [] + this.generatedRoutes = new Set() + + routes.forEach(({ route, ...props }) => { + route = decodeURI(route) + this.routes.push({ route, ...props }) + // Add routes to the tracked generated routes (for crawler) + this.generatedRoutes.add(route) + }) + // Start generate process while (this.routes.length) { let n = 0 @@ -308,11 +314,11 @@ export default class Generator { .split('#')[0] .trim() - const href = sanitizedHref + possibleTrailingSlash + const route = decodeURI(sanitizedHref + possibleTrailingSlash) - if (href.startsWith('/') && !path.extname(href) && this.shouldGenerateRoute(href) && !this.generatedRoutes.has(href)) { - this.generatedRoutes.add(href) // add the route to the tracked list - this.routes.push({ route: href }) + if (route.startsWith('/') && !path.extname(route) && this.shouldGenerateRoute(route) && !this.generatedRoutes.has(route)) { + this.generatedRoutes.add(route) + this.routes.push({ route }) } }) } @@ -377,10 +383,10 @@ export default class Generator { await this.nuxt.callHook('export:routeCreated', { route, path: page.path, errors: pageErrors }) if (pageErrors.length) { - consola.error('Error generating ' + route) + consola.error(`Error generating route "${route}": ${pageErrors.map(e => e.error.message).join(', ')}`) errors.push(...pageErrors) } else { - consola.success('Generated ' + route) + consola.success(`Generated route "${route}"`) } return true diff --git a/packages/generator/test/generator.gen.test.js b/packages/generator/test/generator.gen.test.js index 951b7c86c7..849adf3d73 100644 --- a/packages/generator/test/generator.gen.test.js +++ b/packages/generator/test/generator.gen.test.js @@ -95,12 +95,9 @@ describe('generator: generate routes', () => { const generator = new Generator(nuxt) generator.generateRoute = jest.fn() - jest.spyOn(routes, 'splice') const errors = await generator.generateRoutes(routes) - expect(routes.splice).toBeCalledTimes(3) - expect(routes.splice).toBeCalledWith(0, 2) expect(waitFor).toBeCalledTimes(5) expect(waitFor).nthCalledWith(1, 0) expect(waitFor).nthCalledWith(2, 100) @@ -119,8 +116,6 @@ describe('generator: generate routes', () => { expect(generator._formatErrors).toBeCalledTimes(1) expect(generator._formatErrors).toBeCalledWith(errors) - - routes.splice.mockRestore() }) test('should format errors', () => { diff --git a/packages/generator/test/generator.route.test.js b/packages/generator/test/generator.route.test.js index 62f84083d5..5c8512741d 100644 --- a/packages/generator/test/generator.route.test.js +++ b/packages/generator/test/generator.route.test.js @@ -118,7 +118,7 @@ describe('generator: generate route', () => { const returned = await generator.generateRoute({ route, payload, errors }) expect(consola.error).toBeCalledTimes(1) - expect(consola.error).toBeCalledWith('Error generating /foo') + expect(consola.error).toBeCalledWith('Error generating route "/foo": render route failed') expect(errors).toEqual([{ error, route, diff --git a/packages/vue-app/template/App.js b/packages/vue-app/template/App.js index 70d680a403..c05150ed5b 100644 --- a/packages/vue-app/template/App.js +++ b/packages/vue-app/template/App.js @@ -311,7 +311,7 @@ export default { route = (route.replace(/\/+$/, '') || '/').split('?')[0] const src = urlJoin(base, staticAssetsBase, route, 'payload.js') try { - const payload = await window.__NUXT_IMPORT__(route, src) + const payload = await window.__NUXT_IMPORT__(decodeURI(route), encodeURI(src)) this.setPagePayload(payload) return payload } catch (err) { diff --git a/test/fixtures/full-static/layouts/default.vue b/test/fixtures/full-static/layouts/default.vue index 264beabaf6..fa97280737 100644 --- a/test/fixtures/full-static/layouts/default.vue +++ b/test/fixtures/full-static/layouts/default.vue @@ -10,8 +10,11 @@ Pagination + + Dynamic route 1 + - Dynamic route + Dynamic route 2