From 9073817925b06c86a76b61780be7b69e80fde21a Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Wed, 12 Feb 2025 04:20:08 -0800 Subject: [PATCH] Add more test coverage for $ReadOnlyArray in component codegen (#49349) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/49349 Follow-up on D69454101 to add more test coverage for `$ReadOnlyArray` as a component prop. The new type was missing from the CodegenSchema, which revealed some gaps in tests. Changelog: [Internal] Reviewed By: fabriziocucci Differential Revision: D69488035 fbshipit-source-id: 19895e55e5ec4d89a790f1c388de9eea025a316c --- .../src/CodegenSchema.d.ts | 1 + .../react-native-codegen/src/CodegenSchema.js | 1 + .../GeneratePropsJavaPojo/PojoCollector.js | 1 + .../GeneratePropsJavaPojo/serializePojo.js | 6 ++- .../components/__test_fixtures__/fixtures.js | 10 +++++ .../GeneratePropsCpp-test.js.snap | 3 +- .../__snapshots__/GeneratePropsH-test.js.snap | 1 + .../GeneratePropsJavaDelegate-test.js.snap | 3 ++ .../GeneratePropsJavaInterface-test.js.snap | 1 + .../GeneratePropsJavaPojo-test.js.snap | 6 +++ .../GenerateViewConfigJs-test.js.snap | 1 + .../components/__test_fixtures__/fixtures.js | 6 +++ .../component-parser-test.js.snap | 40 +++++++++++++++++++ .../components/__test_fixtures__/fixtures.js | 8 +++- .../typescript-component-parser-test.js.snap | 40 +++++++++++++++++++ 15 files changed, 125 insertions(+), 3 deletions(-) diff --git a/packages/react-native-codegen/src/CodegenSchema.d.ts b/packages/react-native-codegen/src/CodegenSchema.d.ts index a941609790c..2d28bbfe7e2 100644 --- a/packages/react-native-codegen/src/CodegenSchema.d.ts +++ b/packages/react-native-codegen/src/CodegenSchema.d.ts @@ -132,6 +132,7 @@ export type ComponentArrayTypeAnnotation = ArrayTypeAnnotation< | DoubleTypeAnnotation | FloatTypeAnnotation | Int32TypeAnnotation + | MixedTypeAnnotation | { readonly type: 'StringEnumTypeAnnotation'; readonly default: string; diff --git a/packages/react-native-codegen/src/CodegenSchema.js b/packages/react-native-codegen/src/CodegenSchema.js index de92abf1f11..715271472b7 100644 --- a/packages/react-native-codegen/src/CodegenSchema.js +++ b/packages/react-native-codegen/src/CodegenSchema.js @@ -148,6 +148,7 @@ export type ComponentArrayTypeAnnotation = ArrayTypeAnnotation< | DoubleTypeAnnotation | FloatTypeAnnotation | Int32TypeAnnotation + | MixedTypeAnnotation | $ReadOnly<{ type: 'StringEnumTypeAnnotation', default: string, diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/PojoCollector.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/PojoCollector.js index 94ca45d8da9..23cddf45bb2 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/PojoCollector.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/PojoCollector.js @@ -80,6 +80,7 @@ export type PojoTypeAnnotation = | DoubleTypeAnnotation | FloatTypeAnnotation | Int32TypeAnnotation + | MixedTypeAnnotation | $ReadOnly<{ type: 'StringEnumTypeAnnotation', default: string, diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/serializePojo.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/serializePojo.js index 7ca6df11d08..308d33efdba 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/serializePojo.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaPojo/serializePojo.js @@ -148,6 +148,10 @@ function toJavaType( case 'Int32TypeAnnotation': { return 'Integer'; } + case 'MixedTypeAnnotation': { + importDynamic(); + return 'Dynamic'; + } /** * Enums @@ -214,7 +218,7 @@ function toJavaType( default: { (elementType.type: empty); throw new Error( - `Unrecognized PojoTypeAnnotation Array element type annotation '${typeAnnotation.type}'`, + `Unrecognized PojoTypeAnnotation Array element type annotation '${elementType.type}'`, ); } } diff --git a/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js index 3eb0c2d8ce2..7c23413463c 100644 --- a/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js @@ -744,6 +744,16 @@ const ARRAY_PROPS: SchemaType = { }, }, }, + { + name: 'arrayOfMixed', + optional: true, + typeAnnotation: { + type: 'ArrayTypeAnnotation', + elementType: { + type: 'MixedTypeAnnotation', + }, + }, + }, ], commands: [], }, diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap index b4ecbd20494..82ae006837d 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap @@ -36,7 +36,8 @@ ArrayPropsNativeComponentProps::ArrayPropsNativeComponentProps( sizes(convertRawProp(context, rawProps, \\"sizes\\", ArrayPropsNativeComponentSizesMaskWrapped{ .value = sourceProps.sizes }, {static_cast(ArrayPropsNativeComponentSizes::Small)}).value), object(convertRawProp(context, rawProps, \\"object\\", sourceProps.object, {})), array(convertRawProp(context, rawProps, \\"array\\", sourceProps.array, {})), - arrayOfArrayOfObject(convertRawProp(context, rawProps, \\"arrayOfArrayOfObject\\", sourceProps.arrayOfArrayOfObject, {})) + arrayOfArrayOfObject(convertRawProp(context, rawProps, \\"arrayOfArrayOfObject\\", sourceProps.arrayOfArrayOfObject, {})), + arrayOfMixed(convertRawProp(context, rawProps, \\"arrayOfMixed\\", sourceProps.arrayOfMixed, {})) {} } // namespace facebook::react diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap index 94cd317efa4..36b3d1a1277 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap @@ -214,6 +214,7 @@ class ArrayPropsNativeComponentProps final : public ViewProps { std::vector object{}; std::vector array{}; std::vector> arrayOfArrayOfObject{}; + std::vector arrayOfMixed{}; }; } // namespace facebook::react diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap index 4c86a939641..f7c436912a8 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap @@ -63,6 +63,9 @@ public class ArrayPropsNativeComponentManagerDelegate exten void setObject(T view, @Nullable ReadableArray value); void setArray(T view, @Nullable ReadableArray value); void setArrayOfArrayOfObject(T view, @Nullable ReadableArray value); + void setArrayOfMixed(T view, @Nullable ReadableArray value); } ", } diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaPojo-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaPojo-test.js.snap index fe1eaec379e..f84e9d42bac 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaPojo-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaPojo-test.js.snap @@ -106,6 +106,7 @@ public class ArrayPropsNativeComponentPropsArrayOfArrayOfObjectElementElement { package com.facebook.react.viewmanagers.Slider; import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Dynamic; import com.facebook.react.bridge.ReadableMap; import com.facebook.yoga.YogaValue; import java.util.ArrayList; @@ -124,6 +125,7 @@ public class ArrayPropsNativeComponentProps { private ArrayList mObject; private ArrayList mArray; private ArrayList> mArrayOfArrayOfObject; + private ArrayList mArrayOfMixed; @DoNotStrip public ArrayList getNames() { return mNames; @@ -172,6 +174,10 @@ public class ArrayPropsNativeComponentProps { public ArrayList> getArrayOfArrayOfObject() { return mArrayOfArrayOfObject; } + @DoNotStrip + public ArrayList getArrayOfMixed() { + return mArrayOfMixed; + } } ", } diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap index da84fbab1ec..fda12f34e89 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap @@ -41,6 +41,7 @@ export const __INTERNAL_VIEW_CONFIG = { object: true, array: true, arrayOfArrayOfObject: true, + arrayOfMixed: true, }, }; diff --git a/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js index 67dff728002..b96f6f79598 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js @@ -483,6 +483,12 @@ type ModuleProps = $ReadOnly<{| array_object_optional_value: ?ArrayObjectType, array_object_optional_both?: ?$ReadOnlyArray, + // UnsafeMixed props + array_mixed_required: $ReadOnlyArray, + array_mixed_optional_key?: $ReadOnlyArray, + array_mixed_optional_value: ?$ReadOnlyArray, + array_mixed_optional_both?: ?$ReadOnlyArray, + // Nested array object types array_of_array_object_required: $ReadOnlyArray< $ReadOnly<{| diff --git a/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap b/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap index 252dcac9079..b7beece4efa 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap +++ b/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap @@ -1140,6 +1140,46 @@ exports[`RN Codegen Flow Parser can generate fixture ARRAY_PROP_TYPES_NO_EVENTS } } }, + { + 'name': 'array_mixed_required', + 'optional': false, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'MixedTypeAnnotation' + } + } + }, + { + 'name': 'array_mixed_optional_key', + 'optional': true, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'MixedTypeAnnotation' + } + } + }, + { + 'name': 'array_mixed_optional_value', + 'optional': true, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'MixedTypeAnnotation' + } + } + }, + { + 'name': 'array_mixed_optional_both', + 'optional': true, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'MixedTypeAnnotation' + } + } + }, { 'name': 'array_of_array_object_required', 'optional': false, diff --git a/packages/react-native-codegen/src/parsers/typescript/components/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/typescript/components/__test_fixtures__/fixtures.js index 6084d0568ff..23b0feee0c5 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/typescript/components/__test_fixtures__/fixtures.js @@ -386,7 +386,7 @@ const ARRAY_PROP_TYPES_NO_EVENTS = ` const codegenNativeComponent = require('codegenNativeComponent'); -import type {Int32, Double, Float, WithDefault} from 'CodegenTypes'; +import type {Int32, Double, Float, UnsafeMixed, WithDefault} from 'CodegenTypes'; import type {ImageSource} from 'ImageSource'; import type { ColorValue, @@ -479,6 +479,12 @@ export interface ModuleProps extends ViewProps { array_object_optional_value: ArrayObjectType | null | undefined; array_object_optional_both?: ReadonlyArray | null | undefined; + // UnsafeMixed props + array_mixed_required: ReadonlyArray; + array_mixed_optional_key?: ReadonlyArray; + array_mixed_optional_value: ReadonlyArray | null | undefined; + array_mixed_optional_both?: ReadonlyArray | null | undefined; + // Nested array object types array_of_array_object_required: ReadonlyArray< Readonly<{ diff --git a/packages/react-native-codegen/src/parsers/typescript/components/__tests__/__snapshots__/typescript-component-parser-test.js.snap b/packages/react-native-codegen/src/parsers/typescript/components/__tests__/__snapshots__/typescript-component-parser-test.js.snap index a4f7af458de..ffeb7d55dd3 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/__tests__/__snapshots__/typescript-component-parser-test.js.snap +++ b/packages/react-native-codegen/src/parsers/typescript/components/__tests__/__snapshots__/typescript-component-parser-test.js.snap @@ -1138,6 +1138,46 @@ exports[`RN Codegen TypeScript Parser can generate fixture ARRAY_PROP_TYPES_NO_E } } }, + { + 'name': 'array_mixed_required', + 'optional': false, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'MixedTypeAnnotation' + } + } + }, + { + 'name': 'array_mixed_optional_key', + 'optional': true, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'MixedTypeAnnotation' + } + } + }, + { + 'name': 'array_mixed_optional_value', + 'optional': true, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'MixedTypeAnnotation' + } + } + }, + { + 'name': 'array_mixed_optional_both', + 'optional': true, + 'typeAnnotation': { + 'type': 'ArrayTypeAnnotation', + 'elementType': { + 'type': 'MixedTypeAnnotation' + } + } + }, { 'name': 'array_of_array_object_required', 'optional': false,