| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | import { YError } from '../yerror.js';let previouslyVisitedConfigs = [];let shim;export function applyExtends(config, cwd, mergeExtends, _shim) {    shim = _shim;    let defaultConfig = {};    if (Object.prototype.hasOwnProperty.call(config, 'extends')) {        if (typeof config.extends !== 'string')            return defaultConfig;        const isPath = /\.json|\..*rc$/.test(config.extends);        let pathToDefault = null;        if (!isPath) {            try {                pathToDefault = require.resolve(config.extends);            }            catch (_err) {                return config;            }        }        else {            pathToDefault = getPathToDefaultConfig(cwd, config.extends);        }        checkForCircularExtends(pathToDefault);        previouslyVisitedConfigs.push(pathToDefault);        defaultConfig = isPath            ? JSON.parse(shim.readFileSync(pathToDefault, 'utf8'))            : require(config.extends);        delete config.extends;        defaultConfig = applyExtends(defaultConfig, shim.path.dirname(pathToDefault), mergeExtends, shim);    }    previouslyVisitedConfigs = [];    return mergeExtends        ? mergeDeep(defaultConfig, config)        : Object.assign({}, defaultConfig, config);}function checkForCircularExtends(cfgPath) {    if (previouslyVisitedConfigs.indexOf(cfgPath) > -1) {        throw new YError(`Circular extended configurations: '${cfgPath}'.`);    }}function getPathToDefaultConfig(cwd, pathToExtend) {    return shim.path.resolve(cwd, pathToExtend);}function mergeDeep(config1, config2) {    const target = {};    function isObject(obj) {        return obj && typeof obj === 'object' && !Array.isArray(obj);    }    Object.assign(target, config1);    for (const key of Object.keys(config2)) {        if (isObject(config2[key]) && isObject(target[key])) {            target[key] = mergeDeep(config1[key], config2[key]);        }        else {            target[key] = config2[key];        }    }    return target;}
 |