feat: awesomerific module resolution

This commit is contained in:
cha0s 2022-03-24 03:01:37 -05:00
parent 7ef45e9b8d
commit 60c844d58b
3 changed files with 37 additions and 6 deletions

View File

@ -61,6 +61,7 @@
"chai": "4.2.0",
"commander": "^8.3.0",
"debug": "4.3.1",
"enhanced-resolve": "^5.9.2",
"eslint": "^7.0.0",
"eslint-import-resolver-webpack": "0.13.0",
"js-yaml": "4.1.0",

View File

@ -14,6 +14,7 @@ import {
import compileLoader from '@neutrinojs/compile-loader';
import babelmerge from 'babel-merge';
import enhancedResolve from 'enhanced-resolve';
import {addHook} from 'pirates';
import R from '../bootstrap/require';
@ -160,6 +161,11 @@ export default class ServerFlecks extends Flecks {
if (Object.keys(aliases).length > 0) {
debug('aliases: %O', aliases);
}
const exts = this.exts(rcs);
const enhancedResolver = enhancedResolve.create.sync({
extensions: exts,
alias: aliases,
});
// Stub server-unfriendly modules.
const stubs = this.stubs(['server'], rcs);
if (stubs.length > 0) {
@ -172,14 +178,22 @@ export default class ServerFlecks extends Flecks {
) {
const {Module} = R('module');
const {require: Mr} = Module.prototype;
const aliasKeys = Object.keys(aliases);
Module.prototype.require = function hackedRequire(request, options) {
for (let i = 0; i < stubs.length; ++i) {
if (request.match(stubs[i])) {
return undefined;
}
}
if (aliases[request]) {
return Mr.call(this, aliases[request], options);
if (aliasKeys.find((aliasKey) => request.startsWith(aliasKey))) {
try {
const resolved = enhancedResolver(FLECKS_CORE_ROOT, request);
if (resolved) {
return Mr.call(this, resolved, options);
}
}
// eslint-disable-next-line no-empty
catch (error) {}
}
return Mr.call(this, request, options);
};
@ -249,7 +263,6 @@ export default class ServerFlecks extends Flecks {
}
return undefined;
};
const exts = this.exts(rcs);
debug('pirating exts: %O', exts);
addHook(
(code, request) => {
@ -297,6 +310,10 @@ export default class ServerFlecks extends Flecks {
.toUpperCase();
}
exts() {
return this.constructor.exts(this.rcs);
}
static exts(rcs) {
const keys = Object.keys(rcs);
const exts = [];
@ -525,7 +542,7 @@ export default class ServerFlecks extends Flecks {
: this.constructor.sourcepath(R.resolve(this.constructor.resolve(resolver, fleck)));
allowlist.push(fleck);
config.resolve.alias
.set(`${fleck}$`, alias);
.set(`${fleck}/`, alias);
debug('%s runtime de-externalized %s, alias: %s', runtime, fleck, alias);
});
// Set up compilation at each root.

View File

@ -102,6 +102,7 @@ module.exports = async (flecks) => {
],
};
// Stub out non-server-friendly modules on the server.
const exts = flecks.exts();
const stubs = flecks.stubs();
const aliases = flecks.aliases();
// Do we need to get up in `require()`'s guts?
@ -117,17 +118,29 @@ module.exports = async (flecks) => {
));
const code = [
`const aliases = ${JSON.stringify(aliases)};`,
'const aliasKeys = Object.keys(aliases);',
`const stubs = [${sanitizedStubs}];`,
'const {Module} = require("module");',
'const {require: Mr} = Module.prototype;',
'const enhancedResolver = require("enhanced-resolve").create.sync({',
` extensions: ${JSON.stringify(exts)},`,
' alias: aliases,',
'});',
'Module.prototype.require = function hackedRequire(request, options) {',
' for (let i = 0; i < stubs.length; ++i) {',
' if (request.match(stubs[i])) {',
' return undefined;',
' }',
' }',
' if (aliases[request]) {',
' return Mr.call(this, aliases[request], options);',
' if (aliasKeys.find((aliasKey) => request.startsWith(aliasKey))) {',
' try {',
' const resolved = enhancedResolver(process.cwd(), request);',
' if (resolved) {',
' return Mr.call(this, resolved, options);',
' }',
' }',
' // eslint-disable-next-line no-empty',
' catch (error) {}',
' }',
' return Mr.call(this, request, options);',
'};',