2025-05-12

TIL: I need yet another monorepo tool / Sherif

I recently wrote about monorepos and migrated most of my personal stuff to a monorepo. One caveat i noticed is that if you keep typescript types different across repos, it can cause build issues like this:

./app/resume/page.tsx:105:31
Type error: The inferred type of 'ResumePage' cannot be named without a reference to '.pnpm/@types+react@19.1.0/node_modules/@types/react'. This is likely not portable. A type an
notation is necessary.

Solution

either manually update or use one of the listed tools to "lint" monorepo deps https://turborepo.com/docs/crafting-your-repository/managing-dependencies

  • syncpack - most popular but its currently undergoing a rust rewrite...
  • manypkg - cli is clean, but the examples are using yarn??
  • sherif - naming is a bit weird, otherwise seems good!

I'll try sherif

~/Dev/tengis617/mono main !10 ❯
pnpm dlx sherif@latest                                                                                                                         10s 11:26:53 PM
Packages: +2
++
Progress: resolved 7, reused 0, downloaded 2, added 2, done

2 issues found in ./apps/art-gallery/package.json:

 ⨯ error dependencies should be ordered alphabetically. unordered-dependencies
  │ {
  │   "dependencies": {
  ~     ...   ← keys aren't sorted.
  │   }
  │ }

 ⨯ error Similar Next.js dependencies should use the same version. unsync-similar-dependencies
  │ {
  │   "dependencies": {
  ~      "next": "15.3.2",
  ~      "eslint-config-next": "15.3.1"
  │   }
  │ }

2 issues found in ./apps/tengis.dev/package.json:

 ⨯ error Private packages shouldn't have @types/* in dependencies. types-in-dependencies
  │ {
  │   "private": "true",     ← package is private...
  │   ...
  -   "dependencies": {      ← but has @types/* in dependencies...
  -      "@types/js-yaml": "...",
  -   },
  │   ...
  +   "devDependencies": {   ← instead of devDependencies.
  +      "@types/js-yaml": "...",
  +   }
  │ }

 ⨯ error Similar Next.js dependencies should use the same version. unsync-similar-dependencies
  │ {
  │   "dependencies": {
  ~      "next": "15.3.2",
  ~      "@next/mdx": "^15.3.2"
  │   }
  │ }

13 issues found in ./:

 ⨯ error Dependency typescript has multiple versions defined in the workspace. multiple-dependency-versions

      ./                        5.8.3   ↑ highest
  ./apps
      art-gallery               ^5.8.3   ∼ between
      gitmd.dev                 ^5.8.3   ∼ between
      tengis.dev                5.8.3   ↑ highest
  ./packages
      eslint-config             ^5.8.2   ∼ between
      ui                        5.8.2   ↓ lowest

 ⨯ error Dependency react has multiple versions defined in the workspace. multiple-dependency-versions
  ./apps
      art-gallery               ^19.1.0   ↑ highest
      gitmd.dev                 ^19.1.0   ↑ highest
      tengis.dev                19.1.0   ∼ between
  ./packages
      ui                        ^19.1.0   ↑ highest

 ⨯ error Dependency react-dom has multiple versions defined in the workspace. multiple-dependency-versions
  ./apps
      art-gallery               ^19.1.0   ↑ highest
      gitmd.dev                 ^19.1.0   ↑ highest
      tengis.dev                19.1.0   ∼ between
  ./packages
      ui                        ^19.1.0   ↑ highest

 ⨯ error Dependency @tailwindcss/postcss has multiple versions defined in the workspace. multiple-dependency-versions
  ./apps
      tengis.dev                4.1.6   ↑ highest
      art-gallery               ^4   ↓ lowest
      gitmd.dev                 ^4   ↓ lowest

 ⨯ error Dependency @types/node has multiple versions defined in the workspace. multiple-dependency-versions
  ./packages
      ui                        ^22.14.0   ↑ highest
  ./apps
      tengis.dev                22.13.13   ∼ between
      art-gallery               ^20   ↓ lowest
      gitmd.dev                 ^20   ↓ lowest

 ⨯ error Dependency @types/react has multiple versions defined in the workspace. multiple-dependency-versions
  ./apps
      art-gallery               ^19.1.3   ↑ highest
      gitmd.dev                 ^19.1.3   ↑ highest
      tengis.dev                19.1.3   ∼ between
  ./packages
      ui                        19.1.0   ↓ lowest

 ⨯ error Dependency @types/react-dom has multiple versions defined in the workspace. multiple-dependency-versions
  ./apps
      art-gallery               ^19.1.3   ↑ highest
      gitmd.dev                 ^19.1.3   ↑ highest
      tengis.dev                19.1.3   ∼ between
  ./packages
      ui                        19.1.1   ↓ lowest

 ⨯ error Dependency eslint has multiple versions defined in the workspace. multiple-dependency-versions
  ./apps
      art-gallery               ^9.26.0   ↑ highest
      gitmd.dev                 ^9.26.0   ↑ highest
  ./packages
      eslint-config             ^9.26.0   ↑ highest
      ui                        ^9.25.0   ↓ lowest

 ⨯ error Dependency tailwindcss has multiple versions defined in the workspace. multiple-dependency-versions
  ./apps
      tengis.dev                4.1.6   ↑ highest
      art-gallery               ^4   ↓ lowest
      gitmd.dev                 ^4   ↓ lowest

 ⨯ error Dependency @radix-ui/react-slot has multiple versions defined in the workspace. multiple-dependency-versions
  ./apps
      gitmd.dev                 ^1.2.0   ↑ highest
      tengis.dev                ^1.1.2   ↓ lowest

 ⨯ error Dependency lucide-react has multiple versions defined in the workspace. multiple-dependency-versions
  ./apps
      gitmd.dev                 ^0.501.0   ↑ highest
      tengis.dev                ^0.484.0   ↓ lowest

 ⨯ error Dependency tw-animate-css has multiple versions defined in the workspace. multiple-dependency-versions
  ./apps
      gitmd.dev                 ^1.2.5   ↑ highest
      tengis.dev                ^1.2.4   ↓ lowest

 ⨯ error Dependency eslint-plugin-react has multiple versions defined in the workspace. multiple-dependency-versions
  ./apps
      gitmd.dev                 ^7.37.5   ↑ highest
  ./packages
      eslint-config             ^7.37.4   ↓ lowest

1 issue found in ./apps/gitmd.dev/package.json:

 ⨯ error Similar Next.js dependencies should use the same version. unsync-similar-dependencies
  │ {
  │   "dependencies": {
  ~      "next": "15.3.2",
  ~      "eslint-config-next": "15.3.1"
  │   }
  │ }

18 issues found (18 ⨯, 0 ⚠️, 0 ✓) across 6 packages in 2.676667ms.
 Note: use `-i` to ignore dependencies, `-r` to ignore rules, `-p` to ignore packages, and `-f` to autofix fixable issues.

zero dependencies and gives a nice output.

After fixing everything with pnpm dlx sherif@latest --fix:

~/Dev/tengis617/mono main !7 ?1 ❯
pnpm run sherif:fix                                                                                                                                11:40:10 PM

> mono@ sherif:fix /Users/tengis/Dev/tengis617/mono
> pnpm dlx sherif@latest --fix


✓ No issues found

Yaay! Now i can manage dependencies across apps easily!