"use strict";
|
var __assign = (this && this.__assign) || function () {
|
__assign = Object.assign || function(t) {
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
s = arguments[i];
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
t[p] = s[p];
|
}
|
return t;
|
};
|
return __assign.apply(this, arguments);
|
};
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
};
|
Object.defineProperty(exports, "__esModule", { value: true });
|
exports.optionalRequireCwd = exports.optionalRequire = exports.makeOptionalRequire = exports.tryResolve = exports.tryRequire = exports.setDefaultLog = void 0;
|
var assert_1 = __importDefault(require("assert"));
|
var require_at_1 = __importDefault(require("require-at"));
|
/* eslint-disable max-params, complexity, no-eval */
|
// `require` from this module's context
|
// Using `eval` to avoid tripping bundlers like webpack
|
var xrequire = eval("require");
|
// Copied from https://github.com/yarnpkg/berry/blob/d5454007c9c76becfa97b36a92de299a3694afd5/packages/yarnpkg-pnp/sources/loader/makeApi.ts#L27
|
// Splits a require request into its components, or return null if the request is a file path
|
var pnpDependencyNameRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/;
|
/**
|
* Change a module name request into a Yarn Berry PnP dependency name,
|
* since the dependency name is what will be included in the error message.
|
* For example, `optionalRequire('my-package/package.json')` will print a message like
|
* `Your application tried to access my-package,` without the `/package.json` at the end of it.
|
* This function grabs the dependency name only, or returns `null` if it can't find it.
|
* @param {string} name Requested name
|
* @returns {string} Dependency name
|
*/
|
function getPnpDependencyName(name) {
|
var dependencyNameMatch = name.match(pnpDependencyNameRegExp);
|
if (!dependencyNameMatch)
|
return null;
|
return dependencyNameMatch[1];
|
}
|
/**
|
* Check if an error from require is really due to the module not found,
|
* and not because the module itself trying to require another module
|
* that's not found.
|
*
|
* @param err - the error
|
* @param name - name of the module being required
|
* @returns true or false
|
*/
|
function findModuleNotFound(err, name) {
|
// Check the first line of the error message
|
var msg = err.message.split("\n")[0];
|
/* istanbul ignore if */
|
if (!msg) {
|
return false;
|
}
|
// Check for "Cannot find module 'foo'"
|
if (msg.includes("'" + name + "'")) {
|
return true;
|
}
|
var pnpDependencyName = getPnpDependencyName(name);
|
if (pnpDependencyName) {
|
return (
|
// Check for "Your application tried to access foo (a peer dependency) ..." (Yarn Berry PnP)
|
// https://github.com/yarnpkg/berry/blob/e81dc0d29bb2f41818d9c5c1c74bab1406fb979b/packages/yarnpkg-pnp/sources/loader/makeApi.ts#L680
|
msg.includes(" " + pnpDependencyName + " ") ||
|
// Check for "Your application tried to access foo. While ..." (Yarn Berry PnP)
|
// https://github.com/yarnpkg/berry/blob/e81dc0d29bb2f41818d9c5c1c74bab1406fb979b/packages/yarnpkg-pnp/sources/loader/makeApi.ts#L704
|
msg.includes(" " + pnpDependencyName + ". ") ||
|
// Check for "Your application tried to access foo, but ..." (Yarn Berry PnP)
|
// https://github.com/yarnpkg/berry/blob/e81dc0d29bb2f41818d9c5c1c74bab1406fb979b/packages/yarnpkg-pnp/sources/loader/makeApi.ts#L718
|
msg.includes(" " + pnpDependencyName + ", "));
|
}
|
return false;
|
}
|
/**
|
* Default log function
|
*
|
* @param message - message to log
|
* @param path - path of the module to require
|
*/
|
function defaultLog(message, path) {
|
console.log("Just FYI: " + message + "; Path \"" + path + "\"");
|
}
|
var __defaultLog = defaultLog;
|
function setDefaultLog(log) {
|
__defaultLog = log;
|
}
|
exports.setDefaultLog = setDefaultLog;
|
function _getOptions(optsOrMsg, requireFunction, log) {
|
if (requireFunction === void 0) { requireFunction = xrequire; }
|
if (typeof optsOrMsg === "object") {
|
var opts = __assign({ require: requireFunction, log: log }, optsOrMsg);
|
(0, assert_1.default)(!(opts.hasOwnProperty("notFound") && opts.hasOwnProperty("default")), "optionalRequire: options set with both `notFound` and `default`");
|
return opts;
|
}
|
else {
|
return { require: requireFunction, log: log, message: optsOrMsg };
|
}
|
}
|
/**
|
* Internal optional require implementation
|
*
|
* @param path - path to module to require
|
* @param optsOrMsg - options or message to log in case module not found
|
* @returns require or resolve result
|
*/
|
function _optionalRequire(path, opts) {
|
try {
|
return opts.resolve ? opts.require.resolve(path) : opts.require(path);
|
}
|
catch (e) {
|
// exception that's not due to the module itself not found
|
if (e.code !== "MODULE_NOT_FOUND" || !findModuleNotFound(e, path)) {
|
// if the module we are requiring fail because it try to require a
|
// module that's not found, then we have to report this as failed.
|
if (typeof opts.fail === "function") {
|
return opts.fail(e);
|
}
|
throw e;
|
}
|
if (opts.message) {
|
var message = opts.message === true ? "" : opts.message + " - ";
|
var r = opts.resolve ? "resolved" : "found";
|
opts.log(message + "optional module not " + r, path);
|
}
|
if (typeof opts.notFound === "function") {
|
return opts.notFound(e);
|
}
|
return opts.default;
|
}
|
}
|
/**
|
* try to require a module with optional handling in case it's not found or fail to require
|
*
|
* @param callerRequire - `require` from caller context
|
* @param path - path to module to require
|
* @param optsOrMsg - options or message to log in case of exceptions
|
* @returns require result
|
*/
|
function tryRequire(callerRequire, path, optsOrMsg) {
|
var opts = _getOptions(optsOrMsg, callerRequire, __defaultLog);
|
opts.resolve = false;
|
return _optionalRequire(path, opts);
|
}
|
exports.tryRequire = tryRequire;
|
/**
|
* try to resolve a module with optional handling in case it's not found or fail to require
|
*
|
* @param callerRequire - `require` from caller context
|
* @param path - path to module to require
|
* @param optsOrMsg - options or message to log in case of exceptions
|
* @returns resolve result
|
*/
|
function tryResolve(callerRequire, path, optsOrMsg) {
|
var opts = _getOptions(optsOrMsg, callerRequire, __defaultLog);
|
opts.resolve = true;
|
return _optionalRequire(path, opts);
|
}
|
exports.tryResolve = tryResolve;
|
/**
|
* Make an optional require function, using the `require` from caller's context.
|
*
|
* @param callerRequire - `require` from caller's context
|
* @param log - function to log if module is not found
|
* @returns required module
|
*/
|
function makeOptionalRequire(callerRequire, log) {
|
var x = function (path, optsOrMsg) {
|
var opts = _getOptions(optsOrMsg, callerRequire, x.log);
|
return _optionalRequire(path, opts);
|
};
|
x.resolve = function (path, optsOrMsg) {
|
var opts = _getOptions(optsOrMsg, callerRequire, x.log);
|
opts.resolve = true;
|
return _optionalRequire(path, opts);
|
};
|
x.log = log || __defaultLog;
|
return x;
|
}
|
exports.makeOptionalRequire = makeOptionalRequire;
|
/**
|
* A default optionalRequire function using `require` from optional-require's context.
|
*
|
* @remarks because `require` is from optional-require's context, you won't be able to
|
* do `optionalRequire("./my-module")`.
|
*
|
* You can still override the `require` using `options.require` with the one from your
|
* calling context.
|
*
|
*/
|
exports.optionalRequire = makeOptionalRequire(xrequire);
|
/**
|
* An optionalRequire function using `require` from CWD context
|
*
|
* @remarks because `require` is from CWD context, if you do `optionalRequireCwd("./my-module")`
|
* then it will look for `my-module` in CWD.
|
*
|
* @remarks You can still override the `require` using `options.require` with the one from your
|
* calling context.
|
*/
|
exports.optionalRequireCwd = makeOptionalRequire((0, require_at_1.default)(process.cwd()));
|
//# sourceMappingURL=index.js.map
|