You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
1.9 KiB
86 lines
1.9 KiB
'use strict'
|
|
|
|
const extractPluginName = require('./stackParser')
|
|
|
|
let count = 0
|
|
|
|
function plugin (fn, options = {}) {
|
|
let autoName = false
|
|
|
|
if (typeof fn.default !== 'undefined') {
|
|
// Support for 'export default' behaviour in transpiled ECMAScript module
|
|
fn = fn.default
|
|
}
|
|
|
|
if (typeof fn !== 'function') {
|
|
throw new TypeError(
|
|
`fastify-plugin expects a function, instead got a '${typeof fn}'`
|
|
)
|
|
}
|
|
|
|
fn[Symbol.for('skip-override')] = true
|
|
|
|
const pluginName = (options && options.name) || checkName(fn)
|
|
|
|
if (typeof options === 'string') {
|
|
options = {
|
|
fastify: options
|
|
}
|
|
}
|
|
|
|
if (
|
|
typeof options !== 'object' ||
|
|
Array.isArray(options) ||
|
|
options === null
|
|
) {
|
|
throw new TypeError('The options object should be an object')
|
|
}
|
|
|
|
if (options.fastify !== undefined && typeof options.fastify !== 'string') {
|
|
throw new TypeError(`fastify-plugin expects a version string, instead got '${typeof options.fastify}'`)
|
|
}
|
|
|
|
if (!options.name) {
|
|
autoName = true
|
|
options.name = pluginName + '-auto-' + count++
|
|
}
|
|
|
|
fn[Symbol.for('fastify.display-name')] = options.name
|
|
fn[Symbol.for('plugin-meta')] = options
|
|
|
|
// Faux modules support
|
|
if (!fn.default) {
|
|
fn.default = fn
|
|
}
|
|
|
|
// TypeScript support for named imports
|
|
// See https://github.com/fastify/fastify/issues/2404 for more details
|
|
// The type definitions would have to be update to match this.
|
|
const camelCase = toCamelCase(options.name)
|
|
if (!autoName && !fn[camelCase]) {
|
|
fn[camelCase] = fn
|
|
}
|
|
|
|
return fn
|
|
}
|
|
|
|
function checkName (fn) {
|
|
if (fn.name.length > 0) return fn.name
|
|
|
|
try {
|
|
throw new Error('anonymous function')
|
|
} catch (e) {
|
|
return extractPluginName(e.stack)
|
|
}
|
|
}
|
|
|
|
function toCamelCase (name) {
|
|
const newName = name.replace(/-(.)/g, function (match, g1) {
|
|
return g1.toUpperCase()
|
|
})
|
|
return newName
|
|
}
|
|
|
|
plugin.default = plugin
|
|
module.exports = plugin
|