chore: Create Codegen throwIfPartialWithMoreParameter function (#36300)

Summary:
This PR creates a Codegen `throwIfPartialWithMoreParameter` function and extracts the error-emitting code from [Flow](https://github.com/facebook/react-native/blob/main/packages/react-native-codegen/src/parsers/flow/modules/index.js#L165-L169) and [Typescript](https://github.com/facebook/react-native/blob/main/packages/react-native-codegen/src/parsers/typescript/modules/index.js#L246-L250) index files as requested on https://github.com/facebook/react-native/issues/34872. This also adds unit tests to the new function.

## Changelog

[Internal] [Changed]  - Create codegen `throwIfPartialWithMoreParameter` function and extract the `error-emitting` code from Flow and Typescript index files.

Pull Request resolved: https://github.com/facebook/react-native/pull/36300

Test Plan:
Run `yarn jest react-native-codegen` and ensure CI is green
![image](https://user-images.githubusercontent.com/11707729/221445922-b2c21ad2-012e-4266-9456-6c781b0de7f0.png)

Reviewed By: cipolleschi

Differential Revision: D43616254

Pulled By: rshest

fbshipit-source-id: 4742aec56598be6bac895809b96d0879c37fcfe1
This commit is contained in:
gabrieldonadel 2023-02-27 03:24:55 -08:00 коммит произвёл Facebook GitHub Bot
Родитель 6e28e2dc99
Коммит 5ff8895c27
4 изменённых файлов: 35 добавлений и 10 удалений

Просмотреть файл

@ -26,6 +26,7 @@ const {
throwIfUnsupportedFunctionParamTypeAnnotationParserError, throwIfUnsupportedFunctionParamTypeAnnotationParserError,
throwIfArrayElementTypeAnnotationIsUnsupported, throwIfArrayElementTypeAnnotationIsUnsupported,
throwIfPartialNotAnnotatingTypeParameter, throwIfPartialNotAnnotatingTypeParameter,
throwIfPartialWithMoreParameter,
} = require('../error-utils'); } = require('../error-utils');
const { const {
UnsupportedModulePropertyParserError, UnsupportedModulePropertyParserError,
@ -796,3 +797,26 @@ describe('throwIfPartialNotAnnotatingTypeParameter', () => {
}).not.toThrowError(); }).not.toThrowError();
}); });
}); });
describe('throwIfPartialWithMoreParameter', () => {
it('throw error if Partial does not have exactly one parameter', () => {
const typeAnnotation = {
type: '',
typeParameters: {params: [{}, {}]},
};
expect(() => {
throwIfPartialWithMoreParameter(typeAnnotation);
}).toThrowError('Partials only support annotating exactly one parameter.');
});
it('does not throw error if Partial has exactly one parameter', () => {
const typeAnnotation = {
type: '',
typeParameters: {params: [{}]},
};
expect(() => {
throwIfPartialWithMoreParameter(typeAnnotation);
}).not.toThrowError();
});
});

Просмотреть файл

@ -296,6 +296,12 @@ function throwIfPartialNotAnnotatingTypeParameter(
} }
} }
function throwIfPartialWithMoreParameter(typeAnnotation: $FlowFixMe) {
if (typeAnnotation.typeParameters.params.length !== 1) {
throw new Error('Partials only support annotating exactly one parameter.');
}
}
module.exports = { module.exports = {
throwIfModuleInterfaceIsMisnamed, throwIfModuleInterfaceIsMisnamed,
throwIfUnsupportedFunctionReturnTypeAnnotationParserError, throwIfUnsupportedFunctionReturnTypeAnnotationParserError,
@ -312,4 +318,5 @@ module.exports = {
throwIfArrayElementTypeAnnotationIsUnsupported, throwIfArrayElementTypeAnnotationIsUnsupported,
throwIfIncorrectModuleRegistryCallArgument, throwIfIncorrectModuleRegistryCallArgument,
throwIfPartialNotAnnotatingTypeParameter, throwIfPartialNotAnnotatingTypeParameter,
throwIfPartialWithMoreParameter,
}; };

Просмотреть файл

@ -70,6 +70,7 @@ const {
throwIfUntypedModule, throwIfUntypedModule,
throwIfMoreThanOneModuleInterfaceParserError, throwIfMoreThanOneModuleInterfaceParserError,
throwIfPartialNotAnnotatingTypeParameter, throwIfPartialNotAnnotatingTypeParameter,
throwIfPartialWithMoreParameter,
} = require('../../error-utils'); } = require('../../error-utils');
const language = 'Flow'; const language = 'Flow';
@ -163,11 +164,7 @@ function translateTypeAnnotation(
return emitGenericObject(nullable); return emitGenericObject(nullable);
} }
case '$Partial': { case '$Partial': {
if (typeAnnotation.typeParameters.params.length !== 1) { throwIfPartialWithMoreParameter(typeAnnotation);
throw new Error(
'Partials only support annotating exactly one parameter.',
);
}
const annotatedElement = parser.extractAnnotatedElement( const annotatedElement = parser.extractAnnotatedElement(
typeAnnotation, typeAnnotation,

Просмотреть файл

@ -76,6 +76,7 @@ const {
throwIfIncorrectModuleRegistryCallTypeParameterParserError, throwIfIncorrectModuleRegistryCallTypeParameterParserError,
throwIfIncorrectModuleRegistryCallArgument, throwIfIncorrectModuleRegistryCallArgument,
throwIfPartialNotAnnotatingTypeParameter, throwIfPartialNotAnnotatingTypeParameter,
throwIfPartialWithMoreParameter,
} = require('../../error-utils'); } = require('../../error-utils');
const language = 'TypeScript'; const language = 'TypeScript';
@ -244,11 +245,7 @@ function translateTypeAnnotation(
return emitGenericObject(nullable); return emitGenericObject(nullable);
} }
case 'Partial': { case 'Partial': {
if (typeAnnotation.typeParameters.params.length !== 1) { throwIfPartialWithMoreParameter(typeAnnotation);
throw new Error(
'Partials only support annotating exactly one parameter.',
);
}
const annotatedElement = parser.extractAnnotatedElement( const annotatedElement = parser.extractAnnotatedElement(
typeAnnotation, typeAnnotation,