Skip to content

Snapped To

Pin the version of all dependencies in this group to follow the versions used by the other packages named within the snapTo array.

Examples

Example: Fix React Native version mismatch

Add a Snapped To Version Group which allows some of the packages in your monorepo to “follow” other packages in terms of which versions they should use.

In this example we want our Mobile App package to be the single source of truth for what the versions of react and react-native should be. Every other package will be required to use the same version it does.

Here is the Version Group configuration to do it:

  • An optional label can be added to document the rule.
  • The dependencies array defines the names of the dependencies we want to target.
  • The snapTo array lists the name properties of the locally developed package.json files which should be searched for a version of react or react-native.
.syncpackrc
{
"versionGroups": [
{
"label": "Always use the versions of react brought in by the Mobile App",
"dependencies": ["react", "react-native"],
"snapTo": ["mobile-app"]
}
]
}

Configuration

snapTo

Required
  • The values refer to the name property of the package.json files developed in your monorepo.
  • Multiple values can be added to provide fallback packages to try in the event that the dependency is not present in the earlier packages in the array.
Ensure all packages use whatever version of react that mobile-app is using
{
"versionGroups": [
{
"dependencies": ["react", "react-native"],
"snapTo": ["mobile-app"]
}
]
}

dependencies

Optional
  • An array of names of dependencies you’ve installed or otherwise reference in your package.json files.
  • If omitted, the default behaviour is to match every dependency.
  • The strings can be any combination of exact matches or minimatch glob patterns:
Examples of valid values
// match any dependency
dependencies: ["**"]
// match all dependencies with a certain scope
dependencies: ["@aws-sdk/**"]
// match specific dependencies by name
dependencies: ["react", "react-dom"]
Where this pattern is matched against
{
"name": "HERE",
"dependencies": { "HERE": "0.0.0" },
"devDependencies": { "HERE": "0.0.0" },
"overrides": { "HERE": "0.0.0" },
"peerDependencies": { "HERE": "0.0.0" },
"pnpm": { "overrides": { "HERE": "0.0.0" } },
"resolutions": { "HERE": "0.0.0" }
}

dependencyTypes

Optional
  • When set, only dependencies present in the named locations will be assigned to this group.
  • If omitted, the default behaviour is to match dependencies everywhere they are found.
  • Negated types are also supported, so a value of ["!dev", "!prod"] would assign everything except dependencies and devDependencies to this group.

Default values

ValueProperty in package.json
devdevDependencies
localversion
overridesoverrides
peerpeerDependencies
pnpmOverridespnpm.overrides
proddependencies
resolutionsresolutions

specifierTypes

Optional
  • When set, only dependencies whose version specifier matches the named formats will be assigned to this group.
  • If omitted, the default behaviour is to match all dependencies.
  • Negated types are also supported, so a value of ["!latest", "!file"] would assign everything except specifiers of the format * and file:path/to/package.tgz to this group.

Available values

ValueExample
aliasnpm:foo@1.2.3
exact8.1.2
filefile:path/to/foo.tgz, file:path/to/directory
hosted-gitgit+https://github.com/user/foo, git+ssh://git@notgithub.com/user/foo#1.2.3 etc
latest* or latest
range^4.1.1, >=5.0.0, ~1.2.1 etc
tagalpha, canary
unsupported$typescript, 1.typo.wat
urlhttps://server.com/foo.tgz
workspace-protocolworkspace:*, workspace:~, workspace:^

label

Optional
  • A short name or description displayed as a header in syncpack’s output.
  • If a label is not set then eg. “Version Group 3” will be used instead.

packages

Optional
  • An array of strings which should match the name properties of your package.json files.
  • If omitted, the default behaviour is to match every package.
  • Negated types are also supported, so a value of ["!my-client", "!my-server"] would assign everything except the packages my-client and my-server to this group.
  • The strings can be any combination of exact matches or minimatch glob patterns:
Examples of valid values
// ✅ match any package name
packages: ["**"]
// ✅ match any package name with this scope
packages: ["@my-repo/**"]
// ✅ match specific packages by name
packages: ["my-server", "my-client"]
// ✅ match all packages except negated ones
packages: ["!my-server", "!@my-repo/**]
// ❌ no mixing of specific and negated packages
packages: ["my-client", "!@my-repo/**"]
// ❌ not file system paths, name properties of package.json files
packages: ["packages/my-client"]
// ❌ not file system globs, name properties of package.json files
packages: ["packages/**"]
Where this pattern is matched against
{
"name": "HERE",
"version": "1.0.2"
}