diff --git a/.lintstagedrc.js b/.lintstagedrc.js index 6fc72dd488..9e057a416e 100644 --- a/.lintstagedrc.js +++ b/.lintstagedrc.js @@ -2,31 +2,52 @@ const { ESLint } = require('eslint'); const cli = new ESLint(); +// This lets us abort if we've already run a stage for all files +const completedStages = new Set(); + // if a lot of files are changed, it's faster to run prettier/eslint on the // whole project than to run them on each file separately module.exports = { '*.(js|ts|tsx)': async files => { + if (completedStages.has('js')) return []; + const ignoredIds = await Promise.all( files.map(file => cli.isPathIgnored(file)) ); const lintableFiles = files.filter((_, i) => !ignoredIds[i]); - return files.length > 10 - ? ['eslint --max-warnings=0 --cache --fix .', 'prettier --write .'] - : [ - 'eslint --max-warnings=0 --cache --fix ' + lintableFiles.join(' '), - ...files.map(filename => `prettier --write '${filename}'`) - ]; + if (files.length > 10) { + completedStages.add('js'); + return ['eslint --max-warnings=0 --cache --fix .', 'prettier --write .']; + } else { + return [ + 'eslint --max-warnings=0 --cache --fix ' + lintableFiles.join(' '), + ...files.map(filename => `prettier --write '${filename}'`) + ]; + } }, - '*.!(js|ts|tsx)': files => - files.length > 10 - ? 'prettier --write .' - : files.map( - filename => `prettier --write --ignore-unknown '${filename}'` - ), - './curriculum/challenges/**/*.md': files => - files.length > 10 - ? 'npm run lint:challenges' - : files.map( - filename => `node ./tools/scripts/lint/index.js '${filename}'` - ) + '*.!(js|ts|tsx)': files => { + if (completedStages.has('not-js')) return []; + + if (files.length > 10) { + completedStages.add('not-js'); + return 'prettier --write .'; + } else { + return files.map( + filename => `prettier --write --ignore-unknown '${filename}'` + ); + } + }, + + './curriculum/challenges/**/*.md': files => { + if (completedStages.has('markdown')) return []; + + if (files.length > 10) { + completedStages.add('markdown'); + return 'npm run lint:challenges'; + } else { + return files.map( + filename => `node ./tools/scripts/lint/index.js '${filename}'` + ); + } + } };