summaryrefslogtreecommitdiff
path: root/node_modules/lilconfig
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-12-21 22:46:53 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-12-21 22:46:53 +0800
commitf06956efd2dc4bf77244a9fcce2b883a00b925af (patch)
tree0123cb73ce67f1f4b17e1d6cbabff076ee44e31b /node_modules/lilconfig
parent8d980c13970c15b6d2312b6fc4ac51698dd0d220 (diff)
updated node modules
Diffstat (limited to 'node_modules/lilconfig')
-rw-r--r--node_modules/lilconfig/dist/index.d.ts10
-rw-r--r--node_modules/lilconfig/dist/index.js267
-rw-r--r--node_modules/lilconfig/package.json4
-rw-r--r--node_modules/lilconfig/readme.md7
4 files changed, 181 insertions, 107 deletions
diff --git a/node_modules/lilconfig/dist/index.d.ts b/node_modules/lilconfig/dist/index.d.ts
index 766c58ce..5a0c2db3 100644
--- a/node_modules/lilconfig/dist/index.d.ts
+++ b/node_modules/lilconfig/dist/index.d.ts
@@ -4,6 +4,7 @@ export declare type LilconfigResult = null | {
isEmpty?: boolean;
};
interface OptionsBase {
+ cache?: boolean;
stopDir?: string;
searchPlaces?: string[];
ignoreEmptySearchPlaces?: boolean;
@@ -25,14 +26,19 @@ export interface OptionsSync extends OptionsBase {
transform?: TransformSync;
}
export declare const defaultLoaders: LoadersSync;
+declare type ClearCaches = {
+ clearLoadCache: () => void;
+ clearSearchCache: () => void;
+ clearCaches: () => void;
+};
declare type AsyncSearcher = {
search(searchFrom?: string): Promise<LilconfigResult>;
load(filepath: string): Promise<LilconfigResult>;
-};
+} & ClearCaches;
export declare function lilconfig(name: string, options?: Partial<Options>): AsyncSearcher;
declare type SyncSearcher = {
search(searchFrom?: string): LilconfigResult;
load(filepath: string): LilconfigResult;
-};
+} & ClearCaches;
export declare function lilconfigSync(name: string, options?: OptionsSync): SyncSearcher;
export {};
diff --git a/node_modules/lilconfig/dist/index.js b/node_modules/lilconfig/dist/index.js
index 13cca574..dce42fa6 100644
--- a/node_modules/lilconfig/dist/index.js
+++ b/node_modules/lilconfig/dist/index.js
@@ -19,17 +19,8 @@ function getDefaultSearchPlaces(name) {
`${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;
+function parentDir(p) {
+ return path.dirname(p) || path.sep;
}
exports.defaultLoaders = Object.freeze({
'.js': require,
@@ -47,6 +38,7 @@ function getOptions(name, options = {}) {
stopDir: os.homedir(),
searchPlaces: getDefaultSearchPlaces(name),
ignoreEmptySearchPlaces: true,
+ cache: true,
transform: (x) => x,
packageProp: [name],
...options,
@@ -69,16 +61,6 @@ function getPackageProp(props, 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(sp => acc.push({
- searchPlace: sp,
- filepath: path.join(searchPath, sp),
- loaderKey: path.extname(sp) || 'noExt',
- }));
- return acc;
- }, []);
-}
function validateFilePath(filepath) {
if (!filepath)
throw new Error('load must pass a non-empty string');
@@ -89,56 +71,88 @@ function validateLoader(loader, ext) {
if (typeof loader !== 'function')
throw new Error('loader is not a function');
}
+const makeEmplace = (enableCache) => (c, filepath, res) => {
+ if (enableCache)
+ c.set(filepath, res);
+ return res;
+};
function lilconfig(name, options) {
- const { ignoreEmptySearchPlaces, loaders, packageProp, searchPlaces, stopDir, transform, } = getOptions(name, options);
+ const { ignoreEmptySearchPlaces, loaders, packageProp, searchPlaces, stopDir, transform, cache, } = getOptions(name, options);
+ const searchCache = new Map();
+ const loadCache = new Map();
+ const emplace = makeEmplace(cache);
return {
async search(searchFrom = process.cwd()) {
- const searchPaths = getSearchPaths(searchFrom, stopDir);
const result = {
config: null,
filepath: '',
};
- const searchItems = getSearchItems(searchPlaces, searchPaths);
- for (const { searchPlace, filepath, loaderKey } of searchItems) {
- try {
- await fs.promises.access(filepath);
- }
- catch (_a) {
- continue;
- }
- const content = String(await fsReadFileAsync(filepath));
- const loader = loaders[loaderKey];
- if (searchPlace === 'package.json') {
- const pkg = await loader(filepath, content);
- const maybeConfig = getPackageProp(packageProp, pkg);
- if (maybeConfig != null) {
- result.config = maybeConfig;
- result.filepath = filepath;
- break;
+ const visited = new Set();
+ let dir = searchFrom;
+ dirLoop: while (true) {
+ if (cache) {
+ const r = searchCache.get(dir);
+ if (r !== undefined) {
+ for (const p of visited)
+ searchCache.set(p, r);
+ return r;
}
- continue;
+ visited.add(dir);
}
- const isEmpty = content.trim() === '';
- if (isEmpty && ignoreEmptySearchPlaces)
- continue;
- if (isEmpty) {
- result.isEmpty = true;
- result.config = undefined;
- }
- else {
- validateLoader(loader, loaderKey);
- result.config = await loader(filepath, content);
+ for (const searchPlace of searchPlaces) {
+ const filepath = path.join(dir, searchPlace);
+ try {
+ await fs.promises.access(filepath);
+ }
+ catch (_a) {
+ continue;
+ }
+ const content = String(await fsReadFileAsync(filepath));
+ const loaderKey = path.extname(searchPlace) || 'noExt';
+ const loader = loaders[loaderKey];
+ if (searchPlace === 'package.json') {
+ const pkg = await loader(filepath, content);
+ const maybeConfig = getPackageProp(packageProp, pkg);
+ if (maybeConfig != null) {
+ result.config = maybeConfig;
+ result.filepath = filepath;
+ break dirLoop;
+ }
+ continue;
+ }
+ const isEmpty = content.trim() === '';
+ if (isEmpty && ignoreEmptySearchPlaces)
+ continue;
+ if (isEmpty) {
+ result.isEmpty = true;
+ result.config = undefined;
+ }
+ else {
+ validateLoader(loader, loaderKey);
+ result.config = await loader(filepath, content);
+ }
+ result.filepath = filepath;
+ break dirLoop;
}
- result.filepath = filepath;
- break;
+ if (dir === stopDir || dir === parentDir(dir))
+ break dirLoop;
+ dir = parentDir(dir);
}
- if (result.filepath === '' && result.config === null)
- return transform(null);
- return transform(result);
+ const transformed = result.filepath === '' && result.config === null
+ ? transform(null)
+ : transform(result);
+ if (cache) {
+ for (const p of visited)
+ searchCache.set(p, transformed);
+ }
+ return transformed;
},
async load(filepath) {
validateFilePath(filepath);
const absPath = path.resolve(process.cwd(), filepath);
+ if (cache && loadCache.has(absPath)) {
+ return loadCache.get(absPath);
+ }
const { base, ext } = path.parse(absPath);
const loaderKey = ext || 'noExt';
const loader = loaders[loaderKey];
@@ -146,10 +160,10 @@ function lilconfig(name, options) {
const content = String(await fsReadFileAsync(absPath));
if (base === 'package.json') {
const pkg = await loader(absPath, content);
- return transform({
+ return emplace(loadCache, absPath, transform({
config: getPackageProp(packageProp, pkg),
filepath: absPath,
- });
+ }));
}
const result = {
config: null,
@@ -157,69 +171,110 @@ function lilconfig(name, options) {
};
const isEmpty = content.trim() === '';
if (isEmpty && ignoreEmptySearchPlaces)
- return transform({
+ return emplace(loadCache, absPath, transform({
config: undefined,
filepath: absPath,
isEmpty: true,
- });
+ }));
result.config = isEmpty
? undefined
: await loader(absPath, content);
- return transform(isEmpty ? { ...result, isEmpty, config: undefined } : result);
+ return emplace(loadCache, absPath, transform(isEmpty ? { ...result, isEmpty, config: undefined } : result));
+ },
+ clearLoadCache() {
+ if (cache)
+ loadCache.clear();
+ },
+ clearSearchCache() {
+ if (cache)
+ searchCache.clear();
+ },
+ clearCaches() {
+ if (cache) {
+ loadCache.clear();
+ searchCache.clear();
+ }
},
};
}
exports.lilconfig = lilconfig;
function lilconfigSync(name, options) {
- const { ignoreEmptySearchPlaces, loaders, packageProp, searchPlaces, stopDir, transform, } = getOptions(name, options);
+ const { ignoreEmptySearchPlaces, loaders, packageProp, searchPlaces, stopDir, transform, cache, } = getOptions(name, options);
+ const searchCache = new Map();
+ const loadCache = new Map();
+ const emplace = makeEmplace(cache);
return {
search(searchFrom = process.cwd()) {
- const searchPaths = getSearchPaths(searchFrom, stopDir);
const result = {
config: null,
filepath: '',
};
- const searchItems = getSearchItems(searchPlaces, searchPaths);
- for (const { searchPlace, filepath, loaderKey } of searchItems) {
- try {
- fs.accessSync(filepath);
- }
- catch (_a) {
- continue;
- }
- const loader = loaders[loaderKey];
- const content = String(fs.readFileSync(filepath));
- if (searchPlace === 'package.json') {
- const pkg = loader(filepath, content);
- const maybeConfig = getPackageProp(packageProp, pkg);
- if (maybeConfig != null) {
- result.config = maybeConfig;
- result.filepath = filepath;
- break;
+ const visited = new Set();
+ let dir = searchFrom;
+ dirLoop: while (true) {
+ if (cache) {
+ const r = searchCache.get(dir);
+ if (r !== undefined) {
+ for (const p of visited)
+ searchCache.set(p, r);
+ return r;
}
- continue;
+ visited.add(dir);
}
- 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);
+ for (const searchPlace of searchPlaces) {
+ const filepath = path.join(dir, searchPlace);
+ try {
+ fs.accessSync(filepath);
+ }
+ catch (_a) {
+ continue;
+ }
+ const loaderKey = path.extname(searchPlace) || 'noExt';
+ const loader = loaders[loaderKey];
+ const content = String(fs.readFileSync(filepath));
+ if (searchPlace === 'package.json') {
+ const pkg = loader(filepath, content);
+ const maybeConfig = getPackageProp(packageProp, pkg);
+ if (maybeConfig != null) {
+ result.config = maybeConfig;
+ result.filepath = filepath;
+ break dirLoop;
+ }
+ 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 dirLoop;
}
- result.filepath = filepath;
- break;
+ if (dir === stopDir || dir === parentDir(dir))
+ break dirLoop;
+ dir = parentDir(dir);
}
- if (result.filepath === '' && result.config === null)
- return transform(null);
- return transform(result);
+ const transformed = result.filepath === '' && result.config === null
+ ? transform(null)
+ : transform(result);
+ if (cache) {
+ for (const p of visited)
+ searchCache.set(p, transformed);
+ }
+ return transformed;
},
load(filepath) {
validateFilePath(filepath);
const absPath = path.resolve(process.cwd(), filepath);
+ if (cache && loadCache.has(absPath)) {
+ return loadCache.get(absPath);
+ }
const { base, ext } = path.parse(absPath);
const loaderKey = ext || 'noExt';
const loader = loaders[loaderKey];
@@ -238,13 +293,27 @@ function lilconfigSync(name, options) {
};
const isEmpty = content.trim() === '';
if (isEmpty && ignoreEmptySearchPlaces)
- return transform({
+ return emplace(loadCache, absPath, transform({
filepath: absPath,
config: undefined,
isEmpty: true,
- });
+ }));
result.config = isEmpty ? undefined : loader(absPath, content);
- return transform(isEmpty ? { ...result, isEmpty, config: undefined } : result);
+ return emplace(loadCache, absPath, transform(isEmpty ? { ...result, isEmpty, config: undefined } : result));
+ },
+ clearLoadCache() {
+ if (cache)
+ loadCache.clear();
+ },
+ clearSearchCache() {
+ if (cache)
+ searchCache.clear();
+ },
+ clearCaches() {
+ if (cache) {
+ loadCache.clear();
+ searchCache.clear();
+ }
},
};
}
diff --git a/node_modules/lilconfig/package.json b/node_modules/lilconfig/package.json
index 8e06d1f8..4782b541 100644
--- a/node_modules/lilconfig/package.json
+++ b/node_modules/lilconfig/package.json
@@ -1,6 +1,6 @@
{
"name": "lilconfig",
- "version": "2.1.0",
+ "version": "3.0.0",
"description": "A zero-dependency alternative to cosmiconfig",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@@ -43,6 +43,6 @@
"typescript": "4.4.4"
},
"engines": {
- "node": ">=10"
+ "node": ">=14"
}
}
diff --git a/node_modules/lilconfig/readme.md b/node_modules/lilconfig/readme.md
index 7b6610dc..ac42df08 100644
--- a/node_modules/lilconfig/readme.md
+++ b/node_modules/lilconfig/readme.md
@@ -43,15 +43,13 @@ lilconfigSync(
```
## Difference to `cosmiconfig`
-Lilconfig does not intend to be 100% compatible with `cosmiconfig` but tries to mimic it where possible. The key differences are:
-- **no** support for yaml files out of the box(`lilconfig` attempts to parse files with no extension as JSON instead of YAML). You can still add the support for YAML files by providing a loader, see an [example](#yaml-loader) below.
-- **no** cache
+Lilconfig does not intend to be 100% compatible with `cosmiconfig` but tries to mimic it where possible. The key difference is **no** support for yaml files out of the box(`lilconfig` attempts to parse files with no extension as JSON instead of YAML). You can still add the support for YAML files by providing a loader, see an [example](#yaml-loader) below.
### Options difference between the two.
|cosmiconfig option | lilconfig |
|------------------------|-----------|
-|cache | ❌ |
+|cache | ✅ |
|loaders | ✅ |
|ignoreEmptySearchPlaces | ✅ |
|packageProp | ✅ |
@@ -116,3 +114,4 @@ lilconfig('myapp', {
- lilconig v1 → cosmiconfig v6
- lilconig v2 → cosmiconfig v7
+- lilconig v3 → cosmiconfig v8