/**
* Common functions and utilities for tasks related to package.json
*
* @module
*/
import Joi from 'joi'
import { InvalidParameter } from './index.js'
/**
* Joi schema for validating dependency map.
*
* @type {Joi}
*/
const isDependencyMap = Joi.object()
.pattern(
/./,
// This accepts a semver range, a URL, and many other possible values.
Joi.string().min(1).required(),
)
.default({})
/**
* Joi schema for validating package json object.
* Checks if the object has all the dependency types and the dependency types are valid.
*
* @type {Joi}
*/
const isPackageJsonWithDependencies = Joi.object({
dependencies: isDependencyMap,
devDependencies: isDependencyMap,
peerDependencies: isDependencyMap,
optionalDependencies: isDependencyMap,
}).required()
/**
* Determines the dependency version based on the dependency type.
*
* @param {object} attrs - Refer to individual attributes
* @param {string} attrs.kind - Wanted dependency type, defaults to prod
* @param {string} attrs.wantedDependency - Name of the wanted dependency
* @param {object} attrs.dependencies - Map of dependencies
* @param {object} attrs.devDependencies - Map of dev dependencies
* @param {object} attrs.peerDependencies - Map of peer dependencies
* @param {object} attrs.optionalDependencies - Map of optional dependencies
* @throws {string} - Error message if unknown dependency type provided
* @throws {InvalidParameter} - Error if wanted dependency is not present
* @returns {string} Semver range of the wanted dependency (eg. ~2.1.6 or >=3.0.0 or <4.0.0)
*/
function getDependencyVersion({
kind = 'prod',
wantedDependency,
dependencies,
devDependencies,
peerDependencies,
optionalDependencies,
}) {
const dependencyMaps = {
peer: peerDependencies,
optional: optionalDependencies,
dev: devDependencies,
prod: dependencies,
}
if (!(kind in dependencyMaps)) {
throw Error(`Not very kind: ${kind}`)
}
const range = dependencyMaps[kind][wantedDependency]
if (range === undefined) {
throw new InvalidParameter({
prettyMessage: `${kind} dependency not found`,
})
}
return range
}
export { isDependencyMap, isPackageJsonWithDependencies, getDependencyVersion }