UNPKG

@v4fire/core

Version:
87 lines 2.21 kB
'use strict'; 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); } } }; };