@v4fire/core
Version:
V4Fire core library
87 lines • 2.21 kB
JavaScript
;
const {
config: {
superRgxp
}
} = require('@pzlr/build-core');
const fs = require('fs'),
path = require('upath'),
findUp = require('find-up'),
{
pathEqual
} = require('path-equal');
const IncludeOptions = {};
module.exports = function createInclude(layers) {
return function include(src, cwdOrOpts) {
const opts = {};
let cwd;
if (Object.isDictionary(cwdOrOpts)) {
Object.assign(opts, cwdOrOpts);
cwd = opts.ctx;
} else {
cwd = cwdOrOpts;
}
if (opts.source) {
opts.return = 'source';
} else {
opts.return = opts.return ?? 'module';
}
function resolve(root) {
const rootAlias = /\${root}/g;
if (rootAlias.test(src)) {
return src.replace(rootAlias, root);
}
return path.join(root, src);
}
let resolvedLayers = layers;
if (superRgxp.removeFlags('g').test(src)) {
if (cwd == null) {
throw new ReferenceError('A context for @super is not defined');
}
cwd = path.dirname(findUp.sync('.pzlrrc', {
cwd
}));
resolvedLayers = resolvedLayers.slice(0, -1);
for (let i = resolvedLayers.length; i--;) {
if (pathEqual(cwd, resolvedLayers[i])) {
resolvedLayers = resolvedLayers.slice(0, i);
break;
}
}
src = src.replace(superRgxp, '');
}
for (let i = resolvedLayers.length; i--;) {
const layerSrc = resolve(resolvedLayers[i]);
try {
if (opts.return !== 'module' && fs.existsSync(layerSrc)) {
return getResult(layerSrc);
}
if (isModuleExists(layerSrc)) {
return require(layerSrc);
}
} catch (err) {
console.error(`Failed to load ${layerSrc}`);
throw err;
}
}
return getResult(src);
function isModuleExists(src) {
try {
require.resolve(src);
return true;
} catch {
return false;
}
}
function getResult(src) {
switch (opts.return) {
case 'path':
return src;
case 'source':
return fs.readFileSync(src).toString();
default:
return require(src);
}
}
};
};