60 lines
1.7 KiB
JavaScript
60 lines
1.7 KiB
JavaScript
'use strict'
|
|
|
|
const nodePath = require('path')
|
|
|
|
module.exports = presetLoader(require)
|
|
module.exports.presetLoader = presetLoader
|
|
|
|
function presetLoader (requireMethod) {
|
|
return path => {
|
|
let name = ''
|
|
let scope = ''
|
|
let absolutePath = ''
|
|
|
|
if (typeof path === 'string') {
|
|
name = path.toLowerCase()
|
|
if (nodePath.isAbsolute(path)) {
|
|
absolutePath = path
|
|
}
|
|
} else if (typeof path === 'object' && path.name) {
|
|
// Rather than a string preset name, options.preset can be an object
|
|
// with a "name" key indicating the preset to load; additinoal key/value
|
|
// pairs are assumed to be configuration for the preset. See the documentation
|
|
// for a given preset for configuration available.
|
|
name = path.name.toLowerCase()
|
|
if (nodePath.isAbsolute(path.name)) {
|
|
absolutePath = path.name
|
|
}
|
|
} else {
|
|
throw Error('preset must be string or object with key name')
|
|
}
|
|
|
|
if (!absolutePath) {
|
|
if (name[0] === '@') {
|
|
const parts = name.split('/')
|
|
scope = parts.shift() + '/'
|
|
name = parts.join('/')
|
|
}
|
|
|
|
if (!name.startsWith('conventional-changelog-')) {
|
|
name = `conventional-changelog-${name}`
|
|
}
|
|
}
|
|
|
|
try {
|
|
const config = requireMethod(absolutePath || `${scope}${name}`)
|
|
// rather than returning a promise, presets can return a builder function
|
|
// which accepts a config object (allowing for customization) and returns
|
|
// a promise.
|
|
if (config && !config.then && typeof path === 'object') {
|
|
return config(path)
|
|
} else {
|
|
// require returned a promise that resolves to a config object.
|
|
return config
|
|
}
|
|
} catch (_) {
|
|
throw Error('does not exist')
|
|
}
|
|
}
|
|
}
|