From 6343bfb504debf88dfeb390e9339f9583818583b Mon Sep 17 00:00:00 2001 From: meowtec Date: Thu, 27 Jan 2022 11:54:15 +0800 Subject: [PATCH] [Refactor] `no-extraneous-dependencies` improve performance using cache --- src/rules/no-extraneous-dependencies.js | 34 +++++++++++++++++-------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/rules/no-extraneous-dependencies.js b/src/rules/no-extraneous-dependencies.js index b54ee28bb7..e9458b2262 100644 --- a/src/rules/no-extraneous-dependencies.js +++ b/src/rules/no-extraneous-dependencies.js @@ -1,6 +1,6 @@ import path from 'path'; import fs from 'fs'; -import readPkgUp from 'eslint-module-utils/readPkgUp'; +import pkgUp from 'eslint-module-utils/pkgUp'; import minimatch from 'minimatch'; import resolve from 'eslint-module-utils/resolve'; import moduleVisitor from 'eslint-module-utils/moduleVisitor'; @@ -30,6 +30,21 @@ function extractDepFields(pkg) { }; } +function getPackageDepFields(packageJsonPath) { + if (packageJsonPath && !depFieldCache.has(packageJsonPath)) { + let content; + try { + content = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); + } catch (err) { + content = {}; + } + const depFields = extractDepFields(content); + depFieldCache.set(packageJsonPath, depFields); + } + + return depFieldCache.get(packageJsonPath); +} + function getDependencies(context, packageDir) { let paths = []; try { @@ -53,24 +68,21 @@ function getDependencies(context, packageDir) { // use rule config to find package.json paths.forEach(dir => { const packageJsonPath = path.join(dir, 'package.json'); - if (!depFieldCache.has(packageJsonPath)) { - const depFields = extractDepFields( - JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')), - ); - depFieldCache.set(packageJsonPath, depFields); - } - const _packageContent = depFieldCache.get(packageJsonPath); + const _packageContent = getPackageDepFields(packageJsonPath) || {}; Object.keys(packageContent).forEach(depsKey => Object.assign(packageContent[depsKey], _packageContent[depsKey]), ); }); } else { + const packageJsonPath = pkgUp({ + cwd: context.getPhysicalFilename ? context.getPhysicalFilename() : context.getFilename(), + normalize: false, + }); + // use closest package.json Object.assign( packageContent, - extractDepFields( - readPkgUp({ cwd: context.getPhysicalFilename ? context.getPhysicalFilename() : context.getFilename(), normalize: false }).pkg, - ), + getPackageDepFields(packageJsonPath), ); }