From fcb13fc43dc0cbc497f297608f74d52688bbaf74 Mon Sep 17 00:00:00 2001 From: lprnmns Date: Sun, 30 Aug 2026 03:06:51 +0300 Subject: [PATCH 1/2] fix: preserve hyphenated anonymous plugin names Signed-off-by: lprnmns --- lib/getPluginName.js | 8 +++++--- test/extractPluginName.test.js | 7 ++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/getPluginName.js b/lib/getPluginName.js index 6197890..96dfd7c 100644 --- a/lib/getPluginName.js +++ b/lib/getPluginName.js @@ -1,7 +1,6 @@ 'use strict' const fpStackTracePattern = /at\s(?:.*\.)?plugin\s.*\n\s*(.*)/ -const fileNamePattern = /(\w*(\.\w*)*)\..*/ module.exports = function getPluginName (fn) { if (fn.name.length > 0) return fn.name @@ -19,7 +18,10 @@ module.exports = function getPluginName (fn) { function extractPluginName (stack) { const m = stack.match(fpStackTracePattern) - // get last section of path and match for filename - return m ? m[1].split(/[/\\]/).slice(-1)[0].match(fileNamePattern)[1] : 'anonymous' + if (!m) return 'anonymous' + + // get last section of path and remove the location suffix and extension + const fileName = m[1].split(/[/\\]/).slice(-1)[0] + return fileName.replace(/:\d+:\d+\)?$/, '').replace(/\.[^.]+$/, '') } module.exports.extractPluginName = extractPluginName diff --git a/test/extractPluginName.test.js b/test/extractPluginName.test.js index 23097e6..8e1bec5 100644 --- a/test/extractPluginName.test.js +++ b/test/extractPluginName.test.js @@ -39,11 +39,16 @@ at TAP.process (/home/leonardo/desktop/fastify-plugin/node_modules/tap/lib/test. at TAP.sub (/home/leonardo/desktop/fastify-plugin/node_modules/tap/lib/test.js:185:10) at TAP.test (/home/leonardo/desktop/fastify-plugin/node_modules/tap/lib/test.js:209:17)` +const hyphenatedStack = `Error: anonymous function +at plugin (/home/leonardo/desktop/fastify-plugin/index.js:24:20) +at Test.test (/home/leonardo/desktop/fastify-plugin/test/my-plugin.js:9:14)` + const anonymousStack = 'Unable to parse this' test('extractPluginName tests', (t) => { - t.plan(3) + t.plan(4) t.assert.strictEqual(extractPluginName(winStack), 'hello.test') t.assert.strictEqual(extractPluginName(nixStack), 'this.is.a.test') + t.assert.strictEqual(extractPluginName(hyphenatedStack), 'my-plugin') t.assert.strictEqual(extractPluginName(anonymousStack), 'anonymous') }) From 565190e057a15804e956c4b803cba86b9ff4efb6 Mon Sep 17 00:00:00 2001 From: lprnmns Date: Fri, 11 Sep 2026 19:26:48 +0300 Subject: [PATCH 2/2] style: hoist plugin location pattern Signed-off-by: lprnmns --- lib/getPluginName.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/getPluginName.js b/lib/getPluginName.js index 9bbed9a..1490b50 100644 --- a/lib/getPluginName.js +++ b/lib/getPluginName.js @@ -3,6 +3,7 @@ const { basename, extname } = require('node:path') const FP_STACK_TRACE_REG = /at\s(?:.*\.)?plugin\s.*\n\s*(.*)/ +const LOCATION_REG = /:\d+:\d+\)?$/ module.exports = function getPluginName (fn) { if (fn.name.length > 0) return fn.name @@ -22,7 +23,7 @@ function extractPluginName (stack) { if (!m) return 'anonymous' - const fileName = basename(m[1].replaceAll('\\', '/')).replace(/:\d+:\d+\)?$/, '') + const fileName = basename(m[1].replaceAll('\\', '/')).replace(LOCATION_REG, '') return basename(fileName, extname(fileName)) } module.exports.extractPluginName = extractPluginName