mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
0d2c50568f
Summary: Working on releases, I'm often looking for the name of our monorepo packages (as sometimes the name doesn't align with the directory) and also getting a list of the versions of everything, as well as if its private/public -- which I've interpreted to mean that we publish it or we don't. I thought this might be convenient to add. [Internal] - Add `print-packages` as a command to print our monorepo packages (including react-native) Pull Request resolved: https://github.com/facebook/react-native/pull/41959 Test Plan: ``` ❯ yarn print-packages yarn run v1.22.19 $ node ./scripts/monorepo/print ┌─────────┬─────────┬─────────────────────────────────────────┬────────────────┐ │ (index) │ Public? │ Name │ Version (main) │ ├─────────┼─────────┼─────────────────────────────────────────┼────────────────┤ │ 0 │ '✅' │ 'react-native/assets-registry' │ '0.74.0' │ │ 1 │ '✅' │ 'react-native/babel-plugin-codegen' │ '0.74.0' │ │ 2 │ '✅' │ 'react-native/community-cli-plugin' │ '0.74.0' │ │ 3 │ '✅' │ 'react-native/debugger-frontend' │ '0.74.0' │ │ 4 │ '✅' │ 'react-native/dev-middleware' │ '0.74.0' │ │ 5 │ '✅' │ 'react-native/eslint-config' │ '0.74.0' │ │ 6 │ '✅' │ 'react-native/eslint-plugin' │ '0.74.0' │ │ 7 │ '✅' │ 'react-native/eslint-plugin-specs' │ '0.74.0' │ │ 8 │ '❌' │ 'react-native/hermes-inspector-msggen' │ '0.72.0' │ │ 9 │ '✅' │ 'react-native/metro-config' │ '0.74.0' │ │ 10 │ '✅' │ 'react-native/normalize-colors' │ '0.74.1' │ │ 11 │ '✅' │ 'react-native/js-polyfills' │ '0.74.0' │ │ 12 │ '✅' │ 'react-native' │ '1000.0.0' │ │ 13 │ '✅' │ 'react-native/babel-preset' │ '0.74.0' │ │ 14 │ '✅' │ 'react-native/metro-babel-transformer' │ '0.74.0' │ │ 15 │ '❌' │ 'react-native/bots' │ '0.0.0' │ │ 16 │ '✅' │ 'react-native/codegen' │ '0.74.0' │ │ 17 │ '❌' │ 'react-native/codegen-typescript-test' │ '0.0.1' │ │ 18 │ '✅' │ 'react-native/gradle-plugin' │ '0.74.0' │ │ 19 │ '❌' │ 'react-native/tester' │ '0.0.1' │ │ 20 │ '❌' │ 'react-native/tester-e2e' │ '0.0.1' │ │ 21 │ '✅' │ 'react-native/typescript-config' │ '0.74.0' │ │ 22 │ '✅' │ 'react-native/virtualized-lists' │ '0.74.0' │ └─────────┴─────────┴─────────────────────────────────────────┴────────────────┘ ✨ Done in 0.55s. ``` Also added filter flag for private/public ``` ❯ yarn print-packages --type private yarn run v1.22.19 $ node ./scripts/monorepo/print --type private ┌─────────┬─────────┬─────────────────────────────────────────┬────────────────┐ │ (index) │ Public? │ Name │ Version (main) │ ├─────────┼─────────┼─────────────────────────────────────────┼────────────────┤ │ 0 │ '❌' │ 'react-native/hermes-inspector-msggen' │ '0.72.0' │ │ 1 │ '❌' │ 'react-native/bots' │ '0.0.0' │ │ 2 │ '❌' │ 'react-native/codegen-typescript-test' │ '0.0.1' │ │ 3 │ '❌' │ 'react-native/tester' │ '0.0.1' │ │ 4 │ '❌' │ 'react-native/tester-e2e' │ '0.0.1' │ └─────────┴─────────┴─────────────────────────────────────────┴────────────────┘ ✨ Done in 0.16s. ``` Also added a npm query where you can see the latest published version of a minor ``` ❯ yarn print-packages --type public --minor 72 yarn run v1.22.19 $ node ./scripts/monorepo/print --type public --minor 72 ┌─────────┬─────────┬─────────────────────────────────────────┬────────────────┬──────────────────────────────────────┐ │ (index) │ Public? │ Name │ Version (main) │ Version (72) │ ├─────────┼─────────┼─────────────────────────────────────────┼────────────────┼──────────────────────────────────────┤ │ 0 │ '✅' │ 'react-native/assets-registry' │ '0.74.0' │ '0.72.0' │ │ 1 │ '✅' │ 'react-native/babel-plugin-codegen' │ '0.74.0' │ '0.72.3' │ │ 2 │ '✅' │ 'react-native/community-cli-plugin' │ '0.74.0' │ 'No match found for version ^0.72.0' │ │ 3 │ '✅' │ 'react-native/debugger-frontend' │ '0.74.0' │ 'No match found for version ^0.72.0' │ │ 4 │ '✅' │ 'react-native/dev-middleware' │ '0.74.0' │ 'No match found for version ^0.72.0' │ │ 5 │ '✅' │ 'react-native/eslint-config' │ '0.74.0' │ '0.72.2' │ │ 6 │ '✅' │ 'react-native/eslint-plugin' │ '0.74.0' │ '0.72.0' │ │ 7 │ '✅' │ 'react-native/eslint-plugin-specs' │ '0.74.0' │ '0.72.4' │ │ 8 │ '✅' │ 'react-native/metro-config' │ '0.74.0' │ '0.72.11' │ │ 9 │ '✅' │ 'react-native/normalize-colors' │ '0.74.1' │ '0.72.0' │ │ 10 │ '✅' │ 'react-native/js-polyfills' │ '0.74.0' │ '0.72.1' │ │ 11 │ '✅' │ 'react-native' │ '1000.0.0' │ '0.72.8' │ │ 12 │ '✅' │ 'react-native/babel-preset' │ '0.74.0' │ 'No match found for version ^0.72.0' │ │ 13 │ '✅' │ 'react-native/metro-babel-transformer' │ '0.74.0' │ 'No match found for version ^0.72.0' │ │ 14 │ '✅' │ 'react-native/codegen' │ '0.74.0' │ '0.72.8' │ │ 15 │ '✅' │ 'react-native/gradle-plugin' │ '0.74.0' │ '0.72.11' │ │ 16 │ '✅' │ 'react-native/typescript-config' │ '0.74.0' │ 'No match found for version ^0.72.0' │ │ 17 │ '✅' │ 'react-native/virtualized-lists' │ '0.74.0' │ '0.72.8' │ └─────────┴─────────┴─────────────────────────────────────────┴────────────────┴──────────────────────────────────────┘ ``` Reviewed By: cortinico Differential Revision: D52347140 Pulled By: lunaleaps fbshipit-source-id: 75811730e1afd5aae2d9fba4e437cd0d3d424a90
154 lines
4.6 KiB
JavaScript
154 lines
4.6 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
*/
|
|
|
|
const {
|
|
applyPackageVersions,
|
|
getPackageVersionStrByTag,
|
|
getVersionsBySpec,
|
|
publishPackage,
|
|
} = require('../npm-utils');
|
|
|
|
const execMock = jest.fn();
|
|
jest.mock('shelljs', () => ({
|
|
exec: execMock,
|
|
}));
|
|
|
|
describe('npm-utils', () => {
|
|
beforeEach(() => {
|
|
jest.resetModules();
|
|
jest.resetAllMocks();
|
|
});
|
|
|
|
describe('applyPackageVersions', () => {
|
|
it('should replace package.json with dependencies', () => {
|
|
const originalPackageJson = {
|
|
name: 'my-package',
|
|
dependencies: {
|
|
'my-dependency-a': 'nightly',
|
|
'my-dependency-b': '^1.2.3',
|
|
},
|
|
devDependencies: {
|
|
'my-dev-dependency-a': 'nightly',
|
|
'my-dev-dependency-b': '^1.2.3',
|
|
},
|
|
someOtherField: {
|
|
'my-dependency-a': 'should-be-untouched',
|
|
},
|
|
};
|
|
|
|
const dependencies = {
|
|
'my-dependency-a': '0.72.0-nightly-shortcommit',
|
|
'my-dev-dependency-a': 'updated-version',
|
|
'my-non-existant-dep': 'some-version',
|
|
};
|
|
|
|
const package = applyPackageVersions(originalPackageJson, dependencies);
|
|
expect(package).toEqual({
|
|
name: 'my-package',
|
|
dependencies: {
|
|
'my-dependency-a': '0.72.0-nightly-shortcommit',
|
|
'my-dependency-b': '^1.2.3',
|
|
},
|
|
devDependencies: {
|
|
'my-dev-dependency-a': 'updated-version',
|
|
'my-dev-dependency-b': '^1.2.3',
|
|
},
|
|
someOtherField: {
|
|
'my-dependency-a': 'should-be-untouched',
|
|
},
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('getPackageVersionStrByTag', () => {
|
|
it('should return package version string', () => {
|
|
execMock.mockImplementationOnce(() => ({code: 0, stdout: '0.34.2 \n'}));
|
|
const versionStr = getPackageVersionStrByTag('my-package', 'next');
|
|
expect(versionStr).toBe('0.34.2');
|
|
});
|
|
it('should throw error when invalid result', () => {
|
|
execMock.mockImplementationOnce(() => ({
|
|
code: 1,
|
|
stderr: 'Some error message',
|
|
}));
|
|
|
|
expect(() => {
|
|
getPackageVersionStrByTag('my-package', 'next');
|
|
}).toThrow('Failed to get next version from npm\nSome error message');
|
|
});
|
|
});
|
|
|
|
describe('publishPackage', () => {
|
|
it('should run publish command', () => {
|
|
publishPackage(
|
|
'path/to/my-package',
|
|
{tag: 'latest', otp: 'otp'},
|
|
{silent: true, cwd: 'i/expect/this/to/be/overriden'},
|
|
);
|
|
expect(execMock).toHaveBeenCalledWith(
|
|
'npm publish --tag latest --otp otp',
|
|
{silent: true, cwd: 'path/to/my-package'},
|
|
);
|
|
});
|
|
|
|
it('should run publish command when no execOptions', () => {
|
|
publishPackage('path/to/my-package', {tag: 'latest', otp: 'otp'});
|
|
expect(execMock).toHaveBeenCalledWith(
|
|
'npm publish --tag latest --otp otp',
|
|
{cwd: 'path/to/my-package'},
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('getVersionsBySpec', () => {
|
|
it('should return array when single version returned', () => {
|
|
execMock.mockImplementationOnce(() => ({code: 0, stdout: '"0.72.0" \n'}));
|
|
|
|
const versions = getVersionsBySpec('mypackage', '^0.72.0');
|
|
expect(versions).toEqual(['0.72.0']);
|
|
});
|
|
|
|
it('should return array of versions', () => {
|
|
execMock.mockImplementationOnce(() => ({
|
|
code: 0,
|
|
stdout: '[\n"0.73.0",\n"0.73.1"\n]\n',
|
|
}));
|
|
|
|
const versions = getVersionsBySpec('mypackage', '^0.73.0');
|
|
expect(versions).toEqual(['0.73.0', '0.73.1']);
|
|
});
|
|
|
|
it('should return error summary if E404', () => {
|
|
const error =
|
|
`npm ERR! code E404\n` +
|
|
`npm ERR! 404 No match found for version ^0.72.0\n` +
|
|
`npm ERR! 404\n` +
|
|
`npm ERR! 404 '@react-native/community-cli-plugin@^0.72.0' is not in this registry.\n` +
|
|
`npm ERR! 404\n` +
|
|
`npm ERR! 404 Note that you can also install from a\n` +
|
|
`npm ERR! 404 tarball, folder, http url, or git url.\n` +
|
|
`{\n` +
|
|
` "error": {\n` +
|
|
` "code": "E404",\n` +
|
|
` "summary": "No match found for version ^0.72.0",\n` +
|
|
` "detail": "\n '@react-native/community-cli-plugin@^0.72.0' is not in this registry.\n\nNote that you can also install from a\ntarball, folder, http url, or git url."\n` +
|
|
` }\n` +
|
|
`}\n`;
|
|
execMock.mockImplementationOnce(() => ({
|
|
code: 1,
|
|
stderr: error,
|
|
}));
|
|
|
|
expect(() => {
|
|
getVersionsBySpec('mypackage', '^0.72.0');
|
|
}).toThrow('No match found for version ^0.72.0');
|
|
});
|
|
});
|
|
});
|