diff --git a/scripts/releases/set-version/__tests__/__fixtures__/package.json b/scripts/releases/set-version/__tests__/__fixtures__/package.json new file mode 100644 index 00000000000000..f8a85180bf959f --- /dev/null +++ b/scripts/releases/set-version/__tests__/__fixtures__/package.json @@ -0,0 +1,8 @@ +{ + "name": "@react-native/monorepo", + "private": true, + "version": "1000.0.0", + "devDependencies": { + "@monorepo/pkg-c": "0.0.1" + } +} diff --git a/scripts/releases/set-version/__tests__/__snapshots__/set-version-test.js.snap b/scripts/releases/set-version/__tests__/__snapshots__/set-version-test.js.snap index d79876340295b9..40393488d604cb 100644 --- a/scripts/releases/set-version/__tests__/__snapshots__/set-version-test.js.snap +++ b/scripts/releases/set-version/__tests__/__snapshots__/set-version-test.js.snap @@ -1,5 +1,17 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`setVersion updates monorepo for nightly: package.json 1`] = ` +"{ + \\"name\\": \\"@react-native/monorepo\\", + \\"private\\": true, + \\"version\\": \\"1000.0.0\\", + \\"devDependencies\\": { + \\"@monorepo/pkg-c\\": \\"0.81.0-nightly-29282302-abcd1234\\" + } +} +" +`; + exports[`setVersion updates monorepo for nightly: packages/monorepo-pkg-a/package.json 1`] = ` "{ \\"name\\": \\"@monorepo/pkg-a\\", @@ -43,126 +55,15 @@ exports[`setVersion updates monorepo for nightly: packages/monorepo-pkg-c/packag " `; -exports[`setVersion updates monorepo for nightly: packages/react-native/Libraries/Core/ReactNativeVersion.js 1`] = ` -"/** - * 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. - * - * @flow strict - * @generated by scripts/releases/set-rn-version.js - */ - -const version: $ReadOnly<{ - major: number, - minor: number, - patch: number, - prerelease: string | null, -}> = { - major: 0, - minor: 81, - patch: 0, - prerelease: 'nightly-29282302-abcd1234', -}; - -module.exports = {version}; -" -`; +exports[`setVersion updates monorepo for nightly: packages/react-native/Libraries/Core/ReactNativeVersion.js 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo for nightly: packages/react-native/React/Base/RCTVersion.m 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -#import \\"RCTVersion.h\\" - -NSString* const RCTVersionMajor = @\\"major\\"; -NSString* const RCTVersionMinor = @\\"minor\\"; -NSString* const RCTVersionPatch = @\\"patch\\"; -NSString* const RCTVersionPrerelease = @\\"prerelease\\"; - - -NSDictionary* RCTGetReactNativeVersion(void) -{ - static NSDictionary* __rnVersion; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^(void){ - __rnVersion = @{ - RCTVersionMajor: @(0), - RCTVersionMinor: @(81), - RCTVersionPatch: @(0), - RCTVersionPrerelease: @\\"nightly-29282302-abcd1234\\", - }; - }); - return __rnVersion; -} -" -`; +exports[`setVersion updates monorepo for nightly: packages/react-native/React/Base/RCTVersion.m 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo for nightly: packages/react-native/ReactAndroid/gradle.properties 1`] = ` -"VERSION_NAME=0.81.0-nightly-29282302-abcd1234 -" -`; - -exports[`setVersion updates monorepo for nightly: packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -package com.facebook.react.modules.systeminfo; - -import com.facebook.react.common.MapBuilder; +exports[`setVersion updates monorepo for nightly: packages/react-native/ReactAndroid/gradle.properties 1`] = `"[omitted]"`; -import java.util.Map; - -public class ReactNativeVersion { - public static final Map VERSION = MapBuilder.of( - \\"major\\", 0, - \\"minor\\", 81, - \\"patch\\", 0, - \\"prerelease\\", \\"nightly-29282302-abcd1234\\"); -} -" -`; +exports[`setVersion updates monorepo for nightly: packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo for nightly: packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -#pragma once - -#include -#include - -namespace facebook::react { - -constexpr struct { - int32_t Major = 0; - int32_t Minor = 81; - int32_t Patch = 0; - std::string_view Prerelease = \\"nightly-29282302-abcd1234\\"; -} ReactNativeVersion; - -} // namespace facebook::react -" -`; +exports[`setVersion updates monorepo for nightly: packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h 1`] = `"[omitted]"`; exports[`setVersion updates monorepo for nightly: packages/react-native/package.json 1`] = ` "{ @@ -199,6 +100,18 @@ exports[`setVersion updates monorepo for nightly: packages/react-native/template " `; +exports[`setVersion updates monorepo for release-candidate: package.json 1`] = ` +"{ + \\"name\\": \\"@react-native/monorepo\\", + \\"private\\": true, + \\"version\\": \\"1000.0.0\\", + \\"devDependencies\\": { + \\"@monorepo/pkg-c\\": \\"0.80.0-rc.3\\" + } +} +" +`; + exports[`setVersion updates monorepo for release-candidate: packages/monorepo-pkg-a/package.json 1`] = ` "{ \\"name\\": \\"@monorepo/pkg-a\\", @@ -242,126 +155,15 @@ exports[`setVersion updates monorepo for release-candidate: packages/monorepo-pk " `; -exports[`setVersion updates monorepo for release-candidate: packages/react-native/Libraries/Core/ReactNativeVersion.js 1`] = ` -"/** - * 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. - * - * @flow strict - * @generated by scripts/releases/set-rn-version.js - */ - -const version: $ReadOnly<{ - major: number, - minor: number, - patch: number, - prerelease: string | null, -}> = { - major: 0, - minor: 80, - patch: 0, - prerelease: 'rc.3', -}; - -module.exports = {version}; -" -`; +exports[`setVersion updates monorepo for release-candidate: packages/react-native/Libraries/Core/ReactNativeVersion.js 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo for release-candidate: packages/react-native/React/Base/RCTVersion.m 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -#import \\"RCTVersion.h\\" - -NSString* const RCTVersionMajor = @\\"major\\"; -NSString* const RCTVersionMinor = @\\"minor\\"; -NSString* const RCTVersionPatch = @\\"patch\\"; -NSString* const RCTVersionPrerelease = @\\"prerelease\\"; - - -NSDictionary* RCTGetReactNativeVersion(void) -{ - static NSDictionary* __rnVersion; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^(void){ - __rnVersion = @{ - RCTVersionMajor: @(0), - RCTVersionMinor: @(80), - RCTVersionPatch: @(0), - RCTVersionPrerelease: @\\"rc.3\\", - }; - }); - return __rnVersion; -} -" -`; +exports[`setVersion updates monorepo for release-candidate: packages/react-native/React/Base/RCTVersion.m 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo for release-candidate: packages/react-native/ReactAndroid/gradle.properties 1`] = ` -"VERSION_NAME=0.80.0-rc.3 -" -`; - -exports[`setVersion updates monorepo for release-candidate: packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -package com.facebook.react.modules.systeminfo; - -import com.facebook.react.common.MapBuilder; +exports[`setVersion updates monorepo for release-candidate: packages/react-native/ReactAndroid/gradle.properties 1`] = `"[omitted]"`; -import java.util.Map; - -public class ReactNativeVersion { - public static final Map VERSION = MapBuilder.of( - \\"major\\", 0, - \\"minor\\", 80, - \\"patch\\", 0, - \\"prerelease\\", \\"rc.3\\"); -} -" -`; +exports[`setVersion updates monorepo for release-candidate: packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo for release-candidate: packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -#pragma once - -#include -#include - -namespace facebook::react { - -constexpr struct { - int32_t Major = 0; - int32_t Minor = 80; - int32_t Patch = 0; - std::string_view Prerelease = \\"rc.3\\"; -} ReactNativeVersion; - -} // namespace facebook::react -" -`; +exports[`setVersion updates monorepo for release-candidate: packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h 1`] = `"[omitted]"`; exports[`setVersion updates monorepo for release-candidate: packages/react-native/package.json 1`] = ` "{ @@ -398,6 +200,18 @@ exports[`setVersion updates monorepo for release-candidate: packages/react-nativ " `; +exports[`setVersion updates monorepo for stable version: package.json 1`] = ` +"{ + \\"name\\": \\"@react-native/monorepo\\", + \\"private\\": true, + \\"version\\": \\"1000.0.0\\", + \\"devDependencies\\": { + \\"@monorepo/pkg-c\\": \\"0.80.1\\" + } +} +" +`; + exports[`setVersion updates monorepo for stable version: packages/monorepo-pkg-a/package.json 1`] = ` "{ \\"name\\": \\"@monorepo/pkg-a\\", @@ -441,126 +255,15 @@ exports[`setVersion updates monorepo for stable version: packages/monorepo-pkg-c " `; -exports[`setVersion updates monorepo for stable version: packages/react-native/Libraries/Core/ReactNativeVersion.js 1`] = ` -"/** - * 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. - * - * @flow strict - * @generated by scripts/releases/set-rn-version.js - */ - -const version: $ReadOnly<{ - major: number, - minor: number, - patch: number, - prerelease: string | null, -}> = { - major: 0, - minor: 80, - patch: 1, - prerelease: null, -}; - -module.exports = {version}; -" -`; +exports[`setVersion updates monorepo for stable version: packages/react-native/Libraries/Core/ReactNativeVersion.js 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo for stable version: packages/react-native/React/Base/RCTVersion.m 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -#import \\"RCTVersion.h\\" - -NSString* const RCTVersionMajor = @\\"major\\"; -NSString* const RCTVersionMinor = @\\"minor\\"; -NSString* const RCTVersionPatch = @\\"patch\\"; -NSString* const RCTVersionPrerelease = @\\"prerelease\\"; - - -NSDictionary* RCTGetReactNativeVersion(void) -{ - static NSDictionary* __rnVersion; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^(void){ - __rnVersion = @{ - RCTVersionMajor: @(0), - RCTVersionMinor: @(80), - RCTVersionPatch: @(1), - RCTVersionPrerelease: [NSNull null], - }; - }); - return __rnVersion; -} -" -`; +exports[`setVersion updates monorepo for stable version: packages/react-native/React/Base/RCTVersion.m 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo for stable version: packages/react-native/ReactAndroid/gradle.properties 1`] = ` -"VERSION_NAME=0.80.1 -" -`; - -exports[`setVersion updates monorepo for stable version: packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -package com.facebook.react.modules.systeminfo; - -import com.facebook.react.common.MapBuilder; +exports[`setVersion updates monorepo for stable version: packages/react-native/ReactAndroid/gradle.properties 1`] = `"[omitted]"`; -import java.util.Map; - -public class ReactNativeVersion { - public static final Map VERSION = MapBuilder.of( - \\"major\\", 0, - \\"minor\\", 80, - \\"patch\\", 1, - \\"prerelease\\", null); -} -" -`; +exports[`setVersion updates monorepo for stable version: packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo for stable version: packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -#pragma once - -#include -#include - -namespace facebook::react { - -constexpr struct { - int32_t Major = 0; - int32_t Minor = 80; - int32_t Patch = 1; - std::string_view Prerelease = \\"\\"; -} ReactNativeVersion; - -} // namespace facebook::react -" -`; +exports[`setVersion updates monorepo for stable version: packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h 1`] = `"[omitted]"`; exports[`setVersion updates monorepo for stable version: packages/react-native/package.json 1`] = ` "{ @@ -597,6 +300,18 @@ exports[`setVersion updates monorepo for stable version: packages/react-native/t " `; +exports[`setVersion updates monorepo on main after release cut: package.json 1`] = ` +"{ + \\"name\\": \\"@react-native/monorepo\\", + \\"private\\": true, + \\"version\\": \\"1000.0.0\\", + \\"devDependencies\\": { + \\"@monorepo/pkg-c\\": \\"0.82.0-main\\" + } +} +" +`; + exports[`setVersion updates monorepo on main after release cut: packages/monorepo-pkg-a/package.json 1`] = ` "{ \\"name\\": \\"@monorepo/pkg-a\\", @@ -640,126 +355,15 @@ exports[`setVersion updates monorepo on main after release cut: packages/monorep " `; -exports[`setVersion updates monorepo on main after release cut: packages/react-native/Libraries/Core/ReactNativeVersion.js 1`] = ` -"/** - * 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. - * - * @flow strict - * @generated by scripts/releases/set-rn-version.js - */ - -const version: $ReadOnly<{ - major: number, - minor: number, - patch: number, - prerelease: string | null, -}> = { - major: 1000, - minor: 0, - patch: 0, - prerelease: null, -}; - -module.exports = {version}; -" -`; +exports[`setVersion updates monorepo on main after release cut: packages/react-native/Libraries/Core/ReactNativeVersion.js 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo on main after release cut: packages/react-native/React/Base/RCTVersion.m 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -#import \\"RCTVersion.h\\" - -NSString* const RCTVersionMajor = @\\"major\\"; -NSString* const RCTVersionMinor = @\\"minor\\"; -NSString* const RCTVersionPatch = @\\"patch\\"; -NSString* const RCTVersionPrerelease = @\\"prerelease\\"; - - -NSDictionary* RCTGetReactNativeVersion(void) -{ - static NSDictionary* __rnVersion; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^(void){ - __rnVersion = @{ - RCTVersionMajor: @(1000), - RCTVersionMinor: @(0), - RCTVersionPatch: @(0), - RCTVersionPrerelease: [NSNull null], - }; - }); - return __rnVersion; -} -" -`; +exports[`setVersion updates monorepo on main after release cut: packages/react-native/React/Base/RCTVersion.m 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo on main after release cut: packages/react-native/ReactAndroid/gradle.properties 1`] = ` -"VERSION_NAME=1000.0.0 -" -`; - -exports[`setVersion updates monorepo on main after release cut: packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -package com.facebook.react.modules.systeminfo; - -import com.facebook.react.common.MapBuilder; +exports[`setVersion updates monorepo on main after release cut: packages/react-native/ReactAndroid/gradle.properties 1`] = `"[omitted]"`; -import java.util.Map; - -public class ReactNativeVersion { - public static final Map VERSION = MapBuilder.of( - \\"major\\", 1000, - \\"minor\\", 0, - \\"patch\\", 0, - \\"prerelease\\", null); -} -" -`; +exports[`setVersion updates monorepo on main after release cut: packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java 1`] = `"[omitted]"`; -exports[`setVersion updates monorepo on main after release cut: packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h 1`] = ` -"/** - * 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. - * - * @generated by scripts/releases/set-rn-version.js - */ - -#pragma once - -#include -#include - -namespace facebook::react { - -constexpr struct { - int32_t Major = 1000; - int32_t Minor = 0; - int32_t Patch = 0; - std::string_view Prerelease = \\"\\"; -} ReactNativeVersion; - -} // namespace facebook::react -" -`; +exports[`setVersion updates monorepo on main after release cut: packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h 1`] = `"[omitted]"`; exports[`setVersion updates monorepo on main after release cut: packages/react-native/package.json 1`] = ` "{ diff --git a/scripts/releases/set-version/__tests__/set-version-test.js b/scripts/releases/set-version/__tests__/set-version-test.js index cb622dfd6ef2f1..5fd12fa24563d9 100644 --- a/scripts/releases/set-version/__tests__/set-version-test.js +++ b/scripts/releases/set-version/__tests__/set-version-test.js @@ -28,13 +28,20 @@ const writeFileMock = jest.fn().mockImplementation((filePath, content) => { customWriteFileExpect(filePath, content); } - expect(content).toMatchSnapshot( - // Make snapshot names resilient to platform path sep differences - path - .relative(path.join(__dirname, '__fixtures__'), filePath) - .split(path.sep) - .join('/'), - ); + const normalizedFilePath = path + .relative(path.join(__dirname, '__fixtures__'), filePath) + .split(path.sep) + .join('/'); + + if (!filePath.endsWith('package.json')) { + // Updated source and build files are already validated in the tests for + // `set-rn-version.js`. We also want to avoid polluting this test's + // snapshots with \@\generated. + expect('[omitted]').toMatchSnapshot(normalizedFilePath); + return; + } + + expect(content).toMatchSnapshot(normalizedFilePath); }); describe('setVersion', () => { diff --git a/scripts/releases/set-version/index.js b/scripts/releases/set-version/index.js index 5a38a8bb274cf7..18572cf7d39744 100644 --- a/scripts/releases/set-version/index.js +++ b/scripts/releases/set-version/index.js @@ -15,7 +15,7 @@ import type {PackageJson} from '../../utils/monorepo'; */ -const {getPackages} = require('../../utils/monorepo'); +const {getPackages, getWorkspaceRoot} = require('../../utils/monorepo'); const {setReactNativeVersion} = require('../set-rn-version'); const {promises: fs} = require('fs'); const path = require('path'); @@ -60,7 +60,7 @@ async function updatePackageJson( * stays 1000.0.0. * * This script does the following: - * - Update all public npm packages under `/packages` to specified version + * - Update all packages under `/packages` to specified version * - Update all npm dependencies of a `/packages` package to specified version * - Update npm dependencies of the template app (`packages/react-native/template`) to specified version * - Update `packages/react-native` native source and build files to specified version if relevant @@ -70,7 +70,7 @@ async function setVersion( skipReactNativeVersion /*: boolean */ = false, ) /*: Promise */ { const packages = await getPackages({ - includePrivate: false, + includePrivate: true, includeReactNative: true, }); const newPackageVersions = Object.fromEntries( @@ -82,11 +82,12 @@ async function setVersion( newPackageVersions, ); - // Exclude the react-native package, since this (and the template) are - // handled by `setReactNativeVersion`. - const packagesToUpdate = Object.values(packages).filter( - pkg => pkg.name !== 'react-native', - ); + const packagesToUpdate = [ + await getWorkspaceRoot(), + // Exclude the react-native package, since this (and the template) are + // handled by `setReactNativeVersion`. + ...Object.values(packages).filter(pkg => pkg.name !== 'react-native'), + ]; await Promise.all( packagesToUpdate.map(({path: packagePath, packageJson}) => diff --git a/scripts/utils/monorepo.js b/scripts/utils/monorepo.js index 627e44b63f2a8b..304ee9c37c2ec1 100644 --- a/scripts/utils/monorepo.js +++ b/scripts/utils/monorepo.js @@ -65,21 +65,7 @@ async function getPackages( ? [] : ['packages/react-native/package.json'], }) - .map(async packageJsonPath => { - const packagePath = path.dirname(packageJsonPath); - const packageJson /*: PackageJson */ = JSON.parse( - await fs.promises.readFile(packageJsonPath, 'utf-8'), - ); - - return [ - packageJson.name, - { - name: packageJson.name, - path: packagePath, - packageJson, - }, - ]; - }), + .map(parsePackageInfo), ); return Object.fromEntries( @@ -89,6 +75,36 @@ async function getPackages( ); } +/** + * Get the parsed package metadata for the workspace root. + */ +async function getWorkspaceRoot() /*: Promise */ { + const [, packageInfo] = await parsePackageInfo( + path.join(REPO_ROOT, 'package.json'), + ); + + return packageInfo; +} + +async function parsePackageInfo( + packageJsonPath /*: string */, +) /*: Promise<[string, PackageInfo]> */ { + const packagePath = path.dirname(packageJsonPath); + const packageJson /*: PackageJson */ = JSON.parse( + await fs.promises.readFile(packageJsonPath, 'utf-8'), + ); + + return [ + packageJson.name, + { + name: packageJson.name, + path: packagePath, + packageJson, + }, + ]; +} + module.exports = { getPackages, + getWorkspaceRoot, };