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:
Родитель
d03c0f965e
Коммит
13d9927a48
|
@ -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() {
|
||||
|
|
Загрузка…
Ссылка в новой задаче