xref: /expo/tools/src/Codegen.ts (revision 6239b2d0)
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