From f06956efd2dc4bf77244a9fcce2b883a00b925af Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Thu, 21 Dec 2023 22:46:53 +0800 Subject: updated node modules --- node_modules/lilconfig/dist/index.d.ts | 10 +- node_modules/lilconfig/dist/index.js | 267 +++++++++++++++++++++------------ node_modules/lilconfig/package.json | 4 +- node_modules/lilconfig/readme.md | 7 +- 4 files changed, 181 insertions(+), 107 deletions(-) (limited to 'node_modules/lilconfig') 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; load(filepath: string): Promise; -}; +} & ClearCaches; export declare function lilconfig(name: string, options?: Partial): 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 -- cgit v1.2.3