hard-source-webpack-plugin-fixed-hashbug
Version:
Hard cache the source of modules in webpack. Patched version fixing the hash bug
196 lines (171 loc) • 4.68 kB
JavaScript
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('!');
});