diff --git a/packages/react-native-codegen/buck_tests/generate-tests.js b/packages/react-native-codegen/buck_tests/generate-tests.js index 2681bddc64a..02e44a3524d 100644 --- a/packages/react-native-codegen/buck_tests/generate-tests.js +++ b/packages/react-native-codegen/buck_tests/generate-tests.js @@ -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', ], }, ); diff --git a/packages/react-native-codegen/src/generators/RNCodegen.js b/packages/react-native-codegen/src/generators/RNCodegen.js index b6f6e02a922..113fb98c962 100644 --- a/packages/react-native-codegen/src/generators/RNCodegen.js +++ b/packages/react-native-codegen/src/generators/RNCodegen.js @@ -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, @@ -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, 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), + ); } } diff --git a/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js b/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js index 067d4cc563e..cf3d0e03fbb 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateComponentDescriptorH.js @@ -48,6 +48,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const fileName = 'ComponentDescriptors.h'; diff --git a/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js b/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js index 4918c93c8b2..978c46887ec 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js @@ -325,6 +325,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const fileName = 'RCTComponentViewHelpers.h'; diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js index 001b0180754..f1e20d59070 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js @@ -168,6 +168,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const moduleComponents: ComponentCollection = Object.keys(schema.modules) .map(moduleName => { diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js index f9e16ec09d7..b9d6c3204c0 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js @@ -236,6 +236,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const moduleComponents: ComponentCollection = Object.keys(schema.modules) .map(moduleName => { diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js index e638d229c8b..1380c768102 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js @@ -86,6 +86,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const fileName = 'Props.cpp'; const allImports: Set = new Set([ diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js index e334bc87269..b84793ca440 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js @@ -756,6 +756,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const fileName = 'Props.h'; diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js index 6563298c614..e1bb022ba4e 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js @@ -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 => { diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js index bcef7753742..a357470ce29 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js @@ -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 => { diff --git a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js index ee19968af3f..2644808cac1 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeCpp.js @@ -45,6 +45,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const fileName = 'ShadowNodes.cpp'; diff --git a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js index 262a04210a9..1855b379d44 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateShadowNodeH.js @@ -55,6 +55,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const fileName = 'ShadowNodes.h'; diff --git a/packages/react-native-codegen/src/generators/components/GenerateTests.js b/packages/react-native-codegen/src/generators/components/GenerateTests.js index 5ffdf8995d6..ab8e00e4534 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateTests.js +++ b/packages/react-native-codegen/src/generators/components/GenerateTests.js @@ -140,6 +140,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const fileName = 'Tests.cpp'; const allImports = new Set([ diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js index 919612328ba..48f70b5b7af 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js @@ -184,6 +184,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const nativeModules = getModules(schema); diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js index 8c45cd4fad3..1f37cc08365 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js @@ -124,6 +124,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const nativeModules = getModules(schema); diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js index b4ae1388b3b..9d2932e1e3d 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js @@ -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) diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js index 16a1678751d..ae2cfddf978 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js @@ -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]]); }, }; diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js index 7c4b7c3e32b..997cd732724 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniH.js @@ -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()}`, }), diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js index a2f9625f454..2d5dfa78ada 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js @@ -114,6 +114,7 @@ module.exports = { libraryName: string, schema: SchemaType, moduleSpecName: string, + packageName?: string, ): FilesOutput { const nativeModules = getModules(schema); diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap index 8f0c4bd09e9..f66fdb0e275 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap @@ -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; diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap index 2e2db08c4cc..932a69b65e4 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap @@ -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 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 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 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 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 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. * diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap index 2230ec994d9..ac403bf8d4b 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniH-test.js.snap @@ -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 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 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 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 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 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 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. diff --git a/scripts/generate-native-modules-specs-cli.js b/scripts/generate-native-modules-specs-cli.js index 64b1e180a37..257ecc84126 100644 --- a/scripts/generate-native-modules-specs-cli.js +++ b/scripts/generate-native-modules-specs-cli.js @@ -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() {