1a272999eSBartosz Kaszubowskiimport spawnAsync from '@expo/spawn-async'; 21967a7daSKudo Chienimport fs from 'fs-extra'; 31967a7daSKudo Chienimport path from 'path'; 41967a7daSKudo Chien 51967a7daSKudo Chienexport interface ReactNativeCodegenParameters { 61967a7daSKudo Chien // path to `react-native` package 71967a7daSKudo Chien reactNativeRoot: string; 81967a7daSKudo Chien 91967a7daSKudo Chien // path to `react-native-codegen` package 101967a7daSKudo Chien codegenPkgRoot: string; 111967a7daSKudo Chien 121967a7daSKudo Chien // output path for generated code 131967a7daSKudo Chien outputDir: string; 141967a7daSKudo Chien 151967a7daSKudo Chien // library name 161967a7daSKudo Chien name: string; 171967a7daSKudo Chien 181967a7daSKudo Chien // library type 19*6239b2d0SKudo Chien type: 'components' | 'modules' | 'all'; 201967a7daSKudo Chien 211967a7daSKudo Chien // platform for generated code 221967a7daSKudo Chien platform: 'android' | 'ios'; 231967a7daSKudo Chien 241967a7daSKudo Chien // absolute path to library's javascript code 251967a7daSKudo Chien jsSrcsDir: string; 261967a7daSKudo Chien 271967a7daSKudo Chien // keep the intermediate schema.json (default is false) 281967a7daSKudo Chien keepIntermediateSchema?: boolean; 29*6239b2d0SKudo Chien 30*6239b2d0SKudo Chien // java package name 31*6239b2d0SKudo Chien javaPackageName?: string; 321967a7daSKudo Chien} 331967a7daSKudo Chien 349bf0723bSKudo Chienexport async function runReactNativeCodegenAsync(params: ReactNativeCodegenParameters) { 351967a7daSKudo Chien const genSchemaScript = path.join( 361967a7daSKudo Chien params.codegenPkgRoot, 371967a7daSKudo Chien 'lib', 381967a7daSKudo Chien 'cli', 391967a7daSKudo Chien 'combine', 401967a7daSKudo Chien 'combine-js-to-schema-cli.js' 411967a7daSKudo Chien ); 421967a7daSKudo Chien const genCodeScript = path.join(params.reactNativeRoot, 'scripts', 'generate-specs-cli.js'); 431967a7daSKudo Chien 441967a7daSKudo Chien const schemaOutputPath = path.join(params.outputDir, 'schema.json'); 451967a7daSKudo Chien await fs.ensureDir(params.outputDir); 461967a7daSKudo Chien 471967a7daSKudo Chien // generate schema.json from js & flow types 481967a7daSKudo Chien await spawnAsync('node', [genSchemaScript, schemaOutputPath, params.jsSrcsDir]); 491967a7daSKudo Chien 501967a7daSKudo Chien // generate code from schema.json 51*6239b2d0SKudo Chien const genCodeArgs = [ 521967a7daSKudo Chien genCodeScript, 531967a7daSKudo Chien '--platform', 541967a7daSKudo Chien params.platform, 551967a7daSKudo Chien '--schemaPath', 561967a7daSKudo Chien schemaOutputPath, 571967a7daSKudo Chien '--outputDir', 5822b45c56SKudo Chien params.outputDir, 591967a7daSKudo Chien '--libraryName', 601967a7daSKudo Chien params.name, 611967a7daSKudo Chien '--libraryType', 621967a7daSKudo Chien params.type, 63*6239b2d0SKudo Chien ]; 64*6239b2d0SKudo Chien if (params.javaPackageName) { 65*6239b2d0SKudo Chien genCodeArgs.push('--javaPackageName', params.javaPackageName); 66*6239b2d0SKudo Chien } 67*6239b2d0SKudo Chien await spawnAsync('node', genCodeArgs); 681967a7daSKudo Chien 691967a7daSKudo Chien const keepIntermediateSchema = params.keepIntermediateSchema ?? false; 701967a7daSKudo Chien if (!keepIntermediateSchema) { 711967a7daSKudo Chien await fs.remove(schemaOutputPath); 721967a7daSKudo Chien } 731967a7daSKudo Chien} 74