53 lines
1.9 KiB
JavaScript
53 lines
1.9 KiB
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
var isCategory = require('node-exports-info/isCategory');
|
||
|
|
var getCategoriesForRange = require('node-exports-info/getCategoriesForRange');
|
||
|
|
var $TypeError = require('es-errors/type');
|
||
|
|
|
||
|
|
var selectMostRestrictive = require('./select-most-restrictive');
|
||
|
|
|
||
|
|
// Determine the active exports category from resolve options
|
||
|
|
// Returns null if no exports resolution should be applied
|
||
|
|
// Returns 'engines' if engines: true (needs consumer package.json lookup)
|
||
|
|
// Throws TypeError if invalid options are provided
|
||
|
|
/** @type {(opts?: { exportsCategory?: import('node-exports-info/getCategory').Category, engines?: boolean | string }) => null | import('node-exports-info/getCategory').Category} */
|
||
|
|
module.exports = function getExportsCategory(opts) {
|
||
|
|
if (!opts) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
var hasCategory = typeof opts.exportsCategory !== 'undefined';
|
||
|
|
var engines = opts.engines;
|
||
|
|
var hasEngines = typeof engines !== 'undefined' && engines !== false;
|
||
|
|
|
||
|
|
if (hasCategory && hasEngines) {
|
||
|
|
throw new $TypeError('`exportsCategory` and `engines` are mutually exclusive.');
|
||
|
|
}
|
||
|
|
|
||
|
|
if (hasCategory) {
|
||
|
|
if (!isCategory(opts.exportsCategory)) {
|
||
|
|
var catError = new $TypeError('Invalid exports category: "' + opts.exportsCategory + '"');
|
||
|
|
catError.code = 'INVALID_EXPORTS_CATEGORY';
|
||
|
|
throw catError;
|
||
|
|
}
|
||
|
|
return opts.exportsCategory;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (hasEngines) {
|
||
|
|
// engines: true means read from consumer's package.json
|
||
|
|
if (engines === true) {
|
||
|
|
return 'engines';
|
||
|
|
}
|
||
|
|
|
||
|
|
// engines must be a non-empty string (semver range)
|
||
|
|
if (typeof engines !== 'string' || engines === '') {
|
||
|
|
throw new $TypeError('`engines` must be `true`, `false`, or a non-empty string semver range.');
|
||
|
|
}
|
||
|
|
|
||
|
|
var categories = getCategoriesForRange(engines);
|
||
|
|
return selectMostRestrictive(categories);
|
||
|
|
}
|
||
|
|
|
||
|
|
return null;
|
||
|
|
};
|