Search code examples
reactjsdependenciesyarnpkgyarn-v2

Prevent yarn from installing a newer package version to avoid conflicts


My project has a conflict on @types/react because yarn keeps installing the newer version instead of the old one I need (^17.0.3).

yarn why @types/react

gives

=> Found "@types/[email protected]"
info Has been hoisted to "@types/react"
info Reasons this module exists
   - "workspace-aggregator-b9abcbf3-4f80-4556-99aa-e9a250d3385a" depends on it
   - Hoisted from "_project_#sdtool#@types#react-relay#@types#react"
   - Hoisted from "_project_#sdtool#@types#react-table#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#annotation#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#axis#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#bounds#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#clip-path#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#drag#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#event#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#geo#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#glyph#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#gradient#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#grid#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#group#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#heatmap#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#hierarchy#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#legend#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#marker#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#network#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#pattern#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#responsive#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#shape#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#text#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#tooltip#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#voronoi#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#zoom#@types#react"
   - Hoisted from "_project_#sdtool#@vx#vx#@vx#bounds#@types#react-dom#@types#react"
info Disk size without dependencies: "196KB"
info Disk size with unique dependencies: "1.37MB"
info Disk size with transitive dependencies: "1.37MB"
info Number of shared dependencies: 3
=> Found "sdtool#@types/[email protected]"
info This module exists because "_project_#sdtool" depends on it.
info Disk size without dependencies: "184KB"
info Disk size with unique dependencies: "1.36MB"
info Disk size with transitive dependencies: "1.36MB"
info Number of shared dependencies: 3
=> Found "@types/react-dom#@types/[email protected]"
info This module exists because "_project_#sdtool#@types#react-dom" depends on it.
info Disk size without dependencies: "184KB"
info Disk size with unique dependencies: "1.36MB"
info Disk size with transitive dependencies: "1.36MB"
info Number of shared dependencies: 3
Done in 0.69s.

In fact I can see from the yarn.lock file that the packages you see above have the following dependency:

  dependencies:
    "@types/react" "*"

So how I can lock yarn on sticking to the version 17 of @types/react?

UPDATE: these are my packages.json

package.json

{
  "name": "name",
  "author": "author",
  "private": true,
  "version": "0.0.0",
  "license": "SEE LICENSE IN LICENSE",
  "description": "desc",
  "keywords": [
    "keyword"
  ],
  "repository": {
    "type": "git",
    "url": ""
  },
  "workspaces": {
    "packages": [
      "packages/*"
    ]
  },
  "scripts": {
    "storybook": "cd packages/sdtool && yarn storybook",
    "build": "lerna run build",
    "lint": "lerna run lint",
    "prettier": "prettier --write \"./packages/**/*.{js,ts,jsx,tsx,json,md,xml}\""
  },
  "devDependencies": {
    "lerna": "^3.22.1",
    "prettier": "^2.2.1"
  },
  "resolutions": {
    "babel-loader": "8.1.0",
    "react": "17.0.1",
    "react-dom": "17.0.1",
    "@emotion/styled": "11.0.0",
    "@emotion/react": "11.0.0",
    "typescript": "^4.0.3"
  }
}

packages/pckg_name/package.json

{
  "name": "pckg_name",
  "version": "1.0.0",
  "private": true,
  "dependencies": {
    "@emotion/react": "^11.1.5",
    "@emotion/styled": "^11.10.5",
    "@primer/octicons-react": "^12.1.0",
    "@testing-library/jest-dom": "^5.11.10",
    "@testing-library/react": "^11.2.6",
    "@testing-library/user-event": "^13.1.1",
    "@types/jest": "^26.0.22",
    "@types/node": "^14.14.37",
    "@types/react": "^17.0.3",
    "@types/react-dom": "^17.0.3",
    "@vx/vx": "^0.0.199",
    "babel-plugin-relay": "^11.0.1",
    "dayjs": "^1.10.4",
    "history": "^5.0.0",
    "immer": "^9.0.1",
    "match-sorter": "^6.3.0",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-relay": "11.0.1",
    "react-router-dom": "6.0.0-beta.0",
    "react-scripts": "4.0.3",
    "react-spring": "npm:@react-spring/[email protected]",
    "react-table": "^7.6.3",
    "react-use-gesture": "^9.1.3",
    "react-window": "^1.8.6",
    "typescript": "^4.2.3",
    "web-vitals": "^1.1.1"
  },
  "scripts": {
    "start": "react-scripts --openssl-legacy-provider start",
    "build": "yarn relay && react-scripts build",
    "test": "react-scripts test",
    "lint": "eslint --ext js,ts,tsx src",
    "relay": "relay-compiler",
    "relay:watch": "relay-compiler --watch",
    "storybook": "start-storybook -p 6006 -s public",
    "build-storybook": "build-storybook -s public"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ],
    "ignorePatterns": [
      "*.stories.tsx"
    ],
    "overrides": [
      {
        "files": "*.{js,jsx,ts,tsx}",
        "rules": {
          "no-console": [
            2,
            {
              "allow": [
                "warn",
                "error"
              ]
            }
          ]
        }
      }
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@storybook/addon-actions": "^6.2.3",
    "@storybook/addon-essentials": "^6.2.3",
    "@storybook/addon-links": "^6.2.3",
    "@storybook/node-logger": "^6.2.3",
    "@storybook/preset-create-react-app": "^3.1.7",
    "@storybook/react": "^6.2.3",
    "@types/react-relay": "^11.0.1",
    "@types/react-table": "^7.0.29",
    "@types/relay-runtime": "^11.0.0",
    "graphql": "^15.5.0",
    "relay-compiler": "^11.0.1",
    "relay-compiler-language-typescript": "^13.0.9",
    "relay-config": "^11.0.1",
    "relay-test-utils": "^11.0.1"
  },
  "resolutions": {
    "@types/react": "^17.0.3"
  }
}

Solution

  • You may force a version of dependency by adding resolutions to your package.json:

    "resolutions": {
        "@types/react": "^17.0.3"
    }