mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
25c673e357
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/48476 Command param array types were generating invalid schemas due to untyped parser code. The invalid schemas occurred for any alias type, including custom objects and basics like Int32. This was also inconsistent between Flow and TypeScript. We already had one component utilizing this issue, so this just codifies that support into the schema so it reflects reality. This is only a partial solution. The more full solution would be to fully encode the custom types in the schemas like we do for Native Modules. # More Information: Tl;dr, DebuggingOverlay is abusing a FlowFixMe in codegen commands. ## The problem: The [CodegenSchema](https://www.internalfb.com/code/fbsource/[d3ab2f79b377]/xplat/js/react-native-github/packages/react-native-codegen/src/CodegenSchema.js?lines=220) should be the source of truth for anything that can be in the schema. If something is in the schema that isn't allowed by the types, that's a bug. We have a bug. I'm adding compat-check support for components and it's blowing up on prod schemas because DebuggingOverlay causes an invalid schema. ## The details: Support for Arrays as arguments in commands was added to the Codegen in D51866557. [Code Pointer](https://fburl.com/code/8yy1rm0p) The intention appears to be to support arrays of primitives. There is a TODO for supporting complex types. ``` interface NativeCommands { +addOverlays: ( viewRef: React.ElementRef<NativeType>, overlayColorsReadOnly: $ReadOnlyArray<string>, ) } ``` This support was added to TypeScript in D52046165 where it types the allowed Array arguments to be only ``` { readonly type: 'ArrayTypeAnnotation'; readonly elementType: | Int32TypeAnnotation | DoubleTypeAnnotation | FloatTypeAnnotation | BooleanTypeAnnotation | StringTypeAnnotation }; ``` However, because the Parsers are treating the input type as `any`, it isn't safe to pass through an input value into the schema as Flow won't catch mismatches. The Flow parser just passes it through: ``` { type: 'ArrayTypeAnnotation', elementType: { // TODO: T172453752 support complex type annotation for array element type: paramValue.typeParameters.params[0].type, } ``` Whereas the TypeScript parser has the more correct behavior of validating the inputs and returning specific outputs. Unfortunately, the return type is also typed here as $FlowFixMe, losing most of the benefits. ``` function getPrimitiveTypeAnnotation(type: string): $FlowFixMe { switch (type) { case 'Int32': return { type: 'Int32TypeAnnotation', }; case 'Double': return { type: 'DoubleTypeAnnotation', }; case 'Float': return { type: 'FloatTypeAnnotation', }; case 'TSBooleanKeyword': return { type: 'BooleanTypeAnnotation', }; case 'Stringish': case 'TSStringKeyword': return { type: 'StringTypeAnnotation', }; default: throw new Error(`Unknown primitive type "${type}"`); } } ``` [DebuggingOverlay](https://fburl.com/code/zfe3ipq7) is abusing this gap in the Flow parser by sticking an Array of Objects in. ``` export type ElementRectangle = { x: number, y: number, width: number, height: number, }; ... +highlightElements: ( viewRef: React.ElementRef<DebuggingOverlayNativeComponentType>, elements: $ReadOnlyArray<ElementRectangle>, ) => void; ... ``` This isn't allowed in the schema, but it seems to fall through the holes of the flow parser and generators. The resulting schema from Flow is this. Note the GenericTypeAnnotation which isn't allowed to be in the schema. ``` { "name": "highlightElements", "optional": false, "typeAnnotation": { "type": "FunctionTypeAnnotation", "params": [ { "name": "elements", "optional": false, "typeAnnotation": { "type": "ArrayTypeAnnotation", "elementType": { "type": "GenericTypeAnnotation" } } } ], "returnTypeAnnotation": { "type": "VoidTypeAnnotation" } }, ``` The TypeScript parser fails with `Error: Unsupported type annotation: GenericTypeAnnotation`. The generators don't seem to check beyond the ArrayTypeAnnotation so they fall through to generating generic arrays. ``` // ios elements:(const NSArray *)elements // android ReadableArray locations ``` ## So how do I fix this? I think there are a couple of different options here. The key problem is that the Schema types need to represent reality of what can be in the schema. 1. We revert DebuggingOverlay to not use features that aren't supported (I assume nobody would be happy with this, but the change shouldn't have been made in the first place) 2. **(This is the approach taken in this diff)** We add MixedTypeAnnotation to the allowed types in Command arrays and have it generate that and add official support for that to the TypeScript parser as well. That is probably the quickest and easiest approach. It leaves the same type unsafety we have today on the native side. 3. NativeModules seem to have a lot more complex type safety here. They persist the alias type in the schema so that the CompatCheck can check them on changes. And then in C++ they generate structs and RCTConvert functions although for Java and ObjC it looks like they just use the same untyped native code. The matching approach here would be to add `aliasMap` and the whole data to the schema for commands, use that for the compat check, and still generate the same unsafe native code. ``` export type ObjectAlias = {| x: number, y: number, |}; export interface Spec extends TurboModule { +getAlias: (a: ObjectAlias) => string; } ``` stores the ObjectAlias in the schema ``` { "aliasMap": { "ObjectAlias": { "type": "ObjectTypeAnnotation", "properties": [ { "name": "x", "optional": false, "typeAnnotation": { "type": "NumberTypeAnnotation" } }, { "name": "y", "optional": false, "typeAnnotation": { "type": "NumberTypeAnnotation" } }, ] } }, "spec": { "methods": [ { "name": "getAlias", "optional": false, "typeAnnotation": { "type": "FunctionTypeAnnotation", "returnTypeAnnotation": { "type": "StringTypeAnnotation" }, "params": [ { "name": "a", "optional": false, "typeAnnotation": { "type": "TypeAliasTypeAnnotation", "name": "ObjectAlias" } } ] } } ] } } ``` and then generates the appropriate structs on the native side and generates [this](https://www.internalfb.com/code/fbsource/[d3ab2f79b377]/xplat/js/react-native-github/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap?lines=818) ``` Reviewed By: hoxyq Differential Revision: D67806838 fbshipit-source-id: 31f20455c816fdb6b1a86f8f9d0f6f7d0a452754
450 lines
12 KiB
JavaScript
450 lines
12 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow strict
|
|
* @format
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
export type PlatformType = 'iOS' | 'android';
|
|
|
|
export type SchemaType = $ReadOnly<{
|
|
modules: $ReadOnly<{
|
|
[hasteModuleName: string]: ComponentSchema | NativeModuleSchema,
|
|
}>,
|
|
}>;
|
|
|
|
/**
|
|
* Component Type Annotations
|
|
*/
|
|
export type DoubleTypeAnnotation = $ReadOnly<{
|
|
type: 'DoubleTypeAnnotation',
|
|
}>;
|
|
|
|
export type FloatTypeAnnotation = $ReadOnly<{
|
|
type: 'FloatTypeAnnotation',
|
|
}>;
|
|
|
|
export type BooleanTypeAnnotation = $ReadOnly<{
|
|
type: 'BooleanTypeAnnotation',
|
|
}>;
|
|
|
|
export type Int32TypeAnnotation = $ReadOnly<{
|
|
type: 'Int32TypeAnnotation',
|
|
}>;
|
|
|
|
export type NumberLiteralTypeAnnotation = $ReadOnly<{
|
|
type: 'NumberLiteralTypeAnnotation',
|
|
value: number,
|
|
}>;
|
|
|
|
export type StringTypeAnnotation = $ReadOnly<{
|
|
type: 'StringTypeAnnotation',
|
|
}>;
|
|
|
|
export type StringLiteralTypeAnnotation = $ReadOnly<{
|
|
type: 'StringLiteralTypeAnnotation',
|
|
value: string,
|
|
}>;
|
|
|
|
export type StringLiteralUnionTypeAnnotation = $ReadOnly<{
|
|
type: 'StringLiteralUnionTypeAnnotation',
|
|
types: $ReadOnlyArray<StringLiteralTypeAnnotation>,
|
|
}>;
|
|
|
|
export type VoidTypeAnnotation = $ReadOnly<{
|
|
type: 'VoidTypeAnnotation',
|
|
}>;
|
|
|
|
export type ObjectTypeAnnotation<+T> = $ReadOnly<{
|
|
type: 'ObjectTypeAnnotation',
|
|
properties: $ReadOnlyArray<NamedShape<T>>,
|
|
// metadata for objects that generated from interfaces
|
|
baseTypes?: $ReadOnlyArray<string>,
|
|
}>;
|
|
|
|
export type MixedTypeAnnotation = $ReadOnly<{
|
|
type: 'MixedTypeAnnotation',
|
|
}>;
|
|
|
|
export type EventEmitterTypeAnnotation = $ReadOnly<{
|
|
type: 'EventEmitterTypeAnnotation',
|
|
typeAnnotation: NativeModuleEventEmitterTypeAnnotation | $FlowFixMe,
|
|
}>;
|
|
|
|
type FunctionTypeAnnotation<+P, +R> = $ReadOnly<{
|
|
type: 'FunctionTypeAnnotation',
|
|
params: $ReadOnlyArray<NamedShape<P>>,
|
|
returnTypeAnnotation: R,
|
|
}>;
|
|
|
|
export type NamedShape<+T> = $ReadOnly<{
|
|
name: string,
|
|
optional: boolean,
|
|
typeAnnotation: T,
|
|
}>;
|
|
|
|
export type ComponentSchema = $ReadOnly<{
|
|
type: 'Component',
|
|
components: $ReadOnly<{
|
|
[componentName: string]: ComponentShape,
|
|
}>,
|
|
}>;
|
|
|
|
export type ComponentShape = $ReadOnly<{
|
|
...OptionsShape,
|
|
extendsProps: $ReadOnlyArray<ExtendsPropsShape>,
|
|
events: $ReadOnlyArray<EventTypeShape>,
|
|
props: $ReadOnlyArray<NamedShape<PropTypeAnnotation>>,
|
|
commands: $ReadOnlyArray<NamedShape<CommandTypeAnnotation>>,
|
|
}>;
|
|
|
|
export type OptionsShape = $ReadOnly<{
|
|
interfaceOnly?: boolean,
|
|
// Use for components with no current paper rename in progress
|
|
// Does not check for new name
|
|
paperComponentName?: string,
|
|
// Use for components that are not used on other platforms.
|
|
excludedPlatforms?: $ReadOnlyArray<PlatformType>,
|
|
// Use for components currently being renamed in paper
|
|
// Will use new name if it is available and fallback to this name
|
|
paperComponentNameDeprecated?: string,
|
|
}>;
|
|
|
|
export type ExtendsPropsShape = $ReadOnly<{
|
|
type: 'ReactNativeBuiltInType',
|
|
knownTypeName: 'ReactNativeCoreViewProps',
|
|
}>;
|
|
|
|
export type EventTypeShape = $ReadOnly<{
|
|
name: string,
|
|
bubblingType: 'direct' | 'bubble',
|
|
optional: boolean,
|
|
paperTopLevelNameDeprecated?: string,
|
|
typeAnnotation: $ReadOnly<{
|
|
type: 'EventTypeAnnotation',
|
|
argument?: ObjectTypeAnnotation<EventTypeAnnotation>,
|
|
}>,
|
|
}>;
|
|
|
|
export type EventTypeAnnotation =
|
|
| BooleanTypeAnnotation
|
|
| StringTypeAnnotation
|
|
| DoubleTypeAnnotation
|
|
| FloatTypeAnnotation
|
|
| Int32TypeAnnotation
|
|
| MixedTypeAnnotation
|
|
| StringLiteralUnionTypeAnnotation
|
|
| ObjectTypeAnnotation<EventTypeAnnotation>
|
|
| ArrayTypeAnnotation<EventTypeAnnotation>;
|
|
|
|
export type ComponentArrayTypeAnnotation = ArrayTypeAnnotation<
|
|
| BooleanTypeAnnotation
|
|
| StringTypeAnnotation
|
|
| DoubleTypeAnnotation
|
|
| FloatTypeAnnotation
|
|
| Int32TypeAnnotation
|
|
| $ReadOnly<{
|
|
type: 'StringEnumTypeAnnotation',
|
|
default: string,
|
|
options: $ReadOnlyArray<string>,
|
|
}>
|
|
| ObjectTypeAnnotation<PropTypeAnnotation>
|
|
| ReservedPropTypeAnnotation
|
|
| ArrayTypeAnnotation<ObjectTypeAnnotation<PropTypeAnnotation>>,
|
|
>;
|
|
|
|
export type ComponentCommandArrayTypeAnnotation = ArrayTypeAnnotation<
|
|
| BooleanTypeAnnotation
|
|
| StringTypeAnnotation
|
|
| DoubleTypeAnnotation
|
|
| FloatTypeAnnotation
|
|
| Int32TypeAnnotation
|
|
// Mixed is not great. This generally means its a type alias to another type
|
|
// like an object or union. Ideally we'd encode that type in the schema so the compat-check can
|
|
// validate those deeper objects for breaking changes and the generators can do something smarter.
|
|
// As of now, the generators just create ReadableMap or (const NSArray *) which are untyped
|
|
| MixedTypeAnnotation,
|
|
>;
|
|
|
|
export type ArrayTypeAnnotation<+T> = $ReadOnly<{
|
|
type: 'ArrayTypeAnnotation',
|
|
elementType: T,
|
|
}>;
|
|
|
|
export type PropTypeAnnotation =
|
|
| $ReadOnly<{
|
|
type: 'BooleanTypeAnnotation',
|
|
default: boolean | null,
|
|
}>
|
|
| $ReadOnly<{
|
|
type: 'StringTypeAnnotation',
|
|
default: string | null,
|
|
}>
|
|
| $ReadOnly<{
|
|
type: 'DoubleTypeAnnotation',
|
|
default: number,
|
|
}>
|
|
| $ReadOnly<{
|
|
type: 'FloatTypeAnnotation',
|
|
default: number | null,
|
|
}>
|
|
| $ReadOnly<{
|
|
type: 'Int32TypeAnnotation',
|
|
default: number,
|
|
}>
|
|
| $ReadOnly<{
|
|
type: 'StringEnumTypeAnnotation',
|
|
default: string,
|
|
options: $ReadOnlyArray<string>,
|
|
}>
|
|
| $ReadOnly<{
|
|
type: 'Int32EnumTypeAnnotation',
|
|
default: number,
|
|
options: $ReadOnlyArray<number>,
|
|
}>
|
|
| ReservedPropTypeAnnotation
|
|
| ObjectTypeAnnotation<PropTypeAnnotation>
|
|
| ComponentArrayTypeAnnotation
|
|
| MixedTypeAnnotation;
|
|
|
|
export type ReservedPropTypeAnnotation = $ReadOnly<{
|
|
type: 'ReservedPropTypeAnnotation',
|
|
name:
|
|
| 'ColorPrimitive'
|
|
| 'ImageSourcePrimitive'
|
|
| 'PointPrimitive'
|
|
| 'EdgeInsetsPrimitive'
|
|
| 'ImageRequestPrimitive'
|
|
| 'DimensionPrimitive',
|
|
}>;
|
|
|
|
export type CommandTypeAnnotation = FunctionTypeAnnotation<
|
|
CommandParamTypeAnnotation,
|
|
VoidTypeAnnotation,
|
|
>;
|
|
|
|
export type CommandParamTypeAnnotation =
|
|
| ReservedTypeAnnotation
|
|
| BooleanTypeAnnotation
|
|
| Int32TypeAnnotation
|
|
| DoubleTypeAnnotation
|
|
| FloatTypeAnnotation
|
|
| StringTypeAnnotation
|
|
| ComponentCommandArrayTypeAnnotation;
|
|
|
|
export type ReservedTypeAnnotation = $ReadOnly<{
|
|
type: 'ReservedTypeAnnotation',
|
|
name: 'RootTag', // Union with more custom types.
|
|
}>;
|
|
|
|
/**
|
|
* NativeModule Types
|
|
*/
|
|
export type Nullable<+T: NativeModuleTypeAnnotation> =
|
|
| NullableTypeAnnotation<T>
|
|
| T;
|
|
|
|
export type NullableTypeAnnotation<+T: NativeModuleTypeAnnotation> = $ReadOnly<{
|
|
type: 'NullableTypeAnnotation',
|
|
typeAnnotation: T,
|
|
}>;
|
|
|
|
export type NativeModuleSchema = $ReadOnly<{
|
|
type: 'NativeModule',
|
|
aliasMap: NativeModuleAliasMap,
|
|
enumMap: NativeModuleEnumMap,
|
|
spec: NativeModuleSpec,
|
|
moduleName: string,
|
|
// Use for modules that are not used on other platforms.
|
|
// TODO: It's clearer to define `restrictedToPlatforms` instead, but
|
|
// `excludedPlatforms` is used here to be consistent with ComponentSchema.
|
|
excludedPlatforms?: $ReadOnlyArray<PlatformType>,
|
|
}>;
|
|
|
|
type NativeModuleSpec = $ReadOnly<{
|
|
eventEmitters: $ReadOnlyArray<NativeModuleEventEmitterShape>,
|
|
methods: $ReadOnlyArray<NativeModulePropertyShape>,
|
|
}>;
|
|
|
|
export type NativeModuleEventEmitterShape =
|
|
NamedShape<EventEmitterTypeAnnotation>;
|
|
|
|
export type NativeModulePropertyShape = NamedShape<
|
|
Nullable<NativeModuleFunctionTypeAnnotation>,
|
|
>;
|
|
|
|
export type NativeModuleEnumMap = $ReadOnly<{
|
|
[enumName: string]: NativeModuleEnumDeclarationWithMembers,
|
|
}>;
|
|
|
|
export type NativeModuleAliasMap = $ReadOnly<{
|
|
[aliasName: string]: NativeModuleObjectTypeAnnotation,
|
|
}>;
|
|
|
|
export type NativeModuleFunctionTypeAnnotation = FunctionTypeAnnotation<
|
|
Nullable<NativeModuleParamTypeAnnotation>,
|
|
Nullable<NativeModuleReturnTypeAnnotation>,
|
|
>;
|
|
|
|
export type NativeModuleObjectTypeAnnotation = ObjectTypeAnnotation<
|
|
Nullable<NativeModuleBaseTypeAnnotation>,
|
|
>;
|
|
|
|
export type NativeModuleArrayTypeAnnotation<
|
|
+T: Nullable<NativeModuleBaseTypeAnnotation>,
|
|
> = ArrayTypeAnnotation<
|
|
| T
|
|
/**
|
|
* TODO(T72031674): Migrate all our NativeModule specs to not use
|
|
* invalid Array ElementTypes. Then, make the elementType required.
|
|
*/
|
|
| UnsafeAnyTypeAnnotation,
|
|
>;
|
|
|
|
export type UnsafeAnyTypeAnnotation = {
|
|
type: 'AnyTypeAnnotation',
|
|
};
|
|
|
|
export type NativeModuleNumberTypeAnnotation = $ReadOnly<{
|
|
type: 'NumberTypeAnnotation',
|
|
}>;
|
|
|
|
export type NativeModuleEnumMember = {
|
|
name: string,
|
|
value: StringLiteralTypeAnnotation | NumberLiteralTypeAnnotation,
|
|
};
|
|
|
|
export type NativeModuleEnumMemberType =
|
|
| 'NumberTypeAnnotation'
|
|
| 'StringTypeAnnotation';
|
|
|
|
export type NativeModuleEnumDeclaration = $ReadOnly<{
|
|
name: string,
|
|
type: 'EnumDeclaration',
|
|
memberType: NativeModuleEnumMemberType,
|
|
}>;
|
|
|
|
export type NativeModuleEnumDeclarationWithMembers = {
|
|
name: string,
|
|
type: 'EnumDeclarationWithMembers',
|
|
memberType: NativeModuleEnumMemberType,
|
|
members: $ReadOnlyArray<NativeModuleEnumMember>,
|
|
};
|
|
|
|
export type NativeModuleGenericObjectTypeAnnotation = $ReadOnly<{
|
|
type: 'GenericObjectTypeAnnotation',
|
|
// a dictionary type is codegen as "Object"
|
|
// but we know all its members are in the same type
|
|
// when it happens, the following field is non-null
|
|
dictionaryValueType?: Nullable<NativeModuleTypeAnnotation>,
|
|
}>;
|
|
|
|
export type NativeModuleTypeAliasTypeAnnotation = $ReadOnly<{
|
|
type: 'TypeAliasTypeAnnotation',
|
|
name: string,
|
|
}>;
|
|
|
|
export type NativeModulePromiseTypeAnnotation = $ReadOnly<{
|
|
type: 'PromiseTypeAnnotation',
|
|
elementType: VoidTypeAnnotation | Nullable<NativeModuleBaseTypeAnnotation>,
|
|
}>;
|
|
|
|
export type UnionTypeAnnotationMemberType =
|
|
| 'NumberTypeAnnotation'
|
|
| 'ObjectTypeAnnotation'
|
|
| 'StringTypeAnnotation';
|
|
|
|
export type NativeModuleUnionTypeAnnotation = $ReadOnly<{
|
|
type: 'UnionTypeAnnotation',
|
|
memberType: UnionTypeAnnotationMemberType,
|
|
}>;
|
|
|
|
export type NativeModuleMixedTypeAnnotation = $ReadOnly<{
|
|
type: 'MixedTypeAnnotation',
|
|
}>;
|
|
|
|
type NativeModuleEventEmitterBaseTypeAnnotation =
|
|
| BooleanTypeAnnotation
|
|
| DoubleTypeAnnotation
|
|
| FloatTypeAnnotation
|
|
| Int32TypeAnnotation
|
|
| NativeModuleNumberTypeAnnotation
|
|
| NumberLiteralTypeAnnotation
|
|
| StringTypeAnnotation
|
|
| StringLiteralTypeAnnotation
|
|
| StringLiteralUnionTypeAnnotation
|
|
| NativeModuleTypeAliasTypeAnnotation
|
|
| NativeModuleGenericObjectTypeAnnotation
|
|
| VoidTypeAnnotation;
|
|
|
|
export type NativeModuleEventEmitterTypeAnnotation =
|
|
| NativeModuleEventEmitterBaseTypeAnnotation
|
|
| ArrayTypeAnnotation<NativeModuleEventEmitterBaseTypeAnnotation>;
|
|
|
|
export type NativeModuleBaseTypeAnnotation =
|
|
| StringTypeAnnotation
|
|
| StringLiteralTypeAnnotation
|
|
| StringLiteralUnionTypeAnnotation
|
|
| NativeModuleNumberTypeAnnotation
|
|
| NumberLiteralTypeAnnotation
|
|
| Int32TypeAnnotation
|
|
| DoubleTypeAnnotation
|
|
| FloatTypeAnnotation
|
|
| BooleanTypeAnnotation
|
|
| NativeModuleEnumDeclaration
|
|
| NativeModuleGenericObjectTypeAnnotation
|
|
| ReservedTypeAnnotation
|
|
| NativeModuleTypeAliasTypeAnnotation
|
|
| NativeModuleArrayTypeAnnotation<Nullable<NativeModuleBaseTypeAnnotation>>
|
|
| NativeModuleObjectTypeAnnotation
|
|
| NativeModuleUnionTypeAnnotation
|
|
| NativeModuleMixedTypeAnnotation;
|
|
|
|
export type NativeModuleParamTypeAnnotation =
|
|
| NativeModuleBaseTypeAnnotation
|
|
| NativeModuleParamOnlyTypeAnnotation;
|
|
|
|
export type NativeModuleReturnTypeAnnotation =
|
|
| NativeModuleBaseTypeAnnotation
|
|
| NativeModuleReturnOnlyTypeAnnotation;
|
|
|
|
export type NativeModuleTypeAnnotation =
|
|
| NativeModuleBaseTypeAnnotation
|
|
| NativeModuleParamOnlyTypeAnnotation
|
|
| NativeModuleReturnOnlyTypeAnnotation
|
|
| NativeModuleEventEmitterTypeAnnotation;
|
|
|
|
type NativeModuleParamOnlyTypeAnnotation = NativeModuleFunctionTypeAnnotation;
|
|
|
|
type NativeModuleReturnOnlyTypeAnnotation =
|
|
| NativeModulePromiseTypeAnnotation
|
|
| VoidTypeAnnotation;
|
|
|
|
// Add the allowed component reserved types to the native module union
|
|
export type CompleteReservedTypeAnnotation =
|
|
| ReservedTypeAnnotation
|
|
| {
|
|
type: 'ReservedTypeAnnotation',
|
|
name: ReservedPropTypeAnnotation['name'],
|
|
};
|
|
|
|
// Used by compatibility check which needs to handle all possible types
|
|
// This will eventually also include the union of all view manager types
|
|
export type CompleteTypeAnnotation =
|
|
| NativeModuleTypeAnnotation
|
|
| NativeModuleFunctionTypeAnnotation
|
|
| NullableTypeAnnotation<NativeModuleTypeAnnotation>
|
|
| EventEmitterTypeAnnotation
|
|
| NativeModuleEnumDeclarationWithMembers
|
|
| UnsafeAnyTypeAnnotation
|
|
| ArrayTypeAnnotation<CompleteTypeAnnotation>
|
|
| ObjectTypeAnnotation<CompleteTypeAnnotation>
|
|
// Components
|
|
| CommandTypeAnnotation
|
|
| CompleteReservedTypeAnnotation;
|