diff --git a/index.js b/index.js index 5309e27b..47cfee7e 100644 --- a/index.js +++ b/index.js @@ -26,6 +26,11 @@ const fastifyAutoload = async function autoload (fastify, options) { const pluginArray = [].concat.apply([], Object.values(pluginTree).map(o => o.plugins)) const hookArray = [].concat.apply([], Object.values(pluginTree).map(o => o.hooks)) + let rootPrefix = options.options?.prefix ?? '' + // when prefix is provided /prefix/ format + // it is not good for concat, since most folder prefix start with / + if (rootPrefix[rootPrefix.length - 1] === '/') rootPrefix = rootPrefix.slice(0, -1) + await Promise.all(pluginArray.map(({ file, type, prefix }) => { return loadPlugin({ file, type, directoryPrefix: prefix, options: opts, log: fastify.log }) .then((plugin) => { @@ -85,7 +90,7 @@ const fastifyAutoload = async function autoload (fastify, options) { } fastify.register(composedPlugin, { - prefix: options.options?.prefix ?? replaceRouteParamPattern(prefix) + prefix: rootPrefix + replaceRouteParamPattern(prefix) }) } } diff --git a/test/issues/326/test.js b/test/issues/326/test.js index 58f4f99f..ba8ab23a 100644 --- a/test/issues/326/test.js +++ b/test/issues/326/test.js @@ -62,7 +62,7 @@ app.ready(function (err) { }) app.inject({ - url: '/custom-prefix' + url: '/custom-prefix/child' }, function (err, res) { t.error(err) @@ -70,7 +70,7 @@ app.ready(function (err) { }) app.inject({ - url: '/custom-prefix/not-exists' + url: '/custom-prefix/child/not-exists' }, function (err, res) { t.error(err) t.equal(res.headers.from, 'routes-b') diff --git a/test/issues/376/routes/entity/.autohooks.js b/test/issues/376/routes/entity/.autohooks.js new file mode 100644 index 00000000..951e9583 --- /dev/null +++ b/test/issues/376/routes/entity/.autohooks.js @@ -0,0 +1,8 @@ +'use strict' + +module.exports = async function (app, opts) { + app.addHook('onRequest', async (req, reply) => { + req.hooked = req.hooked || [] + req.hooked.push('root') + }) +} diff --git a/test/issues/376/routes/entity/index.js b/test/issues/376/routes/entity/index.js new file mode 100644 index 00000000..0b14399b --- /dev/null +++ b/test/issues/376/routes/entity/index.js @@ -0,0 +1,7 @@ +'use strict' + +module.exports = async function (app, opts, next) { + app.get('/', async function (req, reply) { + reply.status(200).send({ path: req.url, hooked: req.hooked }) + }) +} diff --git a/test/issues/376/routes/index.js b/test/issues/376/routes/index.js new file mode 100644 index 00000000..51a699b4 --- /dev/null +++ b/test/issues/376/routes/index.js @@ -0,0 +1,7 @@ +'use strict' + +module.exports = async function (app, opts, next) { + app.get('/', async function (req, reply) { + reply.status(200).send({ path: req.url }) + }) +} diff --git a/test/issues/376/test.js b/test/issues/376/test.js new file mode 100644 index 00000000..d1f42b2d --- /dev/null +++ b/test/issues/376/test.js @@ -0,0 +1,58 @@ +'use strict' + +const t = require('tap') +const path = require('node:path') +const Fastify = require('fastify') +const autoLoad = require('../../../') + +t.plan(13) + +const app = Fastify() + +app.register(autoLoad, { + dir: path.join(__dirname, 'routes'), + autoHooks: true, + options: { prefix: '/api' } +}) + +app.register(autoLoad, { + dir: path.join(__dirname, 'routes'), + autoHooks: true, + options: { prefix: '/prefix/' } +}) + +app.ready(function (err) { + t.error(err) + + app.inject({ + url: '/api' + }, function (err, res) { + t.error(err) + t.equal(res.statusCode, 200) + t.same(res.json(), { path: '/api' }) + }) + + app.inject({ + url: '/api/entity' + }, function (err, res) { + t.error(err) + t.equal(res.statusCode, 200) + t.same(res.json(), { path: '/api/entity', hooked: ['root'] }) + }) + + app.inject({ + url: '/prefix' + }, function (err, res) { + t.error(err) + t.equal(res.statusCode, 200) + t.same(res.json(), { path: '/prefix' }) + }) + + app.inject({ + url: '/prefix/entity' + }, function (err, res) { + t.error(err) + t.equal(res.statusCode, 200) + t.same(res.json(), { path: '/prefix/entity', hooked: ['root'] }) + }) +})