synopkg
Version:
Consistent dependency versions in large JavaScript Monorepos
239 lines (219 loc) • 7.17 kB
JavaScript
/*!
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
* Licensed under the MIT License.
*/
module.exports = {
indent: '\t',
// Custom types are used to define additional fields in package.json that contain versions that should be
// checked/synced. See https://synopkg.github.io/synopkg/config/custom-types for more details.
customTypes: {
engines: {
path: 'engines',
strategy: 'versionsByName',
},
packageManager: {
path: 'packageManager',
strategy: 'name@version',
},
},
/**
* SemverGroups are used to ensure that groups of packages use the same semver range for dependencies.
*
* semverGroup rules are applied in order to package/dep combinations. First matching rule applies. When running
* `synopkg lint-semver-ranges`, the output is grouped by label.
*/
semverGroups: [
// Workaround for compatibility issues.
// Ideally this section would be empty (and removed).
// Items should be removed from here when possible.
{
label:
'Version compatibility workarounds should be used, or removed from synopkg.config.cjs if no longer needed.',
dependencies: ['@oclif/core'],
dependencyTypes: ['pnpmOverrides'],
packages: ['**'],
range: '~',
},
{
label: 'engines.node should always use >= ranges',
dependencyTypes: ['engines'],
dependencies: ['node'],
packages: ['**'],
range: '>=',
},
{
label: 'engines.npm should always use caret ranges',
dependencyTypes: ['engines'],
dependencies: ['npm'],
packages: ['**'],
range: '^',
},
{
label: 'packageManager should always use exact dependency ranges',
dependencyTypes: ['packageManager'],
dependencies: ['**'],
packages: ['**'],
range: '',
},
// PropertyDDS packages' dependencies are ignored because they use a lot of exact deps.
{
dependencies: ['**'],
packages: ['@fluid-experimental/property-*'],
isIgnored: true,
},
{
label: 'Overridden server dependencies should always be exact versions',
dependencyTypes: ['pnpmOverrides'],
dependencies: [
'@fluidframework/gitresources',
'@fluidframework/protocol-base',
'@fluidframework/server-*',
],
packages: ['**'],
range: '',
},
{
label:
'Deps in pnpm overrides can use whatever dependency ranges they need',
dependencyTypes: ['pnpmOverrides'],
dependencies: ['**'],
packages: ['**'],
isIgnored: true,
},
{
label: 'Must use exact dependency ranges',
dependencies: [
'@tiny-calc/*',
'@graphql-codegen/cli',
'@graphql-codegen/typescript',
'@material-ui/*',
// api-extractor is patched, so it must use an exact version to avoid the patch breaking when updating.
'@microsoft/api-extractor',
'@types/chrome',
'@types/codemirror',
'@types/expect-puppeteer',
'@types/jest-environment-puppeteer',
'@types/jest',
'@types/puppeteer',
'@types/url-parse',
'fake-indexeddb',
'json-stringify-safe',
'yargs',
],
packages: ['**'],
range: '',
},
// Some dependencies, like typescript and eslint, recommend to use tilde deps because minors introduce
// changes that may break linting
{
label: 'Must use tilde dependency ranges',
dependencies: [
'@biomejs/biome',
'eslint-plugin-*',
'eslint-config-prettier',
'eslint',
'less',
'prettier',
'typescript',
'vue',
'webpack-dev-server',
// pinned since newer versions (2.3 through 2.6) refuse to work on NodeJS other than 10 || 12 || 14 due to https://github.com/cerner/terra-toolkit/issues/828
'@cerner/duplicate-package-checker-webpack-plugin',
// socket.io-client is forced to avoid 4.8 to avoid https://github.com/socketio/socket.io/issues/5202
'socket.io-client',
],
packages: ['**'],
range: '~',
},
// All deps should use caret ranges unless previously overridden
{
label: 'Dependencies should use caret dependency ranges',
dependencies: ['**'],
dependencyTypes: ['dev', 'peer', 'prod'],
packages: ['**'],
range: '^',
},
],
/**
* VersionGroups are used to ensure that groups of packages use the same version of dependencies.
*
* versionGroup rules are applied in order to package/dep combinations. First matching rule applies. When running
* `synopkg list-mismatches`, the output is grouped by label.
*/
versionGroups: [
// Workaround for compatibility issues.
// Ideally this section would be empty (and removed).
// Items should be removed from here when possible.
{
label:
'Version compatibility workarounds should be used, or removed from synopkg.config.cjs if no longer needed.',
dependencies: [
'react-virtualized-auto-sizer',
'@types/react',
'@types/react-dom',
],
packages: ['**'],
isIgnored: true,
},
// Workaround for this private internal package. Can be removed once our types wrapper around
// the package is no longer needed - see https://github.com/argos-ci/jest-puppeteer/issues/568.
{
label:
'Ignore private workaround package @types/jest-environment-puppeteer',
dependencies: ['@types/jest-environment-puppeteer'],
dependencyTypes: ['dev', 'prod'],
packages: ['**'],
isIgnored: true,
},
{
label: 'Versions of common Fluid packages should all match',
dependencies: [
'@fluid-internal/eslint-plugin-fluid',
'@fluid-tools/benchmark',
'@fluid-tools/build-cli',
'@fluidframework/build-common',
'@fluidframework/build-tools',
'@fluidframework/common-utils',
'@fluidframework/eslint-config-fluid',
'@fluidframework/protocol-definitions',
'@fluidframework/test-tools',
],
packages: ['**'],
},
{
label: 'Versions in engines field should all match',
dependencyTypes: ['engines'],
dependencies: ['**'],
packages: ['**'],
},
{
label: 'Versions in packageManager field should all match',
dependencyTypes: ['packageManager'],
dependencies: ['**'],
packages: ['**'],
},
{
label:
"Ignore interdependencies on other Fluid packages. This is needed because synopkg doesn't understand our >= < semver ranges",
isIgnored: true,
packages: [
'@fluid-example/**',
'@fluid-experimental/**',
'@fluid-internal/**',
'@fluid-private/**',
'@fluid-tools/**',
'@fluidframework/**',
'fluid-framework',
],
dependencies: [
'@fluid-example/**',
'@fluid-experimental/**',
'@fluid-internal/**',
'@fluid-private/**',
'@fluid-tools/**',
'@fluidframework/**',
'fluid-framework',
],
},
],
};