Codegen: separate Android/Cxx/iOS modules codegen outputs

Summary:
For now, separate the definition of `modules` generator per platform to avoid file output collision. Additionally:
* For Android, produce files under java/ (plus nested subdirs based on packageName) and jni/ (for C++ files) - JavaPoet version already does it
* Allow configuring packageName for Android - JavaPoet version has this
* Avoid tmp directory dance in the CLI script, given the proper modules separation

Changelog: [Internal]

Reviewed By: hramos

Differential Revision: D24410864

fbshipit-source-id: 9bd6bc1d65bec037bfca32ec478f3af50d72e927
This commit is contained in:
Kevin Gozali 2020-10-20 14:09:09 -07:00 коммит произвёл Facebook GitHub Bot
Родитель d03c0f965e
Коммит 13d9927a48
23 изменённых файлов: 109 добавлений и 114 удалений

Просмотреть файл

@ -27,6 +27,7 @@ const schemaPath = args[0];
const libraryName = args[1];
const outputDirectory = args[2];
const moduleSpecName = args[3];
const packageName = args[4];
const schemaText = fs.readFileSync(schemaPath, 'utf-8');
@ -44,7 +45,7 @@ try {
}
RNCodegen.generate(
{libraryName, schema, outputDirectory, moduleSpecName},
{libraryName, schema, outputDirectory, moduleSpecName, packageName},
{
generators: [
'descriptors',
@ -52,7 +53,9 @@ RNCodegen.generate(
'props',
'tests',
'shadow-nodes',
'modules',
'modulesAndroid',
'modulesCxx',
'modulesIOS',
],
},
);

Просмотреть файл

@ -45,6 +45,7 @@ type Options = $ReadOnly<{|
schema: SchemaType,
outputDirectory: string,
moduleSpecName: string,
packageName?: string, // Some platforms have a notion of package, which should be configurable.
|}>;
type Generators =
@ -53,7 +54,9 @@ type Generators =
| 'props'
| 'tests'
| 'shadow-nodes'
| 'modules';
| 'modulesAndroid'
| 'modulesCxx'
| 'modulesIOS';
type Config = $ReadOnly<{|
generators: Array<Generators>,
@ -70,17 +73,14 @@ const GENERATORS = {
generatePropsJavaInterface.generate,
generatePropsJavaDelegate.generate,
],
modules: [
generateModuleCpp.generate,
generateModuleH.generate,
generateModuleObjCpp.generate,
],
// TODO: Refactor this to consolidate various C++ output variation instead of forking Android.
// TODO: Refactor this to consolidate various C++ output variation instead of forking per platform.
modulesAndroid: [
GenerateModuleJniCpp.generate,
GenerateModuleJniH.generate,
generateModuleJavaSpec.generate,
],
modulesCxx: [generateModuleCpp.generate, generateModuleH.generate],
modulesIOS: [generateModuleObjCpp.generate],
tests: [generateTests.generate],
'shadow-nodes': [
generateShadowNodeCpp.generate,
@ -93,6 +93,10 @@ function writeMapToFiles(map: Map<string, string>, outputDir: string) {
map.forEach((contents: string, fileName: string) => {
try {
const location = path.join(outputDir, fileName);
const dirName = path.dirname(location);
if (!fs.existsSync(dirName)) {
fs.mkdirSync(dirName, {recursive: true});
}
fs.writeFileSync(location, contents);
} catch (error) {
success = false;
@ -124,7 +128,13 @@ function checkFilesForChanges(
module.exports = {
generate(
{libraryName, schema, outputDirectory, moduleSpecName}: Options,
{
libraryName,
schema,
outputDirectory,
moduleSpecName,
packageName,
}: Options,
{generators, test}: Config,
): boolean {
schemaValidator.validate(schema);
@ -132,7 +142,9 @@ module.exports = {
const generatedFiles = [];
for (const name of generators) {
for (const generator of GENERATORS[name]) {
generatedFiles.push(...generator(libraryName, schema, moduleSpecName));
generatedFiles.push(
...generator(libraryName, schema, moduleSpecName, packageName),
);
}
}

Просмотреть файл

@ -48,6 +48,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const fileName = 'ComponentDescriptors.h';

Просмотреть файл

@ -325,6 +325,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const fileName = 'RCTComponentViewHelpers.h';

Просмотреть файл

@ -168,6 +168,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const moduleComponents: ComponentCollection = Object.keys(schema.modules)
.map(moduleName => {

Просмотреть файл

@ -236,6 +236,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const moduleComponents: ComponentCollection = Object.keys(schema.modules)
.map(moduleName => {

Просмотреть файл

@ -86,6 +86,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const fileName = 'Props.cpp';
const allImports: Set<string> = new Set([

Просмотреть файл

@ -756,6 +756,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const fileName = 'Props.h';

Просмотреть файл

@ -263,6 +263,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const files = new Map();
Object.keys(schema.modules).forEach(moduleName => {

Просмотреть файл

@ -209,6 +209,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const files = new Map();
Object.keys(schema.modules).forEach(moduleName => {

Просмотреть файл

@ -45,6 +45,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const fileName = 'ShadowNodes.cpp';

Просмотреть файл

@ -55,6 +55,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const fileName = 'ShadowNodes.h';

Просмотреть файл

@ -140,6 +140,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const fileName = 'Tests.cpp';
const allImports = new Set([

Просмотреть файл

@ -184,6 +184,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const nativeModules = getModules(schema);

Просмотреть файл

@ -124,6 +124,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const nativeModules = getModules(schema);

Просмотреть файл

@ -284,10 +284,12 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const files = new Map();
// TODO: Allow package configuration.
const packageName = 'com.facebook.fbreact.specs.beta';
const normalizedPackageName =
packageName != null ? packageName : 'com.facebook.fbreact.specs';
const outputDir = `java/${normalizedPackageName.replace(/\./g, '/')}`;
const nativeModules = getModules(schema);
Object.keys(nativeModules).forEach(hasteModuleName => {
@ -365,9 +367,9 @@ module.exports = {
});
files.set(
`${className}.java`,
`${outputDir}/${className}.java`,
FileTemplate({
packageName,
packageName: normalizedPackageName,
className,
methods: methods.filter(Boolean).join('\n\n'),
imports: Array.from(imports)

Просмотреть файл

@ -356,6 +356,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const nativeModules = getModules(schema);
@ -455,6 +456,6 @@ module.exports = {
moduleLookups,
include: `"${moduleSpecName}.h"`,
});
return new Map([[fileName, replacedTemplate]]);
return new Map([[`jni/${fileName}`, replacedTemplate]]);
},
};

Просмотреть файл

@ -97,6 +97,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const nativeModules = getModules(schema);
const modules = Object.keys(nativeModules)
@ -117,9 +118,9 @@ module.exports = {
libraryName: libraryName,
});
return new Map([
[fileName, replacedTemplate],
[`jni/${fileName}`, replacedTemplate],
[
'Android.mk',
'jni/Android.mk',
AndroidMkTemplate({
libraryName: `react_codegen_${libraryName.toLowerCase()}`,
}),

Просмотреть файл

@ -114,6 +114,7 @@ module.exports = {
libraryName: string,
schema: SchemaType,
moduleSpecName: string,
packageName?: string,
): FilesOutput {
const nativeModules = getModules(schema);

Просмотреть файл

@ -2,7 +2,7 @@
exports[`GenerateModuleJavaSpec can generate fixture COMPLEX_OBJECTS 1`] = `
Map {
"NativeSampleTurboModuleSpec.java" => "
"java/com/facebook/fbreact/specs/NativeSampleTurboModuleSpec.java" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -14,7 +14,7 @@ Map {
* @nolint
*/
package com.facebook.fbreact.specs.beta;
package com.facebook.fbreact.specs;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
@ -49,7 +49,7 @@ public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaMo
exports[`GenerateModuleJavaSpec can generate fixture EMPTY_NATIVE_MODULES 1`] = `
Map {
"NativeSampleTurboModuleSpec.java" => "
"java/com/facebook/fbreact/specs/NativeSampleTurboModuleSpec.java" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -61,7 +61,7 @@ Map {
* @nolint
*/
package com.facebook.fbreact.specs.beta;
package com.facebook.fbreact.specs;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
@ -82,7 +82,7 @@ public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaMo
exports[`GenerateModuleJavaSpec can generate fixture NATIVE_MODULES_WITH_TYPE_ALIASES 1`] = `
Map {
"AliasTurboModuleSpec.java" => "
"java/com/facebook/fbreact/specs/AliasTurboModuleSpec.java" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -94,7 +94,7 @@ Map {
* @nolint
*/
package com.facebook.fbreact.specs.beta;
package com.facebook.fbreact.specs;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
@ -117,7 +117,7 @@ public abstract class AliasTurboModuleSpec extends ReactContextBaseJavaModule im
exports[`GenerateModuleJavaSpec can generate fixture REAL_MODULE_EXAMPLE 1`] = `
Map {
"NativeCameraRollManagerSpec.java" => "
"java/com/facebook/fbreact/specs/NativeCameraRollManagerSpec.java" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -129,7 +129,7 @@ Map {
* @nolint
*/
package com.facebook.fbreact.specs.beta;
package com.facebook.fbreact.specs;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
@ -155,7 +155,7 @@ public abstract class NativeCameraRollManagerSpec extends ReactContextBaseJavaMo
public abstract void deletePhotos(ReadableArray assets, Promise promise);
}
",
"NativeExceptionsManagerSpec.java" => "
"java/com/facebook/fbreact/specs/NativeExceptionsManagerSpec.java" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -167,7 +167,7 @@ public abstract class NativeCameraRollManagerSpec extends ReactContextBaseJavaMo
* @nolint
*/
package com.facebook.fbreact.specs.beta;
package com.facebook.fbreact.specs;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
@ -203,7 +203,7 @@ public abstract class NativeExceptionsManagerSpec extends ReactContextBaseJavaMo
exports[`GenerateModuleJavaSpec can generate fixture SIMPLE_NATIVE_MODULES 1`] = `
Map {
"NativeSampleTurboModuleSpec.java" => "
"java/com/facebook/fbreact/specs/NativeSampleTurboModuleSpec.java" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -215,7 +215,7 @@ Map {
* @nolint
*/
package com.facebook.fbreact.specs.beta;
package com.facebook.fbreact.specs;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Promise;
@ -303,7 +303,7 @@ public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaMo
exports[`GenerateModuleJavaSpec can generate fixture TWO_MODULES_DIFFERENT_FILES 1`] = `
Map {
"NativeSampleTurboModuleSpec.java" => "
"java/com/facebook/fbreact/specs/NativeSampleTurboModuleSpec.java" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -315,7 +315,7 @@ Map {
* @nolint
*/
package com.facebook.fbreact.specs.beta;
package com.facebook.fbreact.specs;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
@ -332,7 +332,7 @@ public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaMo
public abstract void voidFunc();
}
",
"NativeSampleTurboModule2Spec.java" => "
"java/com/facebook/fbreact/specs/NativeSampleTurboModule2Spec.java" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -344,7 +344,7 @@ public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaMo
* @nolint
*/
package com.facebook.fbreact.specs.beta;
package com.facebook.fbreact.specs;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;

Просмотреть файл

@ -2,7 +2,7 @@
exports[`GenerateModuleJniCpp can generate fixture COMPLEX_OBJECTS 1`] = `
Map {
"SampleSpec-generated.cpp" => "
"jni/SampleSpec-generated.cpp" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -56,7 +56,7 @@ std::shared_ptr<TurboModule> COMPLEX_OBJECTS_ModuleProvider(const std::string mo
exports[`GenerateModuleJniCpp can generate fixture EMPTY_NATIVE_MODULES 1`] = `
Map {
"SampleSpec-generated.cpp" => "
"jni/SampleSpec-generated.cpp" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -93,7 +93,7 @@ std::shared_ptr<TurboModule> EMPTY_NATIVE_MODULES_ModuleProvider(const std::stri
exports[`GenerateModuleJniCpp can generate fixture NATIVE_MODULES_WITH_TYPE_ALIASES 1`] = `
Map {
"SampleSpec-generated.cpp" => "
"jni/SampleSpec-generated.cpp" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -134,7 +134,7 @@ std::shared_ptr<TurboModule> NATIVE_MODULES_WITH_TYPE_ALIASES_ModuleProvider(con
exports[`GenerateModuleJniCpp can generate fixture REAL_MODULE_EXAMPLE 1`] = `
Map {
"SampleSpec-generated.cpp" => "
"jni/SampleSpec-generated.cpp" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -216,7 +216,7 @@ std::shared_ptr<TurboModule> REAL_MODULE_EXAMPLE_ModuleProvider(const std::strin
exports[`GenerateModuleJniCpp can generate fixture SIMPLE_NATIVE_MODULES 1`] = `
Map {
"SampleSpec-generated.cpp" => "
"jni/SampleSpec-generated.cpp" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -305,7 +305,7 @@ std::shared_ptr<TurboModule> SIMPLE_NATIVE_MODULES_ModuleProvider(const std::str
exports[`GenerateModuleJniCpp can generate fixture TWO_MODULES_DIFFERENT_FILES 1`] = `
Map {
"SampleSpec-generated.cpp" => "
"jni/SampleSpec-generated.cpp" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*

Просмотреть файл

@ -2,7 +2,7 @@
exports[`GenerateModuleJniH can generate fixture COMPLEX_OBJECTS 1`] = `
Map {
"SampleSpec.h" => "
"jni/SampleSpec.h" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -35,7 +35,7 @@ std::shared_ptr<TurboModule> COMPLEX_OBJECTS_ModuleProvider(const std::string mo
} // namespace react
} // namespace facebook
",
"Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
"jni/Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
@ -68,7 +68,7 @@ include $(BUILD_SHARED_LIBRARY)
exports[`GenerateModuleJniH can generate fixture EMPTY_NATIVE_MODULES 1`] = `
Map {
"SampleSpec.h" => "
"jni/SampleSpec.h" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -101,7 +101,7 @@ std::shared_ptr<TurboModule> EMPTY_NATIVE_MODULES_ModuleProvider(const std::stri
} // namespace react
} // namespace facebook
",
"Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
"jni/Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
@ -134,7 +134,7 @@ include $(BUILD_SHARED_LIBRARY)
exports[`GenerateModuleJniH can generate fixture NATIVE_MODULES_WITH_TYPE_ALIASES 1`] = `
Map {
"SampleSpec.h" => "
"jni/SampleSpec.h" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -167,7 +167,7 @@ std::shared_ptr<TurboModule> NATIVE_MODULES_WITH_TYPE_ALIASES_ModuleProvider(con
} // namespace react
} // namespace facebook
",
"Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
"jni/Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
@ -200,7 +200,7 @@ include $(BUILD_SHARED_LIBRARY)
exports[`GenerateModuleJniH can generate fixture REAL_MODULE_EXAMPLE 1`] = `
Map {
"SampleSpec.h" => "
"jni/SampleSpec.h" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -241,7 +241,7 @@ std::shared_ptr<TurboModule> REAL_MODULE_EXAMPLE_ModuleProvider(const std::strin
} // namespace react
} // namespace facebook
",
"Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
"jni/Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
@ -274,7 +274,7 @@ include $(BUILD_SHARED_LIBRARY)
exports[`GenerateModuleJniH can generate fixture SIMPLE_NATIVE_MODULES 1`] = `
Map {
"SampleSpec.h" => "
"jni/SampleSpec.h" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -307,7 +307,7 @@ std::shared_ptr<TurboModule> SIMPLE_NATIVE_MODULES_ModuleProvider(const std::str
} // namespace react
} // namespace facebook
",
"Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
"jni/Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
@ -340,7 +340,7 @@ include $(BUILD_SHARED_LIBRARY)
exports[`GenerateModuleJniH can generate fixture TWO_MODULES_DIFFERENT_FILES 1`] = `
Map {
"SampleSpec.h" => "
"jni/SampleSpec.h" => "
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
@ -381,7 +381,7 @@ std::shared_ptr<TurboModule> TWO_MODULES_DIFFERENT_FILES_ModuleProvider(const st
} // namespace react
} // namespace facebook
",
"Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
"jni/Android.mk" => "# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.

Просмотреть файл

@ -21,15 +21,19 @@ try {
const fs = require('fs');
const mkdirp = require('mkdirp');
const os = require('os');
const path = require('path');
const GENERATORS = {
android: ['modulesAndroid'],
ios: ['modulesIOS'],
};
function generateSpec(
platform,
schemaPath,
outputDirectory,
libraryName,
javaPackageName,
packageName,
) {
const moduleSpecName = libraryName;
const schemaText = fs.readFileSync(schemaPath, 'utf-8');
@ -38,24 +42,6 @@ function generateSpec(
throw new Error(`Can't find schema at ${schemaPath}`);
}
const tempOutputDirectory = fs.mkdtempSync(
path.join(os.tmpdir(), 'react-native-codegen-'),
);
let schema;
try {
schema = JSON.parse(schemaText);
} catch (err) {
throw new Error(`Can't parse schema to JSON. ${schemaPath}`);
}
RNCodegen.generate(
{libraryName, schema, outputDirectory: tempOutputDirectory, moduleSpecName},
{
generators: platform === 'android' ? ['modulesAndroid'] : ['modules'],
},
);
if (!outputDirectory) {
outputDirectory = path.resolve(
__dirname,
@ -67,49 +53,25 @@ function generateSpec(
}
mkdirp.sync(outputDirectory);
if (platform === 'ios') {
const fileNames = [`${moduleSpecName}.h`, `${moduleSpecName}-generated.mm`];
fileNames.forEach(fileName => {
const newOutput = `${tempOutputDirectory}/${fileName}`;
const prevOutput = `${outputDirectory}/${fileName}`;
fs.copyFileSync(newOutput, prevOutput);
});
} else if (platform === 'android') {
// Copy all .java files for now.
// TODO: Build sufficient support for producing Java package directories based
// on preferred package name.
const files = fs.readdirSync(tempOutputDirectory);
const javaOutputDirectory = `${outputDirectory}/java/${javaPackageName.replace(
/\./g,
'/',
)}`;
mkdirp.sync(javaOutputDirectory);
files
.filter(f => f.endsWith('.java'))
.forEach(f => {
fs.copyFileSync(
`${tempOutputDirectory}/${f}`,
`${javaOutputDirectory}/${f}`,
);
});
// And all C++ files for JNI.
const jniOutputDirectory = `${outputDirectory}/jni`;
mkdirp.sync(jniOutputDirectory);
files
.filter(
f =>
f === 'Android.mk' ||
(f.startsWith(moduleSpecName) &&
(f.endsWith('.h') || f.endsWith('.cpp'))),
)
.forEach(f => {
fs.copyFileSync(
`${tempOutputDirectory}/${f}`,
`${jniOutputDirectory}/${f}`,
);
});
let schema;
try {
schema = JSON.parse(schemaText);
} catch (err) {
throw new Error(`Can't parse schema to JSON. ${schemaPath}`);
}
RNCodegen.generate(
{
libraryName,
schema,
outputDirectory,
moduleSpecName,
packageName,
},
{
generators: GENERATORS[platform],
},
);
}
function main() {