diff --git a/packages/react-native-codegen/src/parsers/flow/index.js b/packages/react-native-codegen/src/parsers/flow/index.js index 0cf479b01b1..23c9a930fda 100644 --- a/packages/react-native-codegen/src/parsers/flow/index.js +++ b/packages/react-native-codegen/src/parsers/flow/index.js @@ -19,13 +19,17 @@ const {buildComponentSchema} = require('./components'); const {wrapComponentSchema} = require('./components/schema'); const {buildModuleSchema} = require('./modules'); const {wrapModuleSchema} = require('./modules/schema'); -const {createParserErrorCapturer, visit} = require('./utils'); +const { + createParserErrorCapturer, + visit, + isModuleRegistryCall, +} = require('./utils'); const invariant = require('invariant'); function getConfigType( // TODO(T71778680): Flow-type this node. ast: $FlowFixMe, -): 'module' | 'component' { +): 'module' | 'component' | 'none' { let isComponent = false; let isModule = false; @@ -37,6 +41,10 @@ function getConfigType( ) { isComponent = true; } + + if (isModuleRegistryCall(node)) { + isModule = true; + } }, InterfaceExtends(node) { if (node.id.name === 'TurboModule') { @@ -56,15 +64,19 @@ function getConfigType( } else if (isComponent) { return 'component'; } else { - throw new Error( - 'File neither contains a module declaration, nor a component declaration. ' + - 'For module declarations, please make sure your file has an InterfaceDeclaration extending TurboModule. ' + - 'For component declarations, please make sure your file has a default export calling the codegenNativeComponent(...) macro.', - ); + return 'none'; } } function buildSchema(contents: string, filename: ?string): SchemaType { + // Early return for non-Spec JavaScript files + if ( + !contents.includes('codegenNativeComponent') && + !contents.includes('TurboModule') + ) { + return {modules: {}}; + } + const ast = flowParser.parse(contents); const configType = getConfigType(ast); @@ -103,8 +115,7 @@ function buildSchema(contents: string, filename: ?string): SchemaType { return wrapModuleSchema(schema, hasteModuleName); } default: - (configType: empty); - throw new Error(`Unsupported config type '${configType}'`); + return {modules: {}}; } } diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap index 2527921cea9..b17885a171e 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap @@ -14,7 +14,7 @@ exports[`RN Codegen Flow Parser Fails with error message NATIVE_MODULES_WITH_UNN exports[`RN Codegen Flow Parser Fails with error message TWO_NATIVE_EXTENDING_TURBO_MODULE 1`] = `"Module NativeSampleTurboModule: Every NativeModule spec file must declare exactly one NativeModule Flow interface. This file declares 2: 'Spec', and 'Spec2'. Please remove the extraneous Flow interface declarations."`; -exports[`RN Codegen Flow Parser Fails with error message TWO_NATIVE_MODULES_EXPORTED_WITH_DEFAULT 1`] = `"File neither contains a module declaration, nor a component declaration. For module declarations, please make sure your file has an InterfaceDeclaration extending TurboModule. For component declarations, please make sure your file has a default export calling the codegenNativeComponent(...) macro."`; +exports[`RN Codegen Flow Parser Fails with error message TWO_NATIVE_MODULES_EXPORTED_WITH_DEFAULT 1`] = `"Module NativeSampleTurboModule: No Flow interfaces extending TurboModule were detected in this NativeModule spec."`; exports[`RN Codegen Flow Parser can generate fixture ANDROID_ONLY_NATIVE_MODULE 1`] = ` "{ diff --git a/packages/react-native-codegen/src/parsers/flow/modules/index.js b/packages/react-native-codegen/src/parsers/flow/modules/index.js index e00d157743a..1d8b7b55f87 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/index.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/index.js @@ -26,7 +26,12 @@ import type {TypeDeclarationMap} from '../utils.js'; import type {ParserErrorCapturer} from '../utils'; import type {NativeModuleTypeAnnotation} from '../../../CodegenSchema.js'; -const {resolveTypeAnnotation, getTypes, visit} = require('../utils.js'); +const { + resolveTypeAnnotation, + getTypes, + visit, + isModuleRegistryCall, +} = require('../utils.js'); const {unwrapNullable, wrapNullable} = require('./utils'); const { IncorrectlyParameterizedFlowGenericParserError, @@ -528,39 +533,6 @@ function buildPropertySchema( }; } -function isModuleRegistryCall(node) { - if (node.type !== 'CallExpression') { - return false; - } - - const callExpression = node; - - if (callExpression.callee.type !== 'MemberExpression') { - return false; - } - - const memberExpression = callExpression.callee; - if ( - !( - memberExpression.object.type === 'Identifier' && - memberExpression.object.name === 'TurboModuleRegistry' - ) - ) { - return false; - } - - if ( - !( - memberExpression.property.type === 'Identifier' && - (memberExpression.property.name === 'get' || - memberExpression.property.name === 'getEnforcing') - ) - ) { - return false; - } - return true; -} - function isModuleInterface(node) { return ( node.type === 'InterfaceDeclaration' && diff --git a/packages/react-native-codegen/src/parsers/flow/utils.js b/packages/react-native-codegen/src/parsers/flow/utils.js index 81532de3838..8f8727a2850 100644 --- a/packages/react-native-codegen/src/parsers/flow/utils.js +++ b/packages/react-native-codegen/src/parsers/flow/utils.js @@ -166,10 +166,45 @@ function visit( } } +// TODO(T71778680): Flow-type ASTNodes. +function isModuleRegistryCall(node: $FlowFixMe): boolean { + if (node.type !== 'CallExpression') { + return false; + } + + const callExpression = node; + + if (callExpression.callee.type !== 'MemberExpression') { + return false; + } + + const memberExpression = callExpression.callee; + if ( + !( + memberExpression.object.type === 'Identifier' && + memberExpression.object.name === 'TurboModuleRegistry' + ) + ) { + return false; + } + + if ( + !( + memberExpression.property.type === 'Identifier' && + (memberExpression.property.name === 'get' || + memberExpression.property.name === 'getEnforcing') + ) + ) { + return false; + } + return true; +} + module.exports = { getValueFromTypes, resolveTypeAnnotation, createParserErrorCapturer, getTypes, visit, + isModuleRegistryCall, };