123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- const Module = require('module')
- const path = require('path')
- const semver = require('semver')
- // https://github.com/benmosher/eslint-plugin-import/pull/1591
- // https://github.com/benmosher/eslint-plugin-import/pull/1602
- // Polyfill Node's `Module.createRequireFromPath` if not present (added in Node v10.12.0)
- // Use `Module.createRequire` if available (added in Node v12.2.0)
- const createRequire = Module.createRequire || Module.createRequireFromPath || function (filename) {
- const mod = new Module(filename, null)
- mod.filename = filename
- mod.paths = Module._nodeModulePaths(path.dirname(filename))
- mod._compile(`module.exports = require;`, filename)
- return mod.exports
- }
- function resolveFallback (request, options) {
- const isMain = false
- const fakeParent = new Module('', null)
- const paths = []
- for (let i = 0; i < options.paths.length; i++) {
- const p = options.paths[i]
- fakeParent.paths = Module._nodeModulePaths(p)
- const lookupPaths = Module._resolveLookupPaths(request, fakeParent, true)
- if (!paths.includes(p)) paths.push(p)
- for (let j = 0; j < lookupPaths.length; j++) {
- if (!paths.includes(lookupPaths[j])) paths.push(lookupPaths[j])
- }
- }
- const filename = Module._findPath(request, paths, isMain)
- if (!filename) {
- const err = new Error(`Cannot find module '${request}'`)
- err.code = 'MODULE_NOT_FOUND'
- throw err
- }
- return filename
- }
- const resolve = semver.satisfies(process.version, '>=10.0.0')
- ? require.resolve
- : resolveFallback
- exports.resolveModule = function (request, context) {
- let resolvedPath
- try {
- try {
- resolvedPath = createRequire(path.resolve(context, 'package.json')).resolve(request)
- } catch (e) {
- resolvedPath = resolve(request, { paths: [context] })
- }
- } catch (e) {}
- return resolvedPath
- }
- exports.loadModule = function (request, context, force = false) {
- // createRequire doesn't work with jest mock modules
- // (which we used in migrator for inquirer, and in tests for cli-service)
- // TODO: it's supported in Jest 25
- if (process.env.VUE_CLI_TEST && (request.endsWith('migrator') || context === '/')) {
- return require(request)
- }
- try {
- return createRequire(path.resolve(context, 'package.json'))(request)
- } catch (e) {
- const resolvedPath = exports.resolveModule(request, context)
- if (resolvedPath) {
- if (force) {
- clearRequireCache(resolvedPath)
- }
- return require(resolvedPath)
- }
- }
- }
- exports.clearModule = function (request, context) {
- const resolvedPath = exports.resolveModule(request, context)
- if (resolvedPath) {
- clearRequireCache(resolvedPath)
- }
- }
- function clearRequireCache (id, map = new Map()) {
- const module = require.cache[id]
- if (module) {
- map.set(id, true)
- // Clear children modules
- module.children.forEach(child => {
- if (!map.get(child.id)) clearRequireCache(child.id, map)
- })
- delete require.cache[id]
- }
- }
|