mirror of
https://github.com/react/react-native.git
synced 2026-11-01 03:23:17 +08:00
Summary: CodegenSchema exports `NativeModuleMethodParamSchema` and `NativeModuleObjectTypeAnnotationPropertySchema`, which are partials of NativeModule type annotations. This creates unnecessary coupling between the type annotations of CodegenSchema and the files that depend on it. **Actual Problem:** Suppose that we want to rename one of these partials. Then, all imports in all files would have to be updated, even when the actual shape of the composed type annotation wasn't changed. This diff removes these partials, which reduces the surface area of the exports of CodegenSchema.js Changelog: [Internal] Reviewed By: yungsters Differential Revision: D24719396 fbshipit-source-id: c822aaa252f156c524f4ef4917ebb61b1a39ff9e
344 lines
9.0 KiB
JavaScript
344 lines
9.0 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its 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 StringTypeAnnotation = $ReadOnly<{|
|
|
type: 'StringTypeAnnotation',
|
|
|}>;
|
|
|
|
export type StringEnumTypeAnnotation = $ReadOnly<{|
|
|
type: 'StringEnumTypeAnnotation',
|
|
options: $ReadOnlyArray<{|
|
|
name: string,
|
|
|}>,
|
|
|}>;
|
|
|
|
type ObjectTypeAnnotation<+T> = $ReadOnly<{|
|
|
type: 'ObjectTypeAnnotation',
|
|
properties: $ReadOnlyArray<NamedShape<T>>,
|
|
|}>;
|
|
|
|
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
|
|
| StringEnumTypeAnnotation
|
|
| ObjectTypeAnnotation<EventTypeAnnotation>;
|
|
|
|
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<{|
|
|
name: string,
|
|
|}>,
|
|
|}>
|
|
| $ReadOnly<{|
|
|
type: 'Int32EnumTypeAnnotation',
|
|
default: number,
|
|
options: $ReadOnlyArray<{|
|
|
value: number,
|
|
|}>,
|
|
|}>
|
|
| $ReadOnly<{|
|
|
type: 'ReservedPropTypeAnnotation',
|
|
name:
|
|
| 'ColorPrimitive'
|
|
| 'ImageSourcePrimitive'
|
|
| 'PointPrimitive'
|
|
| 'EdgeInsetsPrimitive',
|
|
|}>
|
|
| ObjectTypeAnnotation<PropTypeAnnotation>
|
|
| $ReadOnly<{|
|
|
type: 'ArrayTypeAnnotation',
|
|
elementType:
|
|
| BooleanTypeAnnotation
|
|
| StringTypeAnnotation
|
|
| DoubleTypeAnnotation
|
|
| FloatTypeAnnotation
|
|
| Int32TypeAnnotation
|
|
| $ReadOnly<{|
|
|
type: 'StringEnumTypeAnnotation',
|
|
default: string,
|
|
options: $ReadOnlyArray<{|
|
|
name: string,
|
|
|}>,
|
|
|}>
|
|
| ObjectTypeAnnotation<PropTypeAnnotation>
|
|
| $ReadOnly<{|
|
|
type: 'ReservedPropTypeAnnotation',
|
|
name:
|
|
| 'ColorPrimitive'
|
|
| 'ImageSourcePrimitive'
|
|
| 'PointPrimitive'
|
|
| 'EdgeInsetsPrimitive',
|
|
|}>
|
|
| $ReadOnly<{|
|
|
type: 'ArrayTypeAnnotation',
|
|
elementType: ObjectTypeAnnotation<PropTypeAnnotation>,
|
|
|}>,
|
|
|}>;
|
|
|
|
export type CommandTypeAnnotation = $ReadOnly<{|
|
|
type: 'FunctionTypeAnnotation',
|
|
params: $ReadOnlyArray<CommandFunctionTypeParamAnnotation>,
|
|
|}>;
|
|
|
|
// TODO: Unify this function type annotation with NativeModule schema
|
|
export type CommandFunctionTypeParamAnnotation = $ReadOnly<{|
|
|
name: string,
|
|
typeAnnotation: CommandParamTypeAnnotation,
|
|
|}>;
|
|
|
|
type CommandParamTypeAnnotation =
|
|
| ReservedTypeAnnotation
|
|
| BooleanTypeAnnotation
|
|
| Int32TypeAnnotation
|
|
| DoubleTypeAnnotation
|
|
| FloatTypeAnnotation
|
|
| StringTypeAnnotation;
|
|
|
|
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',
|
|
aliases: NativeModuleAliasMap,
|
|
spec: NativeModuleSpec,
|
|
moduleNames: $ReadOnlyArray<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<{|
|
|
properties: $ReadOnlyArray<NativeModulePropertySchema>,
|
|
|}>;
|
|
|
|
export type NativeModulePropertySchema = NamedShape<
|
|
Nullable<NativeModuleFunctionTypeAnnotation>,
|
|
>;
|
|
|
|
export type NativeModuleAliasMap = $ReadOnly<{|
|
|
[aliasName: string]: NativeModuleObjectTypeAnnotation,
|
|
|}>;
|
|
|
|
export type NativeModuleFunctionTypeAnnotation = $ReadOnly<{|
|
|
type: 'FunctionTypeAnnotation',
|
|
params: $ReadOnlyArray<NamedShape<Nullable<NativeModuleParamTypeAnnotation>>>,
|
|
returnTypeAnnotation: Nullable<NativeModuleReturnTypeAnnotation>,
|
|
|}>;
|
|
|
|
export type NativeModuleObjectTypeAnnotation = ObjectTypeAnnotation<
|
|
Nullable<NativeModuleBaseTypeAnnotation>,
|
|
>;
|
|
|
|
export type NativeModuleArrayTypeAnnotation<
|
|
+T: Nullable<NativeModuleBaseTypeAnnotation>,
|
|
> = $ReadOnly<{|
|
|
type: 'ArrayTypeAnnotation',
|
|
/**
|
|
* TODO(T72031674): Migrate all our NativeModule specs to not use
|
|
* invalid Array ElementTypes. Then, make the elementType required.
|
|
*/
|
|
elementType?: T,
|
|
|}>;
|
|
|
|
export type NativeModuleStringTypeAnnotation = $ReadOnly<{|
|
|
type: 'StringTypeAnnotation',
|
|
|}>;
|
|
|
|
export type NativeModuleNumberTypeAnnotation = $ReadOnly<{|
|
|
type: 'NumberTypeAnnotation',
|
|
|}>;
|
|
|
|
export type NativeModuleInt32TypeAnnotation = $ReadOnly<{|
|
|
type: 'Int32TypeAnnotation',
|
|
|}>;
|
|
|
|
export type NativeModuleDoubleTypeAnnotation = $ReadOnly<{|
|
|
type: 'DoubleTypeAnnotation',
|
|
|}>;
|
|
|
|
export type NativeModuleFloatTypeAnnotation = $ReadOnly<{|
|
|
type: 'FloatTypeAnnotation',
|
|
|}>;
|
|
|
|
export type NativeModuleBooleanTypeAnnotation = $ReadOnly<{|
|
|
type: 'BooleanTypeAnnotation',
|
|
|}>;
|
|
|
|
export type NativeModuleGenericObjectTypeAnnotation = $ReadOnly<{|
|
|
type: 'GenericObjectTypeAnnotation',
|
|
|}>;
|
|
|
|
export type NativeModuleTypeAliasTypeAnnotation = $ReadOnly<{|
|
|
type: 'TypeAliasTypeAnnotation',
|
|
name: string,
|
|
|}>;
|
|
|
|
export type NativeModulePromiseTypeAnnotation = $ReadOnly<{|
|
|
type: 'PromiseTypeAnnotation',
|
|
|}>;
|
|
|
|
export type NativeModuleVoidTypeAnnotation = $ReadOnly<{|
|
|
type: 'VoidTypeAnnotation',
|
|
|}>;
|
|
|
|
export type NativeModuleBaseTypeAnnotation =
|
|
| NativeModuleStringTypeAnnotation
|
|
| NativeModuleNumberTypeAnnotation
|
|
| NativeModuleInt32TypeAnnotation
|
|
| NativeModuleDoubleTypeAnnotation
|
|
| NativeModuleFloatTypeAnnotation
|
|
| NativeModuleBooleanTypeAnnotation
|
|
| NativeModuleGenericObjectTypeAnnotation
|
|
| ReservedTypeAnnotation
|
|
| NativeModuleTypeAliasTypeAnnotation
|
|
| NativeModuleArrayTypeAnnotation<Nullable<NativeModuleBaseTypeAnnotation>>
|
|
| NativeModuleObjectTypeAnnotation;
|
|
|
|
export type NativeModuleParamTypeAnnotation =
|
|
| NativeModuleBaseTypeAnnotation
|
|
| NativeModuleParamOnlyTypeAnnotation;
|
|
|
|
export type NativeModuleReturnTypeAnnotation =
|
|
| NativeModuleBaseTypeAnnotation
|
|
| NativeModuleReturnOnlyTypeAnnotation;
|
|
|
|
export type NativeModuleTypeAnnotation =
|
|
| NativeModuleBaseTypeAnnotation
|
|
| NativeModuleParamOnlyTypeAnnotation
|
|
| NativeModuleReturnOnlyTypeAnnotation;
|
|
|
|
type NativeModuleParamOnlyTypeAnnotation = NativeModuleFunctionTypeAnnotation;
|
|
type NativeModuleReturnOnlyTypeAnnotation =
|
|
| NativeModulePromiseTypeAnnotation
|
|
| NativeModuleVoidTypeAnnotation;
|