Skip to content

Instantly share code, notes, and snippets.

@jquense
Created February 16, 2018 17:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jquense/f0699e5d264c69101411a223884796c4 to your computer and use it in GitHub Desktop.
Save jquense/f0699e5d264c69101411a223884796c4 to your computer and use it in GitHub Desktop.
Main Module plugin webpack, concord
const concord = require('enhanced-resolve/lib/concord');
const getInnerRequest = require('enhanced-resolve/lib/getInnerRequest');
const createInnerCallback = require('enhanced-resolve/lib//createInnerCallback');
const defaultConfig = {
'./lib/**': './src/**',
};
function normalizeCondition(condition) {
let normalized = [].concat(condition);
normalized = normalized.map(c => {
if (typeof c === 'string') return str => str.includes(c);
if (c instanceof RegExp) return c.test.bind(c);
return c;
});
return (p, req) => normalized.some(fn => fn(p, req));
}
let count = 1;
class MainModulesPlugin {
constructor({ config = defaultConfig, include, exclude }) {
this.concordConfig = { modules: config };
this.include = include && normalizeCondition(include);
this.exclude = exclude && normalizeCondition(exclude);
}
shouldTransform(request) {
const { include, exclude } = this;
if (!include) return false;
const name =
request.descriptionFileData && request.descriptionFileData.name;
let shouldTransform = include(name, request);
if (exclude) shouldTransform = !exclude(name, request);
if (count++ < 100) console.log(shouldTransform, name);
return false; // !!shouldTransform;
}
apply(resolver) {
const target = 'resolve';
resolver.plugin('described-resolve', (request, callback) => {
const innerRequest = getInnerRequest(resolver, request);
if (!innerRequest) {
callback();
}
const { context, descriptionFileRoot } = request;
if (!this.shouldTransform(request)) return callback();
const data = concord.matchModule(
context,
this.concordConfig,
innerRequest,
);
if (data === innerRequest) return callback();
if (data === undefined) return callback();
if (data === false) return callback(null, { ...request, path: false });
return resolver.doResolve(
target,
{
...request,
path: descriptionFileRoot,
request: data,
},
`aliased MainModulesPlugin with mapping '${innerRequest}' to '${data}'`,
createInnerCallback(function $callback(err, result) {
if (arguments.length > 0) {
callback(err, result);
return;
}
// Don't allow other aliasing or raw request
callback(null, null);
}, callback),
);
});
}
}
module.exports = MainModulesPlugin;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment