diff --git a/packages/platform-android/src/config/__fixtures__/android.js b/packages/platform-android/src/config/__fixtures__/android.js index d5f603069..2d27da0d6 100644 --- a/packages/platform-android/src/config/__fixtures__/android.js +++ b/packages/platform-android/src/config/__fixtures__/android.js @@ -91,3 +91,145 @@ exports.noPackage = { }, }, }; + +exports.findPackagesClassNameKotlinValid = [ + ` + class SomeExampleKotlinPackage() : ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage : ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage:ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage + : + ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage() : SomeDelegate, OtherDelegate, ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage(val name: String) : SomeDelegate, OtherDelegate, ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage : SomeSuper(), ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, +]; + +exports.findPackagesClassNameKotlinNotValid = [ + ` + class SomeExampleKotlinPackage() { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage { + val package: ReactPackage = ReactPackage() + }`, + ` + class ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, +]; + +exports.findPackagesClassNameJavaValid = [ + ` + class SomeExampleKotlinPackage implements ReactPackage { + + } + `, + ` + class SomeExampleKotlinPackage implements SomePackage, ReactPackage { + + } + `, + ` + class SomeExampleKotlinPackage extends SomeSuper implements SomePackage, ReactPackage { + + } + `, + ` + class SomeExampleKotlinPackage + implements + SomePackage, + ReactPackage { + + } + `, +]; + +exports.findPackagesClassNameJavaNotValid = [ + ` + class SomeExampleKotlinPackage implements SomePackage { + + } + `, + ` + class ReactPackage { + + } + `, + ` + class SomeExampleKotlinPackage extends ReactPackage { + + } + `, + ` + class SomeExampleKotlinPackage { + + } + `, +]; diff --git a/packages/platform-android/src/config/__tests__/findPackageClassName-test.js b/packages/platform-android/src/config/__tests__/findPackageClassName-test.js index f12b6c555..2f70ea374 100644 --- a/packages/platform-android/src/config/__tests__/findPackageClassName-test.js +++ b/packages/platform-android/src/config/__tests__/findPackageClassName-test.js @@ -9,7 +9,7 @@ */ import mocks from '../__fixtures__/android'; -import findPackageClassName from '../findPackageClassName'; +import findPackageClassName, {matchClassName} from '../findPackageClassName'; jest.mock('path'); jest.mock('fs'); @@ -55,3 +55,27 @@ const fs = require('fs'); }); }); }); + +describe('android:FindPackageClassNameRegex', () => { + [ + mocks.findPackagesClassNameKotlinValid, + mocks.findPackagesClassNameJavaValid, + ].forEach(files => { + it('returns the name of the kotlin/java class implementing ReactPackage', () => { + files.forEach(file => { + expect(matchClassName(file)[1]).toBe('SomeExampleKotlinPackage'); + }); + }); + }); + + [ + mocks.findPackagesClassNameKotlinNotValid, + mocks.findPackagesClassNameJavaNotValid, + ].forEach(files => { + it('returns `null` if there are no matches for kotlin/java classes', () => { + files.forEach(file => { + expect(matchClassName(file)).toBeNull(); + }); + }); + }); +}); diff --git a/packages/platform-android/src/config/findPackageClassName.js b/packages/platform-android/src/config/findPackageClassName.js index 6a22310f7..16866ab87 100644 --- a/packages/platform-android/src/config/findPackageClassName.js +++ b/packages/platform-android/src/config/findPackageClassName.js @@ -22,12 +22,19 @@ export default function getPackageClassName(folder) { const packages = files .map(filePath => fs.readFileSync(path.join(folder, filePath), 'utf8')) - .map(file => - file.match( - /class\s+(.+[^\s])(\s+implements\s+|\s*:)[\s,\w]*[^{]*ReactPackage/, - ), - ) + .map(matchClassName) .filter(match => match); return packages.length ? packages[0][1] : null; } + +/** + * Match function that is looking for package's class name in file + * + * @param {String} file Content of file to match + */ +export function matchClassName(file) { + return file.match( + /class\s+(\w+[^(\s]*)[\s\w():]*(\s+implements\s+|:)[\s\w():,]*[^{]*ReactPackage/, + ); +}