const path = require('path'); const rootCompiler = compiler => { while (compiler.parentCompilation) { compiler = compiler.parentCompilation.compiler; } return compiler; }; const compilerContext = (exports.compilerContext = function compilerContext( compiler, ) { return rootCompiler(compiler.compiler ? compiler.compiler : compiler).context; }); const relateNormalPath = (exports.relateNormalPath = function relateNormalPath( compiler, key, ) { if (typeof key !== 'string') { return key; } if (compilerContext(compiler) === key) { return '.'; } if (key === '') { return key; } const rel = path.relative(compilerContext(compiler), key.split('?')[0]); return [rel.replace(/\\/g, '/')].concat(key.split('?').slice(1)).join('?'); }); const relateNormalRequest = (exports.relateNormalRequest = function relateNormalRequest( compiler, key, ) { return key .split('!') .map(subkey => relateNormalPath(compiler, subkey)) .join('!'); }); const relateNormalModuleId = (exports.relateNormalModuleId = function relateNormalModuleId( compiler, id, ) { return id.substring(0, 24) + relateNormalRequest(compiler, id.substring(24)); }); const relateNormalLoaders = (exports.relateNormalLoaders = function relateNormalLoaders( compiler, loaders, ) { return loaders.map(loader => Object.assign({}, loader, { loader: relateNormalPath(compiler, loader.loader), }), ); }); const relateNormalPathArray = (exports.relateNormalPathArray = function relateNormalPathArray( compiler, paths, ) { return paths.map(subpath => relateNormalPath(compiler, subpath)); }); const relateNormalPathSet = (exports.relateNormalPathSet = function relateNormalPathSet( compiler, paths, ) { return relateNormalPathArray(compiler, Array.from(paths)); }); /** * */ // Cache whether we need to replace path.sep because contextNormalPath is called _very_ frequently const resolveRelativeCompilerContext = '/' === path.sep ? function(context, key) { return path.resolve(context, key); } : function(context, key) { return path.resolve(context, key).replace(/\//g, path.sep); }; const contextNormalPath = (exports.contextNormalPath = function contextNormalPath( compiler, key, ) { if (typeof key !== 'string' || key === '') { return key; } const context = compilerContext(compiler); if (key === '.') { return context; } const markIndex = key.indexOf('?'); if (markIndex === -1) { return resolveRelativeCompilerContext(context, key); } const abs = resolveRelativeCompilerContext( context, key.substring(0, markIndex), ); return abs + '?' + key.substring(markIndex + 1); }); const contextNormalRequest = (exports.contextNormalRequest = function contextNormalRequest( compiler, key, ) { // return key // .split('!') // .map(subkey => contextNormalPath(compiler, subkey)) // .join('!'); let i = -1; let j = -1; let _newkey = ''; while ((i = key.indexOf('!', i + 1)) !== -1) { _newkey += contextNormalPath(compiler, key.substring(j + 1, i)); _newkey += '!'; j = i; } _newkey += contextNormalPath(compiler, key.substring(j + 1)); return _newkey; }); const contextNormalModuleId = (exports.contextNormalModuleId = function contextNormalModuleId( compiler, id, ) { return id.substring(0, 24) + contextNormalRequest(compiler, id.substring(24)); }); const contextNormalLoaders = (exports.contextNormalLoaders = function contextNormalLoaders( compiler, loaders, ) { return loaders.map(loader => Object.assign({}, loader, { loader: contextNormalPath(compiler, loader.loader), }), ); }); const contextNormalPathArray = (exports.contextNormalPathArray = function contextNormalPathArray( compiler, paths, ) { return paths.map(subpath => contextNormalPath(compiler, subpath)); }); const contextNormalPathSet = (exports.contextNormalPathSet = function contextNormalPathSet( compiler, paths, ) { return new Set(contextNormalPathArray(compiler, paths)); }); /** * */ const maybeAbsolutePath = (exports.maybeAbsolutePath = function maybeAbsolutePath( path, ) { return /^([a-zA-Z]:\\\\|\/)/.test(path); }); const relateAbsolutePath = (exports.relateAbsolutePath = function relateAbsolutePath( context, absPath, ) { if (maybeAbsolutePath(absPath)) { return path.relative(context, absPath); } return absPath; }); const relateAbsoluteRequest = (exports.relateAbsoluteRequest = function relateAbsoluteRequest( context, absReq, ) { return absReq .split(/!/g) .map(path => relateAbsolutePath(context, path)) .join('!'); });