From 27d02d22459743dcb13e55163bfc5ac363324aba Mon Sep 17 00:00:00 2001 From: pikax Date: Wed, 20 Mar 2019 19:58:34 +0000 Subject: [PATCH 1/2] perf(ui): improve get folder list to use only Promises --- .../apollo-server/connectors/folders.js | 57 +++++++++++++------ 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/packages/@vue/cli-ui/apollo-server/connectors/folders.js b/packages/@vue/cli-ui/apollo-server/connectors/folders.js index d77149253a..d5fc119c3b 100644 --- a/packages/@vue/cli-ui/apollo-server/connectors/folders.js +++ b/packages/@vue/cli-ui/apollo-server/connectors/folders.js @@ -13,7 +13,7 @@ const pkgCache = new LRU({ const cwd = require('./cwd') -function isDirectory (file) { +function isDirectorySync (file) { file = file.replace(/\\/g, path.sep) try { return fs.statSync(file).isDirectory() @@ -23,6 +23,16 @@ function isDirectory (file) { return false } +function isDirectory (file) { + file = file.replace(/\\/g, path.sep) + try { + return fs.stat(file).then(x => x.isDirectory()) + } catch (e) { + if (process.env.VUE_APP_CLI_UI_DEV) console.warn(e.message) + } + return false +} + async function list (base, context) { let dir = base if (isPlatformWindows) { @@ -31,21 +41,37 @@ async function list (base, context) { } } const files = await fs.readdir(dir, 'utf8') - return files.map( - file => { - const folderPath = path.join(base, file) - return { - path: folderPath, - name: file, - hidden: isHidden(folderPath) - } + + const f = await Promise.all(files.map(async file => { + const folderPath = path.join(base, file) + + const [directory, hidden] = await Promise.all([isDirectory(folderPath), isHidden(folderPath)]) + if (!directory) { + return null } - ).filter( - file => isDirectory(file.path) - ) + return { + path: folderPath, + name: file, + hidden + } + })) + return f.filter(x => !!x) +} + +async function isHiddenWindows (file) { + const windowsFile = file.replace(/\\/g, '\\\\') + return (new Promise((resolve, reject) => { + winattr.get(windowsFile, (file, error) => { + if (error) { + return reject(error) + } + resolve(file) + }) + }) + .then(x => x.hidden)) } -function isHidden (file) { +async function isHidden (file) { try { const prefixed = path.basename(file).charAt(0) === hiddenPrefix const result = { @@ -54,8 +80,7 @@ function isHidden (file) { } if (isPlatformWindows) { - const windowsFile = file.replace(/\\/g, '\\\\') - result.windows = winattr.getSync(windowsFile).hidden + result.windows = await isHiddenWindows(file) } return (!isPlatformWindows && result.unix) || (isPlatformWindows && result.windows) @@ -172,7 +197,7 @@ function createFolder (name, context) { } module.exports = { - isDirectory, + isDirectory: isDirectorySync, getCurrent, list, open, From 2fbaf54b0919604dc826d80a7cb8c15e15a6a049 Mon Sep 17 00:00:00 2001 From: pikax Date: Tue, 1 Sep 2020 08:55:24 +0100 Subject: [PATCH 2/2] chore: remove isDirectorySync --- .../apollo-server/connectors/folders.js | 64 +++++++++---------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/packages/@vue/cli-ui/apollo-server/connectors/folders.js b/packages/@vue/cli-ui/apollo-server/connectors/folders.js index d438d7480d..3349c015c8 100644 --- a/packages/@vue/cli-ui/apollo-server/connectors/folders.js +++ b/packages/@vue/cli-ui/apollo-server/connectors/folders.js @@ -13,22 +13,12 @@ const pkgCache = new LRU({ const cwd = require('./cwd') -function isDirectorySync (file) { - file = file.replace(/\\/g, path.sep) - try { - return fs.statSync(file).isDirectory() - } catch (e) { - if (process.env.VUE_APP_CLI_UI_DEBUG) console.warn(e.message) - } - return false -} - function isDirectory (file) { file = file.replace(/\\/g, path.sep) try { - return fs.stat(file).then(x => x.isDirectory()) + return fs.stat(file).then((x) => x.isDirectory()) } catch (e) { - if (process.env.VUE_APP_CLI_UI_DEV) console.warn(e.message) + if (process.env.VUE_APP_CLI_UI_DEBUG) console.warn(e.message) } return false } @@ -42,33 +32,37 @@ async function list (base, context) { } const files = await fs.readdir(dir, 'utf8') - const f = await Promise.all(files.map(async file => { - const folderPath = path.join(base, file) + const f = await Promise.all( + files.map(async (file) => { + const folderPath = path.join(base, file) - const [directory, hidden] = await Promise.all([isDirectory(folderPath), isHidden(folderPath)]) - if (!directory) { - return null - } - return { - path: folderPath, - name: file, - hidden - } - })) - return f.filter(x => !!x) + const [directory, hidden] = await Promise.all([ + isDirectory(folderPath), + isHidden(folderPath) + ]) + if (!directory) { + return null + } + return { + path: folderPath, + name: file, + hidden + } + }) + ) + return f.filter((x) => !!x) } async function isHiddenWindows (file) { const windowsFile = file.replace(/\\/g, '\\\\') - return (new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { winattr.get(windowsFile, (file, error) => { if (error) { return reject(error) } resolve(file) }) - }) - .then(x => x.hidden)) + }).then((x) => x.hidden) } async function isHidden (file) { @@ -83,7 +77,10 @@ async function isHidden (file) { result.windows = await isHiddenWindows(file) } - return (!isPlatformWindows && result.unix) || (isPlatformWindows && result.windows) + return ( + (!isPlatformWindows && result.unix) || + (isPlatformWindows && result.windows) + ) } catch (e) { if (process.env.VUE_APP_CLI_UI_DEBUG) { console.log('file:', file) @@ -167,9 +164,10 @@ function isVueProject (file, context) { } function listFavorite (context) { - return context.db.get('foldersFavorite').value().map( - file => generateFolder(file.id, context) - ) + return context.db + .get('foldersFavorite') + .value() + .map((file) => generateFolder(file.id, context)) } function isFavorite (file, context) { @@ -197,7 +195,7 @@ function createFolder (name, context) { } module.exports = { - isDirectory: isDirectorySync, + isDirectory, getCurrent, list, open,