| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 | "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.lilconfigSync = exports.lilconfig = exports.defaultLoaders = void 0;const path = require("path");const fs = require("fs");const os = require("os");const fsReadFileAsync = fs.promises.readFile;function getDefaultSearchPlaces(name) {    return [        'package.json',        `.${name}rc.json`,        `.${name}rc.js`,        `${name}.config.js`,        `.${name}rc.cjs`,        `${name}.config.cjs`,    ];}function getSearchPaths(startDir, stopDir) {    return startDir        .split(path.sep)        .reduceRight((acc, _, ind, arr) => {        const currentPath = arr.slice(0, ind + 1).join(path.sep);        if (!acc.passedStopDir)            acc.searchPlaces.push(currentPath || path.sep);        if (currentPath === stopDir)            acc.passedStopDir = true;        return acc;    }, { searchPlaces: [], passedStopDir: false }).searchPlaces;}exports.defaultLoaders = Object.freeze({    '.js': require,    '.json': require,    '.cjs': require,    noExt(_, content) {        return JSON.parse(content);    },});function getExtDesc(ext) {    return ext === 'noExt' ? 'files without extensions' : `extension "${ext}"`;}function getOptions(name, options = {}) {    const conf = {        stopDir: os.homedir(),        searchPlaces: getDefaultSearchPlaces(name),        ignoreEmptySearchPlaces: true,        transform: (x) => x,        packageProp: [name],        ...options,        loaders: { ...exports.defaultLoaders, ...options.loaders },    };    conf.searchPlaces.forEach(place => {        const key = path.extname(place) || 'noExt';        const loader = conf.loaders[key];        if (!loader) {            throw new Error(`No loader specified for ${getExtDesc(key)}, so searchPlaces item "${place}" is invalid`);        }        if (typeof loader !== 'function') {            throw new Error(`loader for ${getExtDesc(key)} is not a function (type provided: "${typeof loader}"), so searchPlaces item "${place}" is invalid`);        }    });    return conf;}function getPackageProp(props, obj) {    if (typeof props === 'string' && props in obj)        return obj[props];    return ((Array.isArray(props) ? props : props.split('.')).reduce((acc, prop) => (acc === undefined ? acc : acc[prop]), obj) || null);}function getSearchItems(searchPlaces, searchPaths) {    return searchPaths.reduce((acc, searchPath) => {        searchPlaces.forEach(fileName => acc.push({            fileName,            filepath: path.join(searchPath, fileName),            loaderKey: path.extname(fileName) || 'noExt',        }));        return acc;    }, []);}function validateFilePath(filepath) {    if (!filepath)        throw new Error('load must pass a non-empty string');}function validateLoader(loader, ext) {    if (!loader)        throw new Error(`No loader specified for extension "${ext}"`);    if (typeof loader !== 'function')        throw new Error('loader is not a function');}function lilconfig(name, options) {    const { ignoreEmptySearchPlaces, loaders, packageProp, searchPlaces, stopDir, transform, } = getOptions(name, options);    return {        async search(searchFrom = process.cwd()) {            const searchPaths = getSearchPaths(searchFrom, stopDir);            const result = {                config: null,                filepath: '',            };            const searchItems = getSearchItems(searchPlaces, searchPaths);            for (const { fileName, filepath, loaderKey } of searchItems) {                try {                    await fs.promises.access(filepath);                }                catch (_a) {                    continue;                }                const content = String(await fsReadFileAsync(filepath));                const loader = loaders[loaderKey];                if (fileName === 'package.json') {                    const pkg = loader(filepath, content);                    const maybeConfig = getPackageProp(packageProp, pkg);                    if (maybeConfig != null) {                        result.config = maybeConfig;                        result.filepath = filepath;                        break;                    }                    continue;                }                const isEmpty = content.trim() === '';                if (isEmpty && ignoreEmptySearchPlaces)                    continue;                if (isEmpty) {                    result.isEmpty = true;                    result.config = undefined;                }                else {                    validateLoader(loader, loaderKey);                    result.config = loader(filepath, content);                }                result.filepath = filepath;                break;            }            if (result.filepath === '' && result.config === null)                return transform(null);            return transform(result);        },        async load(filepath) {            validateFilePath(filepath);            const { base, ext } = path.parse(filepath);            const loaderKey = ext || 'noExt';            const loader = loaders[loaderKey];            validateLoader(loader, loaderKey);            const content = String(await fsReadFileAsync(filepath));            if (base === 'package.json') {                const pkg = await loader(filepath, content);                return transform({                    config: getPackageProp(packageProp, pkg),                    filepath,                });            }            const result = {                config: null,                filepath,            };            const isEmpty = content.trim() === '';            if (isEmpty && ignoreEmptySearchPlaces)                return transform({                    config: undefined,                    filepath,                    isEmpty: true,                });            result.config = isEmpty                ? undefined                : await loader(filepath, content);            return transform(isEmpty ? { ...result, isEmpty, config: undefined } : result);        },    };}exports.lilconfig = lilconfig;function lilconfigSync(name, options) {    const { ignoreEmptySearchPlaces, loaders, packageProp, searchPlaces, stopDir, transform, } = getOptions(name, options);    return {        search(searchFrom = process.cwd()) {            const searchPaths = getSearchPaths(searchFrom, stopDir);            const result = {                config: null,                filepath: '',            };            const searchItems = getSearchItems(searchPlaces, searchPaths);            for (const { fileName, filepath, loaderKey } of searchItems) {                try {                    fs.accessSync(filepath);                }                catch (_a) {                    continue;                }                const loader = loaders[loaderKey];                const content = String(fs.readFileSync(filepath));                if (fileName === 'package.json') {                    const pkg = loader(filepath, content);                    const maybeConfig = getPackageProp(packageProp, pkg);                    if (maybeConfig != null) {                        result.config = maybeConfig;                        result.filepath = filepath;                        break;                    }                    continue;                }                const isEmpty = content.trim() === '';                if (isEmpty && ignoreEmptySearchPlaces)                    continue;                if (isEmpty) {                    result.isEmpty = true;                    result.config = undefined;                }                else {                    validateLoader(loader, loaderKey);                    result.config = loader(filepath, content);                }                result.filepath = filepath;                break;            }            if (result.filepath === '' && result.config === null)                return transform(null);            return transform(result);        },        load(filepath) {            validateFilePath(filepath);            const { base, ext } = path.parse(filepath);            const loaderKey = ext || 'noExt';            const loader = loaders[loaderKey];            validateLoader(loader, loaderKey);            const content = String(fs.readFileSync(filepath));            if (base === 'package.json') {                const pkg = loader(filepath, content);                return transform({                    config: getPackageProp(packageProp, pkg),                    filepath,                });            }            const result = {                config: null,                filepath,            };            const isEmpty = content.trim() === '';            if (isEmpty && ignoreEmptySearchPlaces)                return transform({                    filepath,                    config: undefined,                    isEmpty: true,                });            result.config = isEmpty ? undefined : loader(filepath, content);            return transform(isEmpty ? { ...result, isEmpty, config: undefined } : result);        },    };}exports.lilconfigSync = lilconfigSync;
 |