|
1 |
| -/* eslint-disable no-console */ |
2 |
| -/** |
3 |
| - * Given the dist tag fetch the corresponding |
4 |
| - * version and make sure this version is used throughout the repository. |
5 |
| - * |
6 |
| - * If you work on this file: |
7 |
| - * WARNING: This script can only use built-in modules since it has to run before |
8 |
| - * `pnpm install` |
9 |
| - */ |
10 |
| -import childProcess from 'child_process'; |
11 |
| -import fs from 'fs'; |
12 |
| -import os from 'os'; |
13 |
| -import path from 'path'; |
14 |
| -import { promisify } from 'util'; |
15 |
| -import { getWorkspaceRoot } from './utils.mjs'; |
16 |
| - |
17 |
| -// TODO: reuse the `useReactVersion.mjs` from the monorepo |
18 |
| - |
19 |
| -const exec = promisify(childProcess.exec); |
20 |
| - |
21 |
| -// packages published from the react monorepo using the same version |
22 |
| -const reactPackageNames = ['react', 'react-dom', 'react-is', 'react-test-renderer', 'scheduler']; |
23 |
| -const devDependenciesPackageNames = ['@testing-library/react']; |
24 |
| - |
25 |
| -// if we need to support more versions we will need to add new mapping here |
26 |
| -const additionalVersionsMappings = { |
27 |
| - 17: { |
28 |
| - '@testing-library/react': '^12.1.0', |
29 |
| - }, |
30 |
| - 19: {}, |
31 |
| -}; |
32 |
| - |
33 |
| -async function main(version) { |
34 |
| - if (typeof version !== 'string') { |
35 |
| - throw new TypeError(`expected version: string but got '${version}'`); |
36 |
| - } |
37 |
| - |
38 |
| - if (version === 'stable') { |
39 |
| - console.log('Nothing to do with stable'); |
40 |
| - return; |
41 |
| - } |
42 |
| - |
43 |
| - const packageJsonPath = path.resolve(getWorkspaceRoot(), 'package.json'); |
44 |
| - const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, { encoding: 'utf8' })); |
45 |
| - |
46 |
| - // the version is something in format: "17.0.0" |
47 |
| - let majorVersion = null; |
48 |
| - |
49 |
| - if (version.startsWith('^') || version.startsWith('~') || !Number.isNaN(version.charAt(0))) { |
50 |
| - majorVersion = version.replace('^', '').replace('~', '').split('.')[0]; |
51 |
| - } |
52 |
| - |
53 |
| - await Promise.all( |
54 |
| - reactPackageNames.map(async (reactPackageName) => { |
55 |
| - const { stdout: versions } = await exec(`npm dist-tag ls ${reactPackageName} ${version}`); |
56 |
| - const tagMapping = versions.split('\n').find((mapping) => { |
57 |
| - return mapping.startsWith(`${version}: `); |
58 |
| - }); |
59 |
| - |
60 |
| - let packageVersion = null; |
61 |
| - |
62 |
| - if (tagMapping === undefined) { |
63 |
| - // Some specific version is being requested |
64 |
| - if (majorVersion) { |
65 |
| - packageVersion = version; |
66 |
| - if (reactPackageName === 'scheduler') { |
67 |
| - // get the scheduler version from the react-dom's dependencies entry |
68 |
| - const { stdout: reactDOMDependenciesString } = await exec( |
69 |
| - `npm view --json react-dom@${version} dependencies`, |
70 |
| - ); |
71 |
| - packageVersion = JSON.parse(reactDOMDependenciesString).scheduler; |
72 |
| - } |
73 |
| - } else { |
74 |
| - throw new Error(`Could not find '${version}' in "${versions}"`); |
75 |
| - } |
76 |
| - } else { |
77 |
| - packageVersion = tagMapping.replace(`${version}: `, ''); |
78 |
| - } |
79 |
| - |
80 |
| - packageJson.resolutions[reactPackageName] = packageVersion; |
81 |
| - }), |
82 |
| - ); |
83 |
| - |
84 |
| - // At this moment all dist tags reference React 18 version, so we don't need |
85 |
| - // to update these dependencies unless an older version is used, or when the |
86 |
| - // next/experimental dist tag reference to a future version of React |
87 |
| - // packageJson.devDependencies['@testing-library/react'] = 'alpha'; |
88 |
| - |
89 |
| - if (majorVersion && additionalVersionsMappings[majorVersion]) { |
90 |
| - devDependenciesPackageNames.forEach((packageName) => { |
91 |
| - if (!additionalVersionsMappings[majorVersion][packageName]) { |
92 |
| - throw new Error( |
93 |
| - `Version ${majorVersion} does not have version defined for the ${packageName}`, |
94 |
| - ); |
95 |
| - } |
96 |
| - packageJson.devDependencies[packageName] = |
97 |
| - additionalVersionsMappings[majorVersion][packageName]; |
98 |
| - }); |
99 |
| - } |
100 |
| - |
101 |
| - // add newline for clean diff |
102 |
| - fs.writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}${os.EOL}`); |
103 |
| -} |
104 |
| - |
105 |
| -const [version = process.env.REACT_VERSION] = process.argv.slice(2); |
106 |
| -main(version).catch((error) => { |
107 |
| - console.error(error); |
108 |
| - process.exit(1); |
109 |
| -}); |
| 1 | +import '@mui/monorepo/scripts/useReactVersion.mjs'; |
0 commit comments