Move num(NativeModule flow interface) > 1 error into `buildModuleSchema`
Summary: **Motivation:** After this change, we can show this ParserError using the React Native Module ESLint rule. Previously when we declared more than one NativeModule spec in a file, we incorrectly reported that there were *no* NativeModule specs in the file. Changelog: [Internal] Reviewed By: hramos Differential Revision: D25163299 fbshipit-source-id: 92bc09d09cdbc323e0ac1f317c40a767880f5bc2
This commit is contained in:
Родитель
1de76d2842
Коммит
3e5779ce93
|
@ -77,14 +77,6 @@ function isModule(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (moduleInterfaces.length > 1) {
|
|
||||||
throw new Error(
|
|
||||||
'File contains declarations of more than one module: ' +
|
|
||||||
moduleInterfaces.join(', ') +
|
|
||||||
'. Please declare exactly one module in this file.',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ exports[`RN Codegen Flow Parser Fails with error message NATIVE_MODULES_WITH_REA
|
||||||
|
|
||||||
exports[`RN Codegen Flow Parser Fails with error message NATIVE_MODULES_WITH_UNNAMED_PARAMS 1`] = `"Module NativeSampleTurboModule: All function parameters must be named."`;
|
exports[`RN Codegen Flow Parser Fails with error message NATIVE_MODULES_WITH_UNNAMED_PARAMS 1`] = `"Module NativeSampleTurboModule: All function parameters must be named."`;
|
||||||
|
|
||||||
exports[`RN Codegen Flow Parser Fails with error message TWO_NATIVE_EXTENDING_TURBO_MODULE 1`] = `"File contains declarations of more than one module: Spec, Spec2. Please declare exactly one module in this file."`;
|
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<Props>(...) macro."`;
|
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<Props>(...) macro."`;
|
||||||
|
|
||||||
|
|
|
@ -23,12 +23,33 @@ class MisnamedModuleFlowInterfaceParserError extends ParserError {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ModuleFlowInterfaceNotParserError extends ParserError {
|
class ModuleFlowInterfaceNotFoundParserError extends ParserError {
|
||||||
constructor(hasteModuleName: string, ast: $FlowFixMe) {
|
constructor(hasteModuleName: string, ast: $FlowFixMe) {
|
||||||
super(
|
super(
|
||||||
hasteModuleName,
|
hasteModuleName,
|
||||||
ast,
|
ast,
|
||||||
`Module ${hasteModuleName}: No Flow interfaces extending TurboModule were detected in this NativeNativeModule spec.`,
|
'No Flow interfaces extending TurboModule were detected in this NativeModule spec.',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MoreThanOneModuleFlowInterfaceParserError extends ParserError {
|
||||||
|
constructor(
|
||||||
|
hasteModuleName: string,
|
||||||
|
flowModuleInterfaces: $ReadOnlyArray<$FlowFixMe>,
|
||||||
|
names: $ReadOnlyArray<string>,
|
||||||
|
) {
|
||||||
|
const finalName = names[names.length - 1];
|
||||||
|
const allButLastName = names.slice(0, -1);
|
||||||
|
const quote = x => `'${x}'`;
|
||||||
|
|
||||||
|
const nameStr =
|
||||||
|
allButLastName.map(quote).join(', ') + ', and ' + quote(finalName);
|
||||||
|
|
||||||
|
super(
|
||||||
|
hasteModuleName,
|
||||||
|
flowModuleInterfaces,
|
||||||
|
`Every NativeModule spec file must declare exactly one NativeModule Flow interface. This file declares ${names.length}: ${nameStr}. Please remove the extraneous Flow interface declarations.`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -294,7 +315,8 @@ class IncorrectModuleRegistryCallArgumentTypeParserError extends ParserError {
|
||||||
module.exports = {
|
module.exports = {
|
||||||
IncorrectlyParameterizedFlowGenericParserError,
|
IncorrectlyParameterizedFlowGenericParserError,
|
||||||
MisnamedModuleFlowInterfaceParserError,
|
MisnamedModuleFlowInterfaceParserError,
|
||||||
ModuleFlowInterfaceNotParserError,
|
ModuleFlowInterfaceNotFoundParserError,
|
||||||
|
MoreThanOneModuleFlowInterfaceParserError,
|
||||||
UnnamedFunctionParamParserError,
|
UnnamedFunctionParamParserError,
|
||||||
UnsupportedArrayElementTypeAnnotationParserError,
|
UnsupportedArrayElementTypeAnnotationParserError,
|
||||||
UnsupportedFlowGenericParserError,
|
UnsupportedFlowGenericParserError,
|
||||||
|
|
|
@ -31,7 +31,8 @@ const {unwrapNullable, wrapNullable} = require('./utils');
|
||||||
const {
|
const {
|
||||||
IncorrectlyParameterizedFlowGenericParserError,
|
IncorrectlyParameterizedFlowGenericParserError,
|
||||||
MisnamedModuleFlowInterfaceParserError,
|
MisnamedModuleFlowInterfaceParserError,
|
||||||
ModuleFlowInterfaceNotParserError,
|
ModuleFlowInterfaceNotFoundParserError,
|
||||||
|
MoreThanOneModuleFlowInterfaceParserError,
|
||||||
UnnamedFunctionParamParserError,
|
UnnamedFunctionParamParserError,
|
||||||
UnsupportedArrayElementTypeAnnotationParserError,
|
UnsupportedArrayElementTypeAnnotationParserError,
|
||||||
UnsupportedFlowGenericParserError,
|
UnsupportedFlowGenericParserError,
|
||||||
|
@ -580,8 +581,16 @@ function buildModuleSchema(
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (moduleInterfaceNames.length !== 1) {
|
if (moduleInterfaceNames.length === 0) {
|
||||||
throw new ModuleFlowInterfaceNotParserError(hasteModuleName, ast);
|
throw new ModuleFlowInterfaceNotFoundParserError(hasteModuleName, ast);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (moduleInterfaceNames.length > 1) {
|
||||||
|
throw new MoreThanOneModuleFlowInterfaceParserError(
|
||||||
|
hasteModuleName,
|
||||||
|
moduleInterfaceNames.map(name => types[name]),
|
||||||
|
moduleInterfaceNames,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const [moduleInterfaceName] = moduleInterfaceNames;
|
const [moduleInterfaceName] = moduleInterfaceNames;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче