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.
		
		
		
		
		
			
		
			
				
					76 lines
				
				2.8 KiB
			
		
		
			
		
	
	
					76 lines
				
				2.8 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | const assert = require("assert"); | ||
|  | 
 | ||
|  | function findModuleNotFound(err, name) { | ||
|  |   // Check the first line of the error message
 | ||
|  |   const msg = err.message.split("\n")[0]; | ||
|  |   return msg && ( | ||
|  |     // Check for "Cannot find module 'foo'"
 | ||
|  |     msg.includes(`'${name}'`) | ||
|  |     // Check for "Your application tried to access foo (a peer dependency) ..." (Yarn v2 PnP)
 | ||
|  |     // https://github.com/yarnpkg/berry/blob/e81dc0d29bb2f41818d9c5c1c74bab1406fb979b/packages/yarnpkg-pnp/sources/loader/makeApi.ts#L680
 | ||
|  |     || msg.includes(` ${name} `) | ||
|  |     // Check for "Your application tried to access foo. While ..." (Yarn v2 PnP)
 | ||
|  |     // https://github.com/yarnpkg/berry/blob/e81dc0d29bb2f41818d9c5c1c74bab1406fb979b/packages/yarnpkg-pnp/sources/loader/makeApi.ts#L704
 | ||
|  |     || msg.includes(` ${name}. `) | ||
|  |     // Check for "Your application tried to access foo, but ..." (Yarn v2 PnP)
 | ||
|  |     // https://github.com/yarnpkg/berry/blob/e81dc0d29bb2f41818d9c5c1c74bab1406fb979b/packages/yarnpkg-pnp/sources/loader/makeApi.ts#L718
 | ||
|  |     || msg.includes(` ${name}, `) | ||
|  |   ); | ||
|  | } | ||
|  | 
 | ||
|  | function _optionalRequire(callerRequire, resolve, path, message) { | ||
|  |   let opts; | ||
|  | 
 | ||
|  |   if (typeof message === "object") { | ||
|  |     opts = message; | ||
|  |     assert( | ||
|  |       !(opts.hasOwnProperty("notFound") && opts.hasOwnProperty("default")), | ||
|  |       "optionalRequire: options set with both `notFound` and `default`" | ||
|  |     ); | ||
|  |   } else { | ||
|  |     opts = { message }; | ||
|  |   } | ||
|  | 
 | ||
|  |   try { | ||
|  |     return resolve ? callerRequire.resolve(path) : callerRequire(path); | ||
|  |   } catch (e) { | ||
|  |     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) { | ||
|  |       const message = typeof opts.message === "string" ? `${opts.message} - ` : ""; | ||
|  |       const r = resolve ? "resolved" : "found"; | ||
|  |       optionalRequire.log(`${message}optional module not ${r}`, path); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (typeof opts.notFound === "function") { | ||
|  |       return opts.notFound(e); | ||
|  |     } | ||
|  | 
 | ||
|  |     return opts.default; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | const tryRequire = (callerRequire, path, message) => _optionalRequire(callerRequire, false, path, message); | ||
|  | const tryResolve = (callerRequire, path, message) => _optionalRequire(callerRequire, true, path, message); | ||
|  | 
 | ||
|  | function optionalRequire(callerRequire) { | ||
|  |   const x = (path, message) => tryRequire(callerRequire, path, message); | ||
|  |   x.resolve = (path, message) => tryResolve(callerRequire, path, message); | ||
|  |   return x; | ||
|  | } | ||
|  | 
 | ||
|  | optionalRequire.try = tryRequire; | ||
|  | optionalRequire.tryResolve = tryResolve; | ||
|  | optionalRequire.resolve = tryResolve; | ||
|  | optionalRequire.log = (message, path) => console.log(`Just FYI: ${message}; Path "${path}"`); | ||
|  | module.exports = optionalRequire; |