## Introduction This is PR is a suggestion ! And should be discussed With yarn `^4`, during installation won't raise an error if current dev env does not satisfies the `engines` policy. We have usually 10+ contributors support request regarding higher node version issue per week I would have preferred a very declarative integration using npm [engines](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#engines) but this does not seems to be natively supported by `yarn` We should keep in mind that this might block any machines from our CICD if they have diff node version installed ( such as running the project on a different node version could result in bugs too ) ## Implem Created a yarn [constraints](https://yarnpkg.com/features/constraints) run after each installation that checking if current node version satisfies defined engines range ( might also be done for others engines entries ) I assume we will always have the same engines policy for every packages, at least that's not a consideration from now ## Further We could refactor our package.json engines into only one using `Yarn.set` etc ## Resource - https://yarnpkg.com/configuration/yarnrc - https://yarnpkg.com/features/constraints ## Note - Not running constraints in `preInstall` hook as won't be effective on fresh install - [engine-strict](https://docs.npmjs.com/cli/v8/using-npm/config#engine-strict) is an npm-config - [devEngines](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#devengines) are npm feature too ( for instance pnpm current PR https://github.com/pnpm/pnpm/issues/8153 ) ## Conclusion As always any suggestions are more than welcomed !
32 lines
996 B
JavaScript
32 lines
996 B
JavaScript
// @ts-check
|
|
/** @type {import('@yarnpkg/types')} */
|
|
const { defineConfig, Yarn } = require('@yarnpkg/types');
|
|
const semver = require('semver');
|
|
|
|
const MONOREPO_ROOT_WORKSPACE = 'twenty';
|
|
|
|
module.exports = defineConfig({
|
|
async constraints({ Yarn }) {
|
|
const rootWorkspace = Yarn.workspace({ ident: MONOREPO_ROOT_WORKSPACE });
|
|
if (!rootWorkspace) {
|
|
throw new Error(
|
|
`Should never occur, ${MONOREPO_ROOT_WORKSPACE} workspace not found`,
|
|
);
|
|
}
|
|
|
|
const requiredNodeVersion = rootWorkspace.manifest.engines?.node;
|
|
if (!requiredNodeVersion) {
|
|
throw new Error(
|
|
`Should never occur, ${requiredNodeVersion} could not find node range in engines manifest`,
|
|
);
|
|
}
|
|
|
|
const currentNodeVersion = process.version;
|
|
if (!semver.satisfies(currentNodeVersion, requiredNodeVersion)) {
|
|
throw new Error(
|
|
`Node version ${currentNodeVersion} doesn't match the required version, please use ${requiredNodeVersion}`,
|
|
);
|
|
}
|
|
},
|
|
});
|