@react-native/compatibility-check
Version:
Check a React Native app's boundary between JS and Native for incompatibilities
166 lines (164 loc) • 5.56 kB
TypeScript
/**
* 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.
*
*
* @format
*/
import type {
CompleteTypeAnnotation,
NamedShape,
NativeModuleEnumMember,
} from "@react-native/codegen/src/CodegenSchema";
type TypeAnnotationComparisonError = {
type: "TypeAnnotationComparisonError";
message: string;
newerAnnotation: CompleteTypeAnnotation;
olderAnnotation: CompleteTypeAnnotation;
previousError?: TypeComparisonError;
};
type TypeInformationComparisonError = {
type: "TypeInformationComparisonError";
message: string;
newerAnnotation: CompleteTypeAnnotation;
olderAnnotation: CompleteTypeAnnotation;
previousError?: TypeComparisonError;
};
type PropertyComparisonError = {
type: "PropertyComparisonError";
message: string;
mismatchedProperties: Array<{
property: string;
fault?: TypeComparisonError;
}>;
previousError?: TypeComparisonError;
};
type PositionalComparisonError = {
type: "PositionalComparisonError";
message: string;
erroneousItems: Array<[number, CompleteTypeAnnotation]>;
previousError?: TypeComparisonError;
};
type MemberComparisonError = {
type: "MemberComparisonError";
message: string;
mismatchedMembers: Array<{ member: string; fault?: TypeComparisonError }>;
previousError?: TypeComparisonError;
};
export type TypeComparisonError =
| TypeAnnotationComparisonError
| TypeInformationComparisonError
| PropertyComparisonError
| PositionalComparisonError
| MemberComparisonError;
export type PositionalComparisonResult = {
typeKind: "stringUnion" | "union" | "intersection" | "parameter" | "tuple";
nestedChanges: Array<[number, number, ComparisonResult]>;
addedElements?: Array<[number, CompleteTypeAnnotation]>;
removedElements?: Array<[number, CompleteTypeAnnotation]>;
};
export type FunctionComparisonResult = {
returnType?: ComparisonResult;
parameterTypes?: PositionalComparisonResult;
};
export type PropertiesComparisonResult = {
addedProperties?: ReadonlyArray<NamedShape<CompleteTypeAnnotation>>;
missingProperties?: ReadonlyArray<NamedShape<CompleteTypeAnnotation>>;
errorProperties?: Array<{ property: string; fault?: TypeComparisonError }>;
madeStrict?: Array<{ property: string; furtherChanges?: ComparisonResult }>;
madeOptional?: Array<{ property: string; furtherChanges?: ComparisonResult }>;
nestedPropertyChanges?: Array<[string, ComparisonResult]>;
};
export type EnumMembersComparisonResult = {
memberKind: "enum";
addedMembers?: Array<NativeModuleEnumMember>;
missingMembers?: Array<NativeModuleEnumMember>;
errorMembers?: Array<{ member: string; fault?: TypeComparisonError }>;
};
export type UnionMembersComparisonResult = {
memberKind: "union";
addedMembers?: Array<CompleteTypeAnnotation>;
missingMembers?: Array<CompleteTypeAnnotation>;
errorMembers?: Array<{ member: string; fault?: TypeComparisonError }>;
};
export type MembersComparisonResult =
| EnumMembersComparisonResult
| UnionMembersComparisonResult;
export type NullableComparisonResult = {
typeRefined: boolean;
optionsReduced: boolean;
interiorLog: null | undefined | ComparisonResult;
newType: null | undefined | CompleteTypeAnnotation;
oldType: null | undefined | CompleteTypeAnnotation;
};
export type ComparisonResult =
| { status: "matching" }
| { status: "skipped" }
| {
status: "nullableChange";
nullableLog: NullableComparisonResult;
errorLog?: TypeComparisonError;
}
| {
status: "properties";
propertyLog: PropertiesComparisonResult;
errorLog?: TypeComparisonError;
}
| {
status: "members";
memberLog: MembersComparisonResult;
errorLog?: TypeComparisonError;
}
| {
status: "functionChange";
functionChangeLog: FunctionComparisonResult;
errorLog?: TypeComparisonError;
}
| {
status: "positionalTypeChange";
changeLog: PositionalComparisonResult;
errorLog?: TypeComparisonError;
}
| { status: "error"; errorLog: TypeComparisonError };
export declare function isPropertyLogEmpty(
result: PropertiesComparisonResult,
): boolean;
export declare function isMemberLogEmpty(
result: MembersComparisonResult,
): boolean;
export declare function isFunctionLogEmpty(
result: FunctionComparisonResult,
): boolean;
export declare function makeError(error: TypeComparisonError): ComparisonResult;
export declare function typeInformationComparisonError(
message: string,
newerAnnotation: CompleteTypeAnnotation,
olderAnnotation: CompleteTypeAnnotation,
previousError?: TypeComparisonError,
): TypeComparisonError;
export declare function typeAnnotationComparisonError(
message: string,
newerAnnotation: CompleteTypeAnnotation,
olderAnnotation: CompleteTypeAnnotation,
previousError?: TypeComparisonError,
): TypeComparisonError;
export declare function propertyComparisonError(
message: string,
mismatchedProperties: Array<{
property: string;
fault?: TypeComparisonError;
}>,
previousError?: TypeComparisonError,
): TypeComparisonError;
export declare function memberComparisonError(
message: string,
mismatchedMembers: Array<{ member: string; fault?: TypeComparisonError }>,
previousError?: TypeComparisonError,
): TypeComparisonError;
export declare function positionalComparisonError(
message: string,
erroneousItems: Array<[number, CompleteTypeAnnotation]>,
previousError?: TypeComparisonError,
): TypeComparisonError;