From f83a3e024a2d554795a6294f747a1f7b05e82553 Mon Sep 17 00:00:00 2001 From: Arya Mirani Date: Thu, 23 Jul 2026 10:00:23 +0530 Subject: [PATCH] Fix view engine resolution for view names ending in a dot When a view name ends in a dot (e.g. 'index.'), path.extname returns '.', causing mod to evaluate to an empty string ('' '') and throwing an opaque TypeError [ERR_INVALID_ARG_VALUE] when require('') is called inside View constructor. This change treats '.' as an unprovided extension when engines['.'] is not explicitly registered, allowing view engine fallback to defaultEngine or returning a clean view lookup error. Fixes #7350 --- lib/view.js | 4 ++-- test/app.render.js | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/view.js b/lib/view.js index d66b4a2d89c..0dbe6a5cc8c 100644 --- a/lib/view.js +++ b/lib/view.js @@ -57,13 +57,13 @@ function View(name, options) { this.name = name; this.root = opts.root; - if (!this.ext && !this.defaultEngine) { + if ((!this.ext || (this.ext === '.' && !opts.engines[this.ext])) && !this.defaultEngine) { throw new Error('No default engine was specified and no extension was provided.'); } var fileName = name; - if (!this.ext) { + if (!this.ext || (this.ext === '.' && !opts.engines[this.ext])) { // get extension from default engine name this.ext = this.defaultEngine[0] !== '.' ? '.' + this.defaultEngine diff --git a/test/app.render.js b/test/app.render.js index bd65ce1035b..770970aeb2d 100644 --- a/test/app.render.js +++ b/test/app.render.js @@ -90,6 +90,18 @@ describe('app', function(){ done(); }); }) + + it('should provide a helpful error when view name ends in a dot', function(done){ + var app = createApp(); + + app.set('views', path.join(__dirname, 'fixtures')) + app.set('view engine', 'tmpl'); + app.render('rawr.', function (err) { + assert.ok(err) + assert.equal(err.message, 'Failed to lookup view "rawr." in views directory "' + path.join(__dirname, 'fixtures') + '"') + done(); + }); + }) }) describe('when an error occurs', function(){