77import { promises as fs } from "node:fs" ;
88import * as os from "node:os" ;
99import * as path from "node:path" ;
10+ import * as util from "node:util" ;
1011import {
1112 isMain ,
1213 readJSONFile ,
@@ -16,8 +17,10 @@ import {
1617} from "../helpers.js" ;
1718import { fetchPackageMetadata , npmRegistryBaseURL } from "../utils/npm.mjs" ;
1819
20+ /** @typedef {import("../types.js").Manifest } Manifest */
1921/**
20- * @typedef {import("../types.js").Manifest } Manifest
22+ * @template T
23+ * @typedef {{ [P in keyof T]: Required<NonNullable<T[P]>> } } RequiredObject<T>
2124 */
2225
2326const VALID_TAGS = [ "canary-macos" , "canary-windows" , "nightly" ] ;
@@ -343,13 +346,14 @@ async function getProfile(v, coreOnly) {
343346 * Sets specified React Native version.
344347 * @param {string } version
345348 * @param {boolean } coreOnly
349+ * @param {Record<string, string> } [overrides]
346350 * @return {Promise<void> }
347351 */
348- export async function setReactVersion ( version , coreOnly ) {
352+ export async function setReactVersion ( version , coreOnly , overrides = { } ) {
349353 /** @type {fs.FileHandle | undefined } */
350354 let fd ;
351355 try {
352- const profile = await getProfile ( version , coreOnly ) ;
356+ const profile = { ... ( await getProfile ( version , coreOnly ) ) , ... overrides } ;
353357 console . dir ( profile , { depth : null } ) ;
354358
355359 const manifests = [ "package.json" , "example/package.json" ] ;
@@ -394,15 +398,35 @@ export async function setReactVersion(version, coreOnly) {
394398 }
395399}
396400
397- const { [ 1 ] : script , [ 2 ] : version } = process . argv ;
398401if ( isMain ( import . meta. url ) ) {
402+ const { values, positionals } = util . parseArgs ( {
403+ args : process . argv . slice ( 2 ) ,
404+ options : {
405+ "core-only" : {
406+ type : "boolean" ,
407+ default : false ,
408+ } ,
409+ overrides : {
410+ type : "string" ,
411+ default : "{}" ,
412+ } ,
413+ } ,
414+ strict : true ,
415+ allowPositionals : true ,
416+ tokens : false ,
417+ } ) ;
418+
419+ const version = positionals [ 0 ] ;
399420 if ( ! isValidVersion ( version ) ) {
421+ const script = process . argv [ 1 ] ;
400422 console . log (
401423 `Usage: ${ path . basename ( script ) } [<version number> | ${ VALID_TAGS . join ( " | " ) } ]`
402424 ) ;
403425 process . exitCode = 1 ;
404426 } else {
405- setReactVersion ( version , process . argv . includes ( "--core-only" ) ) . then ( ( ) => {
427+ const { "core-only" : coreOnly , overrides } =
428+ /** @type {RequiredObject<typeof values> } */ ( values ) ;
429+ setReactVersion ( version , coreOnly , JSON . parse ( overrides ) ) . then ( ( ) => {
406430 const numVersion = VALID_TAGS . includes ( version )
407431 ? Number . MAX_SAFE_INTEGER
408432 : toVersionNumber ( version ) ;
0 commit comments