From 4b4082808abccc23eb2df6580d641b61aac4002b Mon Sep 17 00:00:00 2001
From: Thilo Maier <git@maier.asia>
Date: Fri, 15 Jan 2021 21:13:58 +0000
Subject: [PATCH] Improve lint-staged config Fixes #685

---
 lint-staged.config.js | 28 ++++++++++++++++++++++++---
 package.json          |  5 +++--
 yarn.lock             | 45 +++++++++++++++++++++++++------------------
 3 files changed, 54 insertions(+), 24 deletions(-)

diff --git a/lint-staged.config.js b/lint-staged.config.js
index 3b665e4c..a3f053ef 100644
--- a/lint-staged.config.js
+++ b/lint-staged.config.js
@@ -1,4 +1,26 @@
-module.exports = {
-  '*.js': ['eslint --fix', 'prettier --write', 'prettier --check'],
-  '*.{md,mdx,css,yaml,yml}': ['prettier --write', 'prettier --check'],
+const micromatch = require('micromatch');
+const prettier = require('prettier');
+
+// https://coding.maier.tech/chunks/optimizing-lint-staged-config-js-for-prettier/
+
+const prettierSupportedExtensions = prettier
+  .getSupportInfo()
+  .languages.map(({ extensions }) => extensions)
+  .flat();
+
+const addQuotes = (a) => `"${a}"`;
+
+module.exports = (allStagedFiles) => {
+  const eslintFiles = micromatch(allStagedFiles, ['**/*.js'], { dot: true });
+  const prettierFiles = micromatch(
+    allStagedFiles,
+    prettierSupportedExtensions.map((extension) => `**/*${extension}`),
+    { dot: true }
+  );
+  const linters = [];
+  if (eslintFiles.length > 0)
+    linters.push(`eslint --fix ${eslintFiles.join(' ')}`);
+  if (prettierFiles.length > 0)
+    linters.push(`prettier --write ${prettierFiles.map(addQuotes).join(' ')}`);
+  return linters;
 };
diff --git a/package.json b/package.json
index 53f2534a..bd368d59 100644
--- a/package.json
+++ b/package.json
@@ -28,12 +28,13 @@
     "@babel/preset-react": "^7.12.7",
     "@changesets/cli": "^2.13.0",
     "@maiertech/eslint-config": "^0.16.0",
-    "@maiertech/prettier-config": "^0.2.1",
+    "@maiertech/prettier-config": "^0.3.0",
     "@skypack/package-check": "^0.2.2",
     "eslint": "^7.17.0",
-    "husky": "^4.3.0",
+    "husky": "^4.3.7",
     "lint-staged": "^10.5.2",
     "microbundle": "^0.13.0",
+    "micromatch": "^4.0.2",
     "prettier": "^2.2.1"
   }
 }
diff --git a/yarn.lock b/yarn.lock
index 1a2d562c..2b724021 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1766,10 +1766,10 @@
   dependencies:
     "@shopify/eslint-plugin" "^39.0.3"
 
-"@maiertech/prettier-config@^0.2.1":
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/@maiertech/prettier-config/-/prettier-config-0.2.1.tgz#8b85eb509a6e498218010e8fc540287dcbbe1e8c"
-  integrity sha512-V+DXbpav/ggMOv8xYISCvNES6Dsa3IMRErIs8F6rEEQ1C7r6KmeWyO6YOUOA3GwEAkT9Yk7T4nbprI+obN/LnA==
+"@maiertech/prettier-config@^0.3.0":
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/@maiertech/prettier-config/-/prettier-config-0.3.0.tgz#206009d9004c967d562a3b62faa3ab68185862c5"
+  integrity sha512-S6vCBBepNC5gJQLEfF6GzHyXssoTxaCtpCqdUHvIc585DIrdEMWNyEeVX7JN3rl7cQn6IMjscllIV5BBSmh1OQ==
 
 "@manypkg/find-root@^1.1.0":
   version "1.1.0"
@@ -7415,12 +7415,12 @@ find-up@^5.0.0:
     locate-path "^6.0.0"
     path-exists "^4.0.0"
 
-find-versions@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e"
-  integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==
+find-versions@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965"
+  integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==
   dependencies:
-    semver-regex "^2.0.0"
+    semver-regex "^3.1.2"
 
 find-yarn-workspace-root2@1.2.16:
   version "1.2.16"
@@ -9042,18 +9042,18 @@ human-signals@^1.1.1:
   resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
   integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
 
-husky@^4.3.0:
-  version "4.3.6"
-  resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.6.tgz#ebd9dd8b9324aa851f1587318db4cccb7665a13c"
-  integrity sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag==
+husky@^4.3.7:
+  version "4.3.7"
+  resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.7.tgz#ca47bbe6213c1aa8b16bbd504530d9600de91e88"
+  integrity sha512-0fQlcCDq/xypoyYSJvEuzbDPHFf8ZF9IXKJxlrnvxABTSzK1VPT2RKYQKrcgJ+YD39swgoB6sbzywUqFxUiqjw==
   dependencies:
     chalk "^4.0.0"
     ci-info "^2.0.0"
     compare-versions "^3.6.0"
     cosmiconfig "^7.0.0"
-    find-versions "^3.2.0"
+    find-versions "^4.0.0"
     opencollective-postinstall "^2.0.2"
-    pkg-dir "^4.2.0"
+    pkg-dir "^5.0.0"
     please-upgrade-node "^3.2.0"
     slash "^3.0.0"
     which-pm-runs "^1.0.0"
@@ -12741,6 +12741,13 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0:
   dependencies:
     find-up "^4.0.0"
 
+pkg-dir@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760"
+  integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==
+  dependencies:
+    find-up "^5.0.0"
+
 pkg-up@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
@@ -14736,10 +14743,10 @@ semver-diff@^3.1.1:
   dependencies:
     semver "^6.3.0"
 
-semver-regex@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
-  integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
+semver-regex@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.2.tgz#34b4c0d361eef262e07199dbef316d0f2ab11807"
+  integrity sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==
 
 "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
   version "5.7.1"