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;
|