Socket
Socket
Sign inDemoInstall

@react-native/codegen

Package Overview
Dependencies
Maintainers
11
Versions
408
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@react-native/codegen - npm Package Compare versions

Comparing version 0.72.1 to 0.72.2

lib/CodegenSchema.d.ts

16

lib/cli/combine/combine-js-to-schema.js

@@ -75,8 +75,10 @@ /**

}
const _require = require('../../parsers/utils'),
parseFile = _require.parseFile;
const FlowParser = require('../../parsers/flow');
const TypeScriptParser = require('../../parsers/typescript');
const _require = require('../../parsers/flow/parser'),
FlowParser = _require.FlowParser;
const _require2 = require('../../parsers/typescript/parser'),
TypeScriptParser = _require2.TypeScriptParser;
const fs = require('fs');
const path = require('path');
const flowParser = new FlowParser();
const typescriptParser = new TypeScriptParser();
function combineSchemas(files) {

@@ -93,6 +95,4 @@ return files.reduce(

path.extname(filename) === '.ts' || path.extname(filename) === '.tsx';
const schema = parseFile(
filename,
isTypeScript ? TypeScriptParser.buildSchema : FlowParser.buildSchema,
);
const parser = isTypeScript ? typescriptParser : flowParser;
const schema = parser.parseFile(filename);
if (schema && schema.modules) {

@@ -99,0 +99,0 @@ merged.modules = _objectSpread(

@@ -14,6 +14,8 @@ /**

const path = require('path');
const _require = require('../../parsers/utils'),
parseFile = _require.parseFile;
const FlowParser = require('../../parsers/flow');
const TypeScriptParser = require('../../parsers/typescript');
const _require = require('../../parsers/flow/parser'),
FlowParser = _require.FlowParser;
const _require2 = require('../../parsers/typescript/parser'),
TypeScriptParser = _require2.TypeScriptParser;
const flowParser = new FlowParser();
const typescriptParser = new TypeScriptParser();
function parseFiles(files) {

@@ -23,15 +25,6 @@ files.forEach(filename => {

path.extname(filename) === '.ts' || path.extname(filename) === '.tsx';
console.log(
filename,
JSON.stringify(
parseFile(
filename,
isTypeScript ? TypeScriptParser.buildSchema : FlowParser.buildSchema,
),
null,
2,
),
);
const parser = isTypeScript ? typescriptParser : flowParser;
console.log(filename, JSON.stringify(parser.parseFile(filename), null, 2));
});
}
module.exports = parseFiles;

@@ -42,3 +42,4 @@ /**

type: 'NativeModule',
aliases: {},
aliasMap: {},
enumMap: {},
spec: {

@@ -45,0 +46,0 @@ properties: [

@@ -515,2 +515,31 @@ /**

};
const DIMENSION_PROP = {
modules: {
CustomView: {
type: 'Component',
components: {
DimensionPropNativeComponent: {
extendsProps: [
{
type: 'ReactNativeBuiltInType',
knownTypeName: 'ReactNativeCoreViewProps',
},
],
events: [],
props: [
{
name: 'marginBack',
optional: true,
typeAnnotation: {
type: 'ReservedPropTypeAnnotation',
name: 'DimensionPrimitive',
},
},
],
commands: [],
},
},
},
},
};
const ARRAY_PROPS = {

@@ -604,2 +633,13 @@ modules: {

{
name: 'dimensions',
optional: true,
typeAnnotation: {
type: 'ArrayTypeAnnotation',
elementType: {
type: 'ReservedPropTypeAnnotation',
name: 'DimensionPrimitive',
},
},
},
{
name: 'sizes',

@@ -1627,2 +1667,3 @@ optional: true,

INSETS_PROP,
DIMENSION_PROP,
ARRAY_PROPS,

@@ -1629,0 +1670,0 @@ ARRAY_PROPS_WITH_NESTED_OBJECT,

@@ -16,5 +16,6 @@ /**

getEnumMaskName = _require.getEnumMaskName,
getEnumName = _require.getEnumName,
generateStructName = _require.generateStructName,
getImports = _require.getImports;
const _require2 = require('../Utils'),
getEnumName = _require2.getEnumName;
function getNativeTypeFromAnnotation(componentName, prop, nameParts) {

@@ -41,2 +42,4 @@ const typeAnnotation = prop.typeAnnotation;

return 'EdgeInsets';
case 'DimensionPrimitive':
return 'YGValue';
default:

@@ -165,2 +168,5 @@ typeAnnotation.name;

return;
case 'DimensionPrimitive':
imports.add('#include <yoga/Yoga.h>');
return;
default:

@@ -192,4 +198,7 @@ name;

) {
imports.add('#include <react/renderer/core/propsConversions.h>');
const objectProps = typeAnnotation.elementType.properties;
// $FlowFixMe[incompatible-call] the type is guaranteed to be ObjectTypeAnnotation<PropTypeAnnotation>
const objectImports = getImports(objectProps);
// $FlowFixMe[incompatible-call] the type is guaranteed to be ObjectTypeAnnotation<PropTypeAnnotation>
const localImports = getLocalImports(objectProps);

@@ -196,0 +205,0 @@ // $FlowFixMe[method-unbinding] added when improving typing for this parameters

@@ -13,11 +13,5 @@ /**

function upperCaseFirst(inString) {
if (inString.length === 0) {
return inString;
}
return inString[0].toUpperCase() + inString.slice(1);
}
function toSafeCppString(input) {
return input.split('-').map(upperCaseFirst).join('');
}
const _require = require('../Utils'),
getEnumName = _require.getEnumName,
toSafeCppString = _require.toSafeCppString;
function toIntEnumValueName(propName, value) {

@@ -58,2 +52,5 @@ return `${toSafeCppString(propName)}${value}`;

return;
case 'DimensionPrimitive':
imports.add('#include <react/renderer/components/view/conversions.h>');
return;
default:

@@ -91,6 +88,2 @@ name;

}
function getEnumName(componentName, propName) {
const uppercasedPropName = toSafeCppString(propName);
return `${componentName}${uppercasedPropName}`;
}
function getEnumMaskName(enumName) {

@@ -139,2 +132,4 @@ return `${enumName}Mask`;

return '';
case 'DimensionPrimitive':
return '';
default:

@@ -185,6 +180,4 @@ typeAnnotation.name;

getCppTypeForAnnotation,
getEnumName,
getEnumMaskName,
getImports,
toSafeCppString,
toIntEnumValueName,

@@ -191,0 +184,0 @@ generateStructName,

@@ -41,6 +41,9 @@ /**

implementation,
}) =>
`
}) => {
const capture = implementation.includes('event')
? 'event=std::move(event)'
: '';
return `
void ${className}EventEmitter::${eventName}(${structName} event) const {
dispatchEvent("${dispatchEventName}", [event=std::move(event)](jsi::Runtime &runtime) {
dispatchEvent("${dispatchEventName}", [${capture}](jsi::Runtime &runtime) {
${implementation}

@@ -50,2 +53,3 @@ });

`.trim();
};
const BasicComponentTemplate = ({className, eventName, dispatchEventName}) =>

@@ -52,0 +56,0 @@ `

@@ -16,6 +16,6 @@ /**

getCppTypeForAnnotation = _require.getCppTypeForAnnotation,
toSafeCppString = _require.toSafeCppString,
generateEventStructName = _require.generateEventStructName;
const _require2 = require('../Utils'),
indent = _require2.indent;
indent = _require2.indent,
toSafeCppString = _require2.toSafeCppString;
const FileTemplate = ({componentEmitters}) => `

@@ -22,0 +22,0 @@ /**

@@ -19,6 +19,7 @@ /**

getEnumMaskName = _require2.getEnumMaskName,
getEnumName = _require2.getEnumName,
toSafeCppString = _require2.toSafeCppString,
generateStructName = _require2.generateStructName,
toIntEnumValueName = _require2.toIntEnumValueName;
const _require3 = require('../Utils'),
getEnumName = _require3.getEnumName,
toSafeCppString = _require3.toSafeCppString;
const FileTemplate = ({imports, componentClasses}) => `

@@ -516,4 +517,2 @@ /**

return;
case 'DoubleTypeAnnotation':
return;
case 'ObjectTypeAnnotation':

@@ -520,0 +519,0 @@ const props = property.typeAnnotation.properties;

@@ -107,2 +107,4 @@ /**

return '(ReadableMap) value';
case 'DimensionPrimitive':
return 'DimensionPropConverter.getDimension(value)';
default:

@@ -109,0 +111,0 @@ typeAnnotation.name;

@@ -87,2 +87,5 @@ /**

return '@Nullable ReadableMap value';
case 'DimensionPrimitive':
addNullable(imports);
return '@Nullable YogaValue value';
default:

@@ -89,0 +92,0 @@ typeAnnotation.name;

@@ -20,2 +20,3 @@ /**

const importArrayList = () => addImport('java.util.ArrayList');
const importYogaValue = () => addImport('com.facebook.yoga.YogaValue');
switch (typeAnnotation.type) {

@@ -96,2 +97,6 @@ /**

return '@Nullable ReadableMap';
case 'DimensionPrimitive':
importNullable();
importYogaValue();
return '@Nullable YogaValue';
default:

@@ -180,2 +185,5 @@ typeAnnotation.name;

return 'ReadableMap';
case 'DimensionPrimitive':
importYogaValue();
return 'YogaValue';
default:

@@ -182,0 +190,0 @@ elementType.name;

@@ -14,4 +14,5 @@ /**

const _require = require('./CppHelpers'),
getImports = _require.getImports,
toSafeCppString = _require.toSafeCppString;
getImports = _require.getImports;
const _require2 = require('../Utils'),
toSafeCppString = _require2.toSafeCppString;
const FileTemplate = ({libraryName, imports, componentTests}) =>

@@ -18,0 +19,0 @@ `

@@ -54,3 +54,3 @@ /**

return j.template
.expression`{ process: require('react-native/Libraries/StyleSheet/processColor') }`;
.expression`{ process: require('react-native/Libraries/StyleSheet/processColor').default }`;
case 'ImageSourcePrimitive':

@@ -67,2 +67,4 @@ return j.template

.expression`{ diff: require('react-native/Libraries/Utilities/differ/insetsDiffer') }`;
case 'DimensionPrimitive':
return j.literal(true);
default:

@@ -81,4 +83,5 @@ typeAnnotation.name;

case 'ImageSourcePrimitive':
return j.literal(true);
case 'PointPrimitive':
case 'EdgeInsetsPrimitive':
case 'DimensionPrimitive':
return j.literal(true);

@@ -85,0 +88,0 @@ default:

@@ -63,2 +63,11 @@ /**

return;
case 'DimensionPrimitive':
if (type === 'delegate') {
imports.add(
'import com.facebook.react.bridge.DimensionPropConverter;',
);
} else {
imports.add('import com.facebook.yoga.YogaValue;');
}
return;
default:

@@ -65,0 +74,0 @@ name;

@@ -17,3 +17,4 @@ /**

type: 'NativeModule',
aliases: {},
aliasMap: {},
enumMap: {},
spec: {

@@ -30,3 +31,54 @@ properties: [],

type: 'NativeModule',
aliases: {},
aliasMap: {},
enumMap: {
NumEnum: {
type: 'EnumDeclarationWithMembers',
name: 'NumEnum',
memberType: 'NumberTypeAnnotation',
members: [
{
name: 'ONE',
value: '1',
},
{
name: 'TWO',
value: '2',
},
],
},
FloatEnum: {
type: 'EnumDeclarationWithMembers',
name: 'FloatEnum',
memberType: 'NumberTypeAnnotation',
members: [
{
name: 'POINT_ZERO',
value: '0.0',
},
{
name: 'POINT_ONE',
value: '0.1',
},
{
name: 'POINT_TWO',
value: '0.2',
},
],
},
StringEnum: {
type: 'EnumDeclarationWithMembers',
name: 'StringEnum',
memberType: 'StringTypeAnnotation',
members: [
{
name: 'HELLO',
value: 'hello',
},
{
name: 'GoodBye',
value: 'goodbye',
},
],
},
},
spec: {

@@ -235,2 +287,15 @@ properties: [

{
name: 'getEnumReturn',
optional: false,
typeAnnotation: {
type: 'FunctionTypeAnnotation',
returnTypeAnnotation: {
type: 'EnumDeclaration',
name: 'NumEnum',
memberType: 'NumberTypeAnnotation',
},
params: [],
},
},
{
name: 'getValueWithCallback',

@@ -309,2 +374,3 @@ optional: false,

typeAnnotation: {
name: 'NumEnum',
type: 'EnumDeclaration',

@@ -318,2 +384,3 @@ memberType: 'NumberTypeAnnotation',

typeAnnotation: {
name: 'FloatEnum',
type: 'EnumDeclaration',

@@ -327,2 +394,3 @@ memberType: 'NumberTypeAnnotation',

typeAnnotation: {
name: 'StringEnum',
type: 'EnumDeclaration',

@@ -345,3 +413,4 @@ memberType: 'StringTypeAnnotation',

type: 'NativeModule',
aliases: {},
aliasMap: {},
enumMap: {},
spec: {

@@ -366,3 +435,4 @@ properties: [

type: 'NativeModule',
aliases: {},
aliasMap: {},
enumMap: {},
spec: {

@@ -403,3 +473,4 @@ properties: [

type: 'NativeModule',
aliases: {},
aliasMap: {},
enumMap: {},
spec: {

@@ -769,3 +840,3 @@ properties: [

type: 'NativeModule',
aliases: {
aliasMap: {
Options: {

@@ -860,2 +931,3 @@ type: 'ObjectTypeAnnotation',

},
enumMap: {},
spec: {

@@ -905,3 +977,3 @@ properties: [

type: 'NativeModule',
aliases: {
aliasMap: {
PhotoIdentifierImage: {

@@ -1145,2 +1217,3 @@ type: 'ObjectTypeAnnotation',

},
enumMap: {},
spec: {

@@ -1234,3 +1307,3 @@ properties: [

type: 'NativeModule',
aliases: {
aliasMap: {
StackFrame: {

@@ -1342,2 +1415,3 @@ properties: [

},
enumMap: {},
spec: {

@@ -1503,3 +1577,3 @@ properties: [

type: 'NativeModule',
aliases: {
aliasMap: {
ObjectAlias: {

@@ -1518,2 +1592,53 @@ type: 'ObjectTypeAnnotation',

},
enumMap: {
NumEnum: {
type: 'EnumDeclarationWithMembers',
name: 'NumEnum',
memberType: 'NumberTypeAnnotation',
members: [
{
name: 'ONE',
value: '1',
},
{
name: 'TWO',
value: '2',
},
],
},
FloatEnum: {
type: 'EnumDeclarationWithMembers',
name: 'FloatEnum',
memberType: 'NumberTypeAnnotation',
members: [
{
name: 'POINT_ZERO',
value: '0.0',
},
{
name: 'POINT_ONE',
value: '0.1',
},
{
name: 'POINT_TWO',
value: '0.2',
},
],
},
StringEnum: {
type: 'EnumDeclarationWithMembers',
name: 'StringEnum',
memberType: 'StringTypeAnnotation',
members: [
{
name: 'HELLO',
value: 'hello',
},
{
name: 'GoodBye',
value: 'goodbye',
},
],
},
},
spec: {

@@ -1579,2 +1704,3 @@ properties: [

typeAnnotation: {
name: 'NumEnum',
type: 'EnumDeclaration',

@@ -1588,2 +1714,3 @@ memberType: 'NumberTypeAnnotation',

typeAnnotation: {
name: 'FloatEnum',
type: 'EnumDeclaration',

@@ -1597,2 +1724,3 @@ memberType: 'NumberTypeAnnotation',

typeAnnotation: {
name: 'StringEnum',
type: 'EnumDeclaration',

@@ -1650,2 +1778,15 @@ memberType: 'StringTypeAnnotation',

},
{
name: 'getEnumReturn',
optional: false,
typeAnnotation: {
type: 'FunctionTypeAnnotation',
returnTypeAnnotation: {
type: 'EnumDeclaration',
name: 'NumEnum',
memberType: 'NumberTypeAnnotation',
},
params: [],
},
},
],

@@ -1662,3 +1803,4 @@ },

type: 'NativeModule',
aliases: {},
enumMap: {},
aliasMap: {},
spec: {

@@ -1665,0 +1807,0 @@ properties: [],

@@ -151,3 +151,3 @@ /**

};
function serializeArg(arg, index, resolveAlias) {
function serializeArg(moduleName, arg, index, resolveAlias, enumMap) {
const nullableTypeAnnotation = arg.typeAnnotation,

@@ -242,5 +242,7 @@ optional = arg.optional;

function serializePropertyIntoHostFunction(
moduleName,
hasteModuleName,
property,
resolveAlias,
enumMap,
) {

@@ -255,3 +257,3 @@ const _unwrapNullable3 = unwrapNullable(property.typeAnnotation),

args: propertyTypeAnnotation.params.map((p, i) =>
serializeArg(p, i, resolveAlias),
serializeArg(moduleName, p, i, resolveAlias, enumMap),
),

@@ -266,11 +268,14 @@ });

const nativeModule = nativeModules[hasteModuleName];
const aliases = nativeModule.aliases,
const aliasMap = nativeModule.aliasMap,
enumMap = nativeModule.enumMap,
properties = nativeModule.spec.properties,
moduleName = nativeModule.moduleName;
const resolveAlias = createAliasResolver(aliases);
const resolveAlias = createAliasResolver(aliasMap);
const hostFunctions = properties.map(property =>
serializePropertyIntoHostFunction(
moduleName,
hasteModuleName,
property,
resolveAlias,
enumMap,
),

@@ -277,0 +282,0 @@ );

@@ -81,9 +81,13 @@ /**

}
const _require = require('./Utils'),
createAliasResolver = _require.createAliasResolver,
getModules = _require.getModules;
const _require2 = require('../Utils'),
indent = _require2.indent;
const _require3 = require('../../parsers/parsers-commons'),
unwrapNullable = _require3.unwrapNullable;
const _require = require('../Utils'),
getEnumName = _require.getEnumName,
toSafeCppString = _require.toSafeCppString;
const _require2 = require('./Utils'),
createAliasResolver = _require2.createAliasResolver,
getModules = _require2.getModules,
getAreEnumMembersInteger = _require2.getAreEnumMembersInteger;
const _require3 = require('../Utils'),
indent = _require3.indent;
const _require4 = require('../../parsers/parsers-commons'),
unwrapNullable = _require4.unwrapNullable;
const ModuleClassDeclarationTemplate = ({

@@ -93,4 +97,6 @@ hasteModuleName,

structs,
enums,
}) => {
return `${structs}class JSI_EXPORT ${hasteModuleName}CxxSpecJSI : public TurboModule {
return `${enums}
${structs}class JSI_EXPORT ${hasteModuleName}CxxSpecJSI : public TurboModule {
protected:

@@ -161,2 +167,3 @@ ${hasteModuleName}CxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker);

function translatePrimitiveJSTypeToCpp(
moduleName,
nullableTypeAnnotation,

@@ -166,2 +173,3 @@ optional,

resolveAlias,
enumMap,
) {

@@ -206,3 +214,7 @@ const _unwrapNullable = unwrapNullable(nullableTypeAnnotation),

case 'NumberTypeAnnotation':
return wrap('double');
return getAreEnumMembersInteger(
enumMap[realTypeAnnotation.name].members,
)
? wrap('int')
: wrap('double');
case 'StringTypeAnnotation':

@@ -241,3 +253,3 @@ return wrap('jsi::String');

}
function createStructs(moduleName, aliasMap, resolveAlias) {
function createStructsString(moduleName, aliasMap, resolveAlias, enumMap) {
return Object.keys(aliasMap)

@@ -256,2 +268,18 @@ .map(alias => {

.join(', ');
const paramemterConversion = value.properties
.map((v, i) => {
const translatedParam = translatePrimitiveJSTypeToCpp(
moduleName,
v.typeAnnotation,
false,
typeName =>
`Unsupported type for param "${v.name}". Found: ${typeName}`,
resolveAlias,
enumMap,
);
return ` static ${translatedParam} ${v.name}ToJs(jsi::Runtime &rt, P${i} value) {
return bridging::toJs(rt, value);
}`;
})
.join('\n');
return `#pragma mark - ${structName}

@@ -285,20 +313,25 @@

#ifdef DEBUG
${paramemterConversion}
#endif
static jsi::Object toJs(
jsi::Runtime &rt,
const ${structName}<${templateParameter}> &value) {
auto result = facebook::jsi::Object(rt);
${value.properties
.map((v, i) => {
if (v.optional) {
return ` if (value.${v.name}) {
result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value()));
}`;
} else {
return ` result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}));`;
}
})
.join('\n')}
return result;
}
};
jsi::Runtime &rt,
const ${structName}<${templateParameter}> &value,
const std::shared_ptr<CallInvoker> &jsInvoker) {
auto result = facebook::jsi::Object(rt);
${value.properties
.map((v, i) => {
if (v.optional) {
return ` if (value.${v.name}) {
result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value(), jsInvoker));
}`;
} else {
return ` result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}, jsInvoker));`;
}
})
.join('\n')}
return result;
}
};

@@ -309,3 +342,104 @@ `;

}
function translatePropertyToCpp(prop, resolveAlias, abstract = false) {
const EnumTemplate = ({
enumName,
values,
fromCases,
toCases,
nativeEnumMemberType,
}) => {
const _ref =
nativeEnumMemberType === 'std::string'
? [
'const jsi::String &rawValue',
'std::string value = rawValue.utf8(rt);',
'jsi::String',
]
: [
'const jsi::Value &rawValue',
'double value = (double)rawValue.asNumber();',
'jsi::Value',
],
_ref2 = _slicedToArray(_ref, 3),
fromValue = _ref2[0],
fromValueConversion = _ref2[1],
toValue = _ref2[2];
return `
#pragma mark - ${enumName}
enum ${enumName} { ${values} };
template <>
struct Bridging<${enumName}> {
static ${enumName} fromJs(jsi::Runtime &rt, ${fromValue}, const std::shared_ptr<CallInvoker> &jsInvoker) {
${fromValueConversion}
${fromCases}
}
static ${toValue} toJs(jsi::Runtime &rt, ${enumName} value, const std::shared_ptr<CallInvoker> &jsInvoker) {
${toCases}
}
};`;
};
function generateEnum(moduleName, origEnumName, members, memberType) {
const enumName = getEnumName(moduleName, origEnumName);
const nativeEnumMemberType =
memberType === 'StringTypeAnnotation'
? 'std::string'
: getAreEnumMembersInteger(members)
? 'int32_t'
: 'float';
const getMemberValueAppearance = value =>
memberType === 'StringTypeAnnotation'
? `"${value}"`
: `${value}${nativeEnumMemberType === 'float' ? 'f' : ''}`;
const fromCases =
members
.map(
member => `if (value == ${getMemberValueAppearance(member.value)}) {
return ${enumName}::${toSafeCppString(member.name)};
}`,
)
.join(' else ') +
` else {
throw jsi::JSError(rt, "No appropriate enum member found for value");
}`;
const toCases =
members
.map(
member => `if (value == ${enumName}::${toSafeCppString(member.name)}) {
return bridging::toJs(rt, ${getMemberValueAppearance(member.value)});
}`,
)
.join(' else ') +
` else {
throw jsi::JSError(rt, "No appropriate enum member found for enum value");
}`;
return EnumTemplate({
enumName,
values: members.map(member => member.name).join(', '),
fromCases,
toCases,
nativeEnumMemberType,
});
}
function createEnums(moduleName, enumMap, resolveAlias) {
return Object.entries(enumMap)
.map(([enumName, enumNode]) => {
return generateEnum(
moduleName,
enumName,
enumNode.members,
enumNode.memberType,
);
})
.filter(Boolean)
.join('\n');
}
function translatePropertyToCpp(
moduleName,
prop,
resolveAlias,
enumMap,
abstract = false,
) {
const _unwrapNullable3 = unwrapNullable(prop.typeAnnotation),

@@ -319,2 +453,3 @@ _unwrapNullable4 = _slicedToArray(_unwrapNullable3, 1),

const translatedParam = translatePrimitiveJSTypeToCpp(
moduleName,
param.typeAnnotation,

@@ -325,2 +460,3 @@ param.optional,

resolveAlias,
enumMap,
);

@@ -330,2 +466,3 @@ return `${translatedParam} ${param.name}`;

const returnType = translatePrimitiveJSTypeToCpp(
moduleName,
propTypeAnnotation.returnTypeAnnotation,

@@ -335,2 +472,3 @@ false,

resolveAlias,
enumMap,
);

@@ -358,7 +496,14 @@

const _nativeModules$hasteM = nativeModules[hasteModuleName],
aliases = _nativeModules$hasteM.aliases,
aliasMap = _nativeModules$hasteM.aliasMap,
enumMap = _nativeModules$hasteM.enumMap,
properties = _nativeModules$hasteM.spec.properties,
moduleName = _nativeModules$hasteM.moduleName;
const resolveAlias = createAliasResolver(aliases);
const structs = createStructs(moduleName, aliases, resolveAlias);
const resolveAlias = createAliasResolver(aliasMap);
const structs = createStructsString(
moduleName,
aliasMap,
resolveAlias,
enumMap,
);
const enums = createEnums(moduleName, enumMap, resolveAlias);
return [

@@ -368,5 +513,12 @@ ModuleClassDeclarationTemplate({

moduleProperties: properties.map(prop =>
translatePropertyToCpp(prop, resolveAlias, true),
translatePropertyToCpp(
moduleName,
prop,
resolveAlias,
enumMap,
true,
),
),
structs,
enums,
}),

@@ -377,3 +529,3 @@ ModuleSpecClassDeclarationTemplate({

moduleProperties: properties.map(prop =>
translatePropertyToCpp(prop, resolveAlias),
translatePropertyToCpp(moduleName, prop, resolveAlias, enumMap),
),

@@ -380,0 +532,0 @@ }),

@@ -477,3 +477,3 @@ /**

const _nativeModules$hasteM = nativeModules[hasteModuleName],
aliases = _nativeModules$hasteM.aliases,
aliasMap = _nativeModules$hasteM.aliasMap,
excludedPlatforms = _nativeModules$hasteM.excludedPlatforms,

@@ -485,3 +485,3 @@ moduleName = _nativeModules$hasteM.moduleName,

}
const resolveAlias = createAliasResolver(aliases);
const resolveAlias = createAliasResolver(aliasMap);
const className = `${hasteModuleName}Spec`;

@@ -488,0 +488,0 @@ const imports = new Set([

@@ -431,5 +431,5 @@ /**

const _nativeModules$hasteM = nativeModules[hasteModuleName],
aliases = _nativeModules$hasteM.aliases,
aliasMap = _nativeModules$hasteM.aliasMap,
properties = _nativeModules$hasteM.spec.properties;
const resolveAlias = createAliasResolver(aliases);
const resolveAlias = createAliasResolver(aliasMap);
const translatedMethods = properties

@@ -436,0 +436,0 @@ .map(property =>

@@ -109,3 +109,3 @@ /**

const _nativeModules$hasteM = nativeModules[hasteModuleName],
aliases = _nativeModules$hasteM.aliases,
aliasMap = _nativeModules$hasteM.aliasMap,
excludedPlatforms = _nativeModules$hasteM.excludedPlatforms,

@@ -116,3 +116,3 @@ properties = _nativeModules$hasteM.spec.properties;

}
const resolveAlias = createAliasResolver(aliases);
const resolveAlias = createAliasResolver(aliasMap);
const structCollector = new StructCollector();

@@ -119,0 +119,0 @@ const methodSerializations = [];

@@ -31,5 +31,9 @@ /**

}
function getAreEnumMembersInteger(members) {
return !members.some(m => `${m.value}`.includes('.'));
}
module.exports = {
createAliasResolver,
getModules,
getAreEnumMembersInteger,
};

@@ -28,5 +28,21 @@ /**

}
function toPascalCase(inString) {
if (inString.length === 0) {
return inString;
}
return inString[0].toUpperCase() + inString.slice(1);
}
function toSafeCppString(input) {
return input.split('-').map(toPascalCase).join('');
}
function getEnumName(moduleName, origEnumName) {
const uppercasedPropName = toSafeCppString(origEnumName);
return `${moduleName}${uppercasedPropName}`;
}
module.exports = {
capitalize,
indent,
toPascalCase,
toSafeCppString,
getEnumName,
};

@@ -70,3 +70,2 @@ /**

callExpressionsLength,
language,
) {

@@ -78,3 +77,2 @@ if (callExpressions.length > 1) {

callExpressionsLength,
language,
);

@@ -87,10 +85,5 @@ }

callExpressions,
language,
) {
if (callExpressions.length === 0) {
throw new UnusedModuleInterfaceParserError(
nativeModuleName,
moduleSpec,
language,
);
throw new UnusedModuleInterfaceParserError(nativeModuleName, moduleSpec);
}

@@ -103,3 +96,2 @@ }

numberOfCallExpressionArgs,
language,
) {

@@ -112,3 +104,2 @@ if (numberOfCallExpressionArgs !== 1) {

numberOfCallExpressionArgs,
language,
);

@@ -130,3 +121,2 @@ }

moduleName,
parser.language(),
);

@@ -142,3 +132,2 @@ }

invalidReturnType,
language,
cxxOnly,

@@ -152,3 +141,2 @@ returnType,

'FunctionTypeAnnotation',
language,
);

@@ -163,3 +151,2 @@ }

moduleName,
language,
) {

@@ -172,3 +159,2 @@ if (typeArguments == null) {

moduleName,
language,
);

@@ -216,3 +202,2 @@ }

type,
language,
) {

@@ -226,3 +211,2 @@ const invalidPropertyValueType =

invalidPropertyValueType,
language,
);

@@ -262,3 +246,2 @@ }

type,
language,
) {

@@ -279,3 +262,2 @@ const TypeMap = {

TypeMap[type],
language,
);

@@ -282,0 +264,0 @@ }

@@ -135,3 +135,2 @@ /**

invalidArrayElementType,
language,
) {

@@ -168,3 +167,2 @@ super(

invalidPropertyValueType,
language,
) {

@@ -184,3 +182,3 @@ super(

class UnnamedFunctionParamParserError extends ParserError {
constructor(functionParam, nativeModuleName, language) {
constructor(functionParam, nativeModuleName) {
super(

@@ -208,8 +206,3 @@ nativeModuleName,

class UnsupportedFunctionReturnTypeAnnotationParserError extends ParserError {
constructor(
nativeModuleName,
flowReturnTypeAnnotation,
invalidReturnType,
language,
) {
constructor(nativeModuleName, flowReturnTypeAnnotation, invalidReturnType) {
super(

@@ -228,3 +221,3 @@ nativeModuleName,

class UnsupportedEnumDeclarationParserError extends ParserError {
constructor(nativeModuleName, arrayElementTypeAST, memberType, language) {
constructor(nativeModuleName, arrayElementTypeAST, memberType) {
super(

@@ -243,3 +236,3 @@ nativeModuleName,

class UnsupportedUnionTypeAnnotationParserError extends ParserError {
constructor(nativeModuleName, arrayElementTypeAST, types, language) {
constructor(nativeModuleName, arrayElementTypeAST, types) {
super(

@@ -260,3 +253,3 @@ nativeModuleName,

class UnusedModuleInterfaceParserError extends ParserError {
constructor(nativeModuleName, flowInterface, language) {
constructor(nativeModuleName, flowInterface) {
super(

@@ -270,3 +263,3 @@ nativeModuleName,

class MoreThanOneModuleRegistryCallsParserError extends ParserError {
constructor(nativeModuleName, flowCallExpressions, numCalls, language) {
constructor(nativeModuleName, flowCallExpressions, numCalls) {
super(

@@ -280,9 +273,3 @@ nativeModuleName,

class UntypedModuleRegistryCallParserError extends ParserError {
constructor(
nativeModuleName,
flowCallExpression,
methodName,
moduleName,
language,
) {
constructor(nativeModuleName, flowCallExpression, methodName, moduleName) {
super(

@@ -296,9 +283,3 @@ nativeModuleName,

class IncorrectModuleRegistryCallTypeParameterParserError extends ParserError {
constructor(
nativeModuleName,
flowTypeArguments,
methodName,
moduleName,
language,
) {
constructor(nativeModuleName, flowTypeArguments, methodName, moduleName) {
super(

@@ -317,3 +298,2 @@ nativeModuleName,

incorrectArity,
language,
) {

@@ -328,3 +308,3 @@ super(

class IncorrectModuleRegistryCallArgumentTypeParserError extends ParserError {
constructor(nativeModuleName, flowArgument, methodName, type, language) {
constructor(nativeModuleName, flowArgument, methodName, type) {
const a = /[aeiouy]/.test(type.toLowerCase()) ? 'an' : 'a';

@@ -331,0 +311,0 @@ super(

@@ -210,3 +210,3 @@ /**

import type {ImageSource} from 'ImageSource';
import type {ColorValue, ColorArrayValue, PointValue, EdgeInsetsValue} from 'StyleSheetTypes';
import type {ColorValue, ColorArrayValue, PointValue, EdgeInsetsValue, DimensionValue} from 'StyleSheetTypes';
import type {ViewProps} from 'ViewPropTypes';

@@ -311,2 +311,8 @@ import type {HostComponent} from 'react-native';

insets_optional_both?: ?EdgeInsetsValue,
// DimensionValue props
dimension_required: DimensionValue,
dimension_optional_key?: DimensionValue,
dimension_optional_value: ?DimensionValue,
dimension_optional_both?: ?DimensionValue,
|}>;

@@ -335,3 +341,3 @@

import type {ImageSource} from 'ImageSource';
import type {ColorValue, PointValue, ProcessColorValue, EdgeInsetsValue} from 'StyleSheetTypes';
import type {ColorValue, PointValue, ProcessColorValue, EdgeInsetsValue, DimensionValue} from 'StyleSheetTypes';
import type {ViewProps} from 'ViewPropTypes';

@@ -411,2 +417,8 @@ import type {HostComponent} from 'react-native';

// DimensionValue props
array_dimension_required: $ReadOnlyArray<DimensionValue>,
array_dimension_optional_key?: $ReadOnlyArray<DimensionValue>,
array_dimension_optional_value: ?$ReadOnlyArray<DimensionValue>,
array_dimension_optional_both?: ?$ReadOnlyArray<DimensionValue>,
// Object props

@@ -552,2 +564,8 @@ array_object_required: $ReadOnlyArray<$ReadOnly<{| prop: string |}>>,

// DimensionValue props
dimension_required: $ReadOnly<{|prop: DimensionValue|}>,
dimension_optional_key: $ReadOnly<{|prop?: DimensionValue|}>,
dimension_optional_value: $ReadOnly<{|prop: ?DimensionValue|}>,
dimension_optional_both: $ReadOnly<{|prop?: ?DimensionValue|}>,
// Nested object props

@@ -554,0 +572,0 @@ object_required: $ReadOnly<{|prop: $ReadOnly<{nestedProp: string}>|}>,

@@ -15,2 +15,5 @@ /**

getValueFromTypes = _require.getValueFromTypes;
// $FlowFixMe[unclear-type] there's no flowtype for ASTs
function buildCommandSchema(property, types) {

@@ -17,0 +20,0 @@ const name = property.key.name;

@@ -112,2 +112,7 @@ /**

};
case 'DimensionValue':
return {
type: 'ReservedPropTypeAnnotation',
name: 'DimensionPrimitive',
};
case 'Stringish':

@@ -278,2 +283,7 @@ return {

};
case 'DimensionValue':
return {
type: 'ReservedPropTypeAnnotation',
name: 'DimensionPrimitive',
};
case 'Int32':

@@ -280,0 +290,0 @@ return {

@@ -206,2 +206,54 @@ /**

`;
const EMPTY_ENUM_NATIVE_MODULE = `
/**
* 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-local
* @format
*/
'use strict';
import type {TurboModule} from '../RCTExport';
import * as TurboModuleRegistry from '../TurboModuleRegistry';
export enum SomeEnum {
}
export interface Spec extends TurboModule {
+getEnums: (a: SomeEnum) => string;
}
export default TurboModuleRegistry.getEnforcing<Spec>('EmptyEnumNativeModule');
`;
const MIXED_VALUES_ENUM_NATIVE_MODULE = `
/**
* 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-local
* @format
*/
'use strict';
import type {TurboModule} from '../RCTExport';
import * as TurboModuleRegistry from '../TurboModuleRegistry';
export enum SomeEnum {
NUM = 1,
STR = 'str',
}
export interface Spec extends TurboModule {
+getEnums: (a: SomeEnum) => string;
}
export default TurboModuleRegistry.getEnforcing<Spec>('MixedValuesEnumNativeModule');
`;
module.exports = {

@@ -216,2 +268,4 @@ NATIVE_MODULES_WITH_READ_ONLY_OBJECT_NO_TYPE_FOR_CONTENT,

TWO_NATIVE_EXTENDING_TURBO_MODULE,
EMPTY_ENUM_NATIVE_MODULE,
MIXED_VALUES_ENUM_NATIVE_MODULE,
};

@@ -282,2 +282,62 @@ /**

`;
const NATIVE_MODULE_WITH_PARTIALS = `
/**
* 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-local
* @format
*/
'use strict';
import type {TurboModule} from '../RCTExport';
import * as TurboModuleRegistry from '../TurboModuleRegistry';
export type SomeObj = {|
a: string,
b?: boolean,
|};
export interface Spec extends TurboModule {
+getSomeObj: () => SomeObj;
+getPartialSomeObj: () => $Partial<SomeObj>;
+getSomeObjFromPartialSomeObj: (value: $Partial<SomeObj>) => SomeObj;
}
export default TurboModuleRegistry.getEnforcing<Spec>('SampleTurboModule');
`;
const NATIVE_MODULE_WITH_PARTIALS_COMPLEX = `
/**
* 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-local
* @format
*/
'use strict';
import type {TurboModule} from '../RCTExport';
import * as TurboModuleRegistry from '../TurboModuleRegistry';
export type SomeObj = {|
a: string,
b?: boolean,
|};
export type PartialSomeObj = $Partial<SomeObj>;
export interface Spec extends TurboModule {
+getPartialPartial: (value1: $Partial<SomeObj>, value2: PartialSomeObj) => SomeObj
}
export default TurboModuleRegistry.getEnforcing<Spec>('SampleTurboModule');
`;
const NATIVE_MODULE_WITH_ROOT_TAG = `

@@ -694,3 +754,4 @@ /**

returnEmpty(): Promise<empty>;
returnIndex(): Promise<{ [string]: 'authorized' | 'denied' | 'undetermined' | true | false }>;
returnUnsupportedIndex(): Promise<{ [string]: 'authorized' | 'denied' | 'undetermined' | true | false }>;
returnSupportedIndex(): Promise<{ [string]: CustomObject }>;
returnEnum() : Promise<Season>;

@@ -713,2 +774,4 @@ returnObject() : Promise<CustomObject>;

NATIVE_MODULE_WITH_UNSAFE_OBJECT,
NATIVE_MODULE_WITH_PARTIALS,
NATIVE_MODULE_WITH_PARTIALS_COMPLEX,
NATIVE_MODULE_WITH_ROOT_TAG,

@@ -715,0 +778,0 @@ NATIVE_MODULE_WITH_NULLABLE_PARAM,

@@ -156,3 +156,2 @@ /**

parseObjectProperty = _require3.parseObjectProperty,
translateDefault = _require3.translateDefault,
buildPropertySchema = _require3.buildPropertySchema;

@@ -167,2 +166,3 @@ const _require4 = require('../../parsers-primitives'),

emitInt32 = _require4.emitInt32,
emitGenericObject = _require4.emitGenericObject,
emitObject = _require4.emitObject,

@@ -177,3 +177,3 @@ emitPromise = _require4.emitPromise,

typeAliasResolution = _require4.typeAliasResolution,
translateArrayTypeAnnotation = _require4.translateArrayTypeAnnotation;
typeEnumResolution = _require4.typeEnumResolution;
const _require5 = require('../../errors'),

@@ -183,3 +183,4 @@ UnsupportedTypeAnnotationParserError =

IncorrectModuleRegistryCallArgumentTypeParserError =
_require5.IncorrectModuleRegistryCallArgumentTypeParserError;
_require5.IncorrectModuleRegistryCallArgumentTypeParserError,
UnsupportedGenericParserError = _require5.UnsupportedGenericParserError;
const _require6 = require('../../error-utils'),

@@ -199,6 +200,3 @@ throwIfModuleInterfaceNotFound = _require6.throwIfModuleInterfaceNotFound,

_require6.throwIfMoreThanOneModuleInterfaceParserError;
const _require7 = require('../parser'),
FlowParser = _require7.FlowParser;
const language = 'Flow';
const parser = new FlowParser();
function translateTypeAnnotation(

@@ -212,4 +210,6 @@ hasteModuleName,

aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
) {

@@ -222,3 +222,3 @@ const _resolveTypeAnnotatio = resolveTypeAnnotation(

typeAnnotation = _resolveTypeAnnotatio.typeAnnotation,
typeAliasResolutionStatus = _resolveTypeAnnotatio.typeAliasResolutionStatus;
typeResolutionStatus = _resolveTypeAnnotatio.typeResolutionStatus;
switch (typeAnnotation.type) {

@@ -238,2 +238,3 @@ case 'GenericTypeAnnotation': {

aliasMap,
enumMap,
tryParse,

@@ -252,2 +253,3 @@ cxxOnly,

aliasMap,
enumMap,
cxxOnly,

@@ -270,4 +272,6 @@ nullable,

aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
),

@@ -294,10 +298,39 @@ ),

case 'Object': {
return emitObject(nullable);
return emitGenericObject(nullable);
}
case '$Partial': {
if (typeAnnotation.typeParameters.params.length !== 1) {
throw new Error(
'Partials only support annotating exactly one parameter.',
);
}
const annotatedElement =
types[typeAnnotation.typeParameters.params[0].id.name];
if (!annotatedElement) {
throw new Error(
'Partials only support annotating a type parameter.',
);
}
const properties = annotatedElement.right.properties.map(prop => {
return {
name: prop.key.name,
optional: true,
typeAnnotation: translateTypeAnnotation(
hasteModuleName,
prop.value,
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
),
};
});
return emitObject(nullable, properties);
}
default: {
return translateDefault(
throw new UnsupportedGenericParserError(
hasteModuleName,
typeAnnotation,
types,
nullable,
parser,

@@ -309,2 +342,25 @@ );

case 'ObjectTypeAnnotation': {
// if there is any indexer, then it is a dictionary
if (typeAnnotation.indexers) {
const indexers = typeAnnotation.indexers.filter(
member => member.type === 'ObjectTypeIndexer',
);
if (indexers.length > 0) {
// check the property type to prevent developers from using unsupported types
// the return value from `translateTypeAnnotation` is unused
const propertyType = indexers[0].value;
translateTypeAnnotation(
hasteModuleName,
propertyType,
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
);
// no need to do further checking
return emitGenericObject(nullable);
}
}
const objectTypeAnnotation = {

@@ -321,2 +377,3 @@ type: 'ObjectTypeAnnotation',

aliasMap,
enumMap,
tryParse,

@@ -333,3 +390,3 @@ cxxOnly,

return typeAliasResolution(
typeAliasResolutionStatus,
typeResolutionStatus,
objectTypeAnnotation,

@@ -359,6 +416,7 @@ aliasMap,

aliasMap,
enumMap,
tryParse,
cxxOnly,
translateTypeAnnotation,
language,
parser,
);

@@ -379,6 +437,18 @@ }

return emitMixed(nullable);
} else {
return emitGenericObject(nullable);
}
// Fallthrough
}
case 'EnumStringBody':
case 'EnumNumberBody': {
return typeEnumResolution(
typeAnnotation,
typeResolutionStatus,
nullable,
hasteModuleName,
language,
enumMap,
parser,
);
}
default: {

@@ -408,2 +478,3 @@ throw new UnsupportedTypeAnnotationParserError(

tryParse,
parser,
) {

@@ -441,3 +512,2 @@ const types = getTypes(ast);

callExpressions,
language,
);

@@ -448,3 +518,2 @@ throwIfMoreThanOneModuleRegistryCalls(

callExpressions.length,
language,
);

@@ -459,3 +528,2 @@ const callExpression = callExpressions[0];

callExpression.arguments.length,
language,
);

@@ -469,3 +537,2 @@ if (callExpression.arguments[0].type !== 'Literal') {

type,
language,
);

@@ -480,3 +547,2 @@ }

$moduleName,
language,
);

@@ -506,4 +572,6 @@ throwIfIncorrectModuleRegistryCallTypeParameterParserError(

const aliasMap = {};
const enumMap = {};
return tryParse(() => ({
aliasMap: aliasMap,
enumMap: enumMap,
propertyShape: buildPropertySchema(

@@ -514,7 +582,8 @@ hasteModuleName,

aliasMap,
enumMap,
tryParse,
cxxOnly,
language,
resolveTypeAnnotation,
translateTypeAnnotation,
parser,
),

@@ -525,8 +594,12 @@ }));

.reduce(
(moduleSchema, {aliasMap, propertyShape}) => ({
(moduleSchema, {aliasMap, enumMap, propertyShape}) => ({
type: 'NativeModule',
aliases: _objectSpread(
_objectSpread({}, moduleSchema.aliases),
aliasMap: _objectSpread(
_objectSpread({}, moduleSchema.aliasMap),
aliasMap,
),
enumMap: _objectSpread(
_objectSpread({}, moduleSchema.enumMap),
enumMap,
),
spec: {

@@ -540,3 +613,4 @@ properties: [...moduleSchema.spec.properties, propertyShape],

type: 'NativeModule',
aliases: {},
aliasMap: {},
enumMap: {},
spec: {

@@ -543,0 +617,0 @@ properties: [],

@@ -41,5 +41,18 @@ /**

}
const _require = require('../errors'),
// $FlowFixMe[untyped-import] there's no flowtype flow-parser
const flowParser = require('flow-parser');
const _require = require('../parsers-commons'),
buildSchema = _require.buildSchema;
const _require2 = require('./Visitor'),
Visitor = _require2.Visitor;
const _require3 = require('./components'),
buildComponentSchema = _require3.buildComponentSchema;
const _require4 = require('./components/schema'),
wrapComponentSchema = _require4.wrapComponentSchema;
const _require5 = require('./modules'),
buildModuleSchema = _require5.buildModuleSchema;
const fs = require('fs');
const _require6 = require('../errors'),
UnsupportedObjectPropertyTypeAnnotationParserError =
_require.UnsupportedObjectPropertyTypeAnnotationParserError;
_require6.UnsupportedObjectPropertyTypeAnnotationParserError;
class FlowParser {

@@ -53,34 +66,16 @@ constructor() {

}
getKeyName(propertyOrIndex, hasteModuleName) {
var _propertyOrIndex$id$n, _propertyOrIndex$id;
switch (propertyOrIndex.type) {
case 'ObjectTypeProperty':
return propertyOrIndex.key.name;
case 'ObjectTypeIndexer':
// flow index name is optional
return (_propertyOrIndex$id$n =
(_propertyOrIndex$id = propertyOrIndex.id) === null ||
_propertyOrIndex$id === void 0
? void 0
: _propertyOrIndex$id.name) !== null &&
_propertyOrIndex$id$n !== void 0
? _propertyOrIndex$id$n
: 'key';
default:
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
hasteModuleName,
propertyOrIndex,
propertyOrIndex.type,
this.language(),
);
isProperty(property) {
return property.type === 'ObjectTypeProperty';
}
getKeyName(property, hasteModuleName) {
if (!this.isProperty(property)) {
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
hasteModuleName,
property,
property.type,
this.language(),
);
}
return property.key.name;
}
getMaybeEnumMemberType(maybeEnumDeclaration) {
return maybeEnumDeclaration.body.type
.replace('EnumNumberBody', 'NumberTypeAnnotation')
.replace('EnumStringBody', 'StringTypeAnnotation');
}
isEnumDeclaration(maybeEnumDeclaration) {
return maybeEnumDeclaration.type === 'EnumDeclaration';
}
language() {

@@ -108,2 +103,97 @@ return 'Flow';

}
parseFile(filename) {
const contents = fs.readFileSync(filename, 'utf8');
return this.parseString(contents, filename);
}
parseString(contents, filename) {
return buildSchema(
contents,
filename,
wrapComponentSchema,
buildComponentSchema,
buildModuleSchema,
Visitor,
this,
);
}
parseModuleFixture(filename) {
const contents = fs.readFileSync(filename, 'utf8');
return this.parseString(contents, 'path/NativeSampleTurboModule.js');
}
getAst(contents) {
return flowParser.parse(contents, {
enums: true,
});
}
getFunctionTypeAnnotationParameters(functionTypeAnnotation) {
return functionTypeAnnotation.params;
}
getFunctionNameFromParameter(parameter) {
return parameter.name;
}
getParameterName(parameter) {
return parameter.name.name;
}
getParameterTypeAnnotation(parameter) {
return parameter.typeAnnotation;
}
getFunctionTypeAnnotationReturnType(functionTypeAnnotation) {
return functionTypeAnnotation.returnType;
}
parseEnumMembersType(typeAnnotation) {
const enumMembersType =
typeAnnotation.type === 'EnumStringBody'
? 'StringTypeAnnotation'
: typeAnnotation.type === 'EnumNumberBody'
? 'NumberTypeAnnotation'
: null;
if (!enumMembersType) {
throw new Error(
`Unknown enum type annotation type. Got: ${typeAnnotation.type}. Expected: EnumStringBody or EnumNumberBody.`,
);
}
return enumMembersType;
}
validateEnumMembersSupported(typeAnnotation, enumMembersType) {
if (!typeAnnotation.members || typeAnnotation.members.length === 0) {
// passing mixed members to flow would result in a flow error
// if the tool is launched ignoring that error, the enum would appear like not having enums
throw new Error(
'Enums should have at least one member and member values can not be mixed- they all must be either blank, number, or string values.',
);
}
typeAnnotation.members.forEach(member => {
if (
enumMembersType === 'StringTypeAnnotation' &&
(!member.init || typeof member.init.value === 'string')
) {
return;
}
if (
enumMembersType === 'NumberTypeAnnotation' &&
member.init &&
typeof member.init.value === 'number'
) {
return;
}
throw new Error(
'Enums can not be mixed- they all must be either blank, number, or string values.',
);
});
}
parseEnumMembers(typeAnnotation) {
return typeAnnotation.members.map(member => {
var _member$init$value, _member$init;
return {
name: member.id.name,
value:
(_member$init$value =
(_member$init = member.init) === null || _member$init === void 0
? void 0
: _member$init.value) !== null && _member$init$value !== void 0
? _member$init$value
: member.id.name,
};
});
}
}

@@ -110,0 +200,0 @@ module.exports = {

@@ -64,3 +64,3 @@ /**

let nullable = false;
let typeAliasResolutionStatus = {
let typeResolutionStatus = {
successful: false,

@@ -72,21 +72,35 @@ };

node = node.typeAnnotation;
} else if (node.type === 'GenericTypeAnnotation') {
typeAliasResolutionStatus = {
successful: true,
aliasName: node.id.name,
};
const resolvedTypeAnnotation = types[node.id.name];
if (
resolvedTypeAnnotation == null ||
resolvedTypeAnnotation.type === 'EnumDeclaration'
) {
continue;
}
if (node.type !== 'GenericTypeAnnotation') {
break;
}
const resolvedTypeAnnotation = types[node.id.name];
if (resolvedTypeAnnotation == null) {
break;
}
switch (resolvedTypeAnnotation.type) {
case 'TypeAlias': {
typeResolutionStatus = {
successful: true,
type: 'alias',
name: node.id.name,
};
node = resolvedTypeAnnotation.right;
break;
}
invariant(
resolvedTypeAnnotation.type === 'TypeAlias',
`GenericTypeAnnotation '${node.id.name}' must resolve to a TypeAlias. Instead, it resolved to a '${resolvedTypeAnnotation.type}'`,
);
node = resolvedTypeAnnotation.right;
} else {
break;
case 'EnumDeclaration': {
typeResolutionStatus = {
successful: true,
type: 'enum',
name: node.id.name,
};
node = resolvedTypeAnnotation.body;
break;
}
default: {
throw new TypeError(
`A non GenericTypeAnnotation must be a type declaration ('TypeAlias') or enum ('EnumDeclaration'). Instead, got the unsupported ${resolvedTypeAnnotation.type}.`,
);
}
}

@@ -97,3 +111,3 @@ }

typeAnnotation: node,
typeAliasResolutionStatus,
typeResolutionStatus,
};

@@ -100,0 +114,0 @@ }

@@ -41,5 +41,22 @@ /**

}
// $FlowFixMe[untyped-import] there's no flowtype flow-parser
const flowParser = require('flow-parser');
const _require = require('./errors'),
UnsupportedObjectPropertyTypeAnnotationParserError =
_require.UnsupportedObjectPropertyTypeAnnotationParserError;
const schemaMock = {
modules: {
StringPropNativeComponentView: {
type: 'Component',
components: {
StringPropNativeComponentView: {
extendsProps: [],
events: [],
props: [],
commands: [],
},
},
},
},
};
export class MockedParser {

@@ -53,34 +70,16 @@ constructor() {

}
getKeyName(propertyOrIndex, hasteModuleName) {
var _propertyOrIndex$id$n, _propertyOrIndex$id;
switch (propertyOrIndex.type) {
case 'ObjectTypeProperty':
return propertyOrIndex.key.name;
case 'ObjectTypeIndexer':
// flow index name is optional
return (_propertyOrIndex$id$n =
(_propertyOrIndex$id = propertyOrIndex.id) === null ||
_propertyOrIndex$id === void 0
? void 0
: _propertyOrIndex$id.name) !== null &&
_propertyOrIndex$id$n !== void 0
? _propertyOrIndex$id$n
: 'key';
default:
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
hasteModuleName,
propertyOrIndex,
propertyOrIndex.type,
this.language(),
);
isProperty(property) {
return property.type === 'ObjectTypeProperty';
}
getKeyName(property, hasteModuleName) {
if (!this.isProperty(property)) {
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
hasteModuleName,
property,
property.type,
this.language(),
);
}
return property.key.name;
}
getMaybeEnumMemberType(maybeEnumDeclaration) {
return maybeEnumDeclaration.body.type
.replace('EnumNumberBody', 'NumberTypeAnnotation')
.replace('EnumStringBody', 'StringTypeAnnotation');
}
isEnumDeclaration(maybeEnumDeclaration) {
return maybeEnumDeclaration.type === 'EnumDeclaration';
}
language() {

@@ -98,2 +97,60 @@ return 'Flow';

}
parseFile(filename) {
return schemaMock;
}
parseString(contents, filename) {
return schemaMock;
}
parseModuleFixture(filename) {
return schemaMock;
}
getAst(contents) {
return flowParser.parse(contents, {
enums: true,
});
}
getFunctionTypeAnnotationParameters(functionTypeAnnotation) {
return functionTypeAnnotation.params;
}
getFunctionNameFromParameter(parameter) {
return parameter.name;
}
getParameterName(parameter) {
return parameter.name.name;
}
getParameterTypeAnnotation(parameter) {
return parameter.typeAnnotation;
}
getFunctionTypeAnnotationReturnType(functionTypeAnnotation) {
return functionTypeAnnotation.returnType;
}
parseEnumMembersType(typeAnnotation) {
return typeAnnotation.type;
}
validateEnumMembersSupported(typeAnnotation, enumMembersType) {
return;
}
parseEnumMembers(typeAnnotation) {
return typeAnnotation.type === 'StringTypeAnnotation'
? [
{
name: 'Hello',
value: 'hello',
},
{
name: 'Goodbye',
value: 'goodbye',
},
]
: [
{
name: 'On',
value: '1',
},
{
name: 'Off',
value: '0',
},
];
}
}

@@ -81,21 +81,20 @@ /**

}
const _require = require('./error-utils'),
const _require = require('./utils'),
getConfigType = _require.getConfigType,
extractNativeModuleName = _require.extractNativeModuleName,
createParserErrorCapturer = _require.createParserErrorCapturer;
const _require2 = require('./error-utils'),
throwIfPropertyValueTypeIsUnsupported =
_require.throwIfPropertyValueTypeIsUnsupported,
_require2.throwIfPropertyValueTypeIsUnsupported,
throwIfUnsupportedFunctionParamTypeAnnotationParserError =
_require.throwIfUnsupportedFunctionParamTypeAnnotationParserError,
_require2.throwIfUnsupportedFunctionParamTypeAnnotationParserError,
throwIfUnsupportedFunctionReturnTypeAnnotationParserError =
_require.throwIfUnsupportedFunctionReturnTypeAnnotationParserError,
throwIfModuleTypeIsUnsupported = _require.throwIfModuleTypeIsUnsupported;
const _require2 = require('./errors'),
_require2.throwIfUnsupportedFunctionReturnTypeAnnotationParserError,
throwIfModuleTypeIsUnsupported = _require2.throwIfModuleTypeIsUnsupported;
const _require3 = require('./errors'),
MissingTypeParameterGenericParserError =
_require2.MissingTypeParameterGenericParserError,
_require3.MissingTypeParameterGenericParserError,
MoreThanOneTypeParameterGenericParserError =
_require2.MoreThanOneTypeParameterGenericParserError,
UnsupportedEnumDeclarationParserError =
_require2.UnsupportedEnumDeclarationParserError,
UnsupportedGenericParserError = _require2.UnsupportedGenericParserError,
UnsupportedObjectPropertyTypeAnnotationParserError =
_require2.UnsupportedObjectPropertyTypeAnnotationParserError,
UnnamedFunctionParamParserError = _require2.UnnamedFunctionParamParserError;
_require3.MoreThanOneTypeParameterGenericParserError,
UnnamedFunctionParamParserError = _require3.UnnamedFunctionParamParserError;
const invariant = require('invariant');

@@ -155,11 +154,5 @@ function wrapModuleSchema(nativeModuleSchema, hasteModuleName) {

case 'Flow':
return (
property.type === 'ObjectTypeProperty' ||
property.type === 'ObjectTypeIndexer'
);
return property.type === 'ObjectTypeProperty';
case 'TypeScript':
return (
property.type === 'TSPropertySignature' ||
property.type === 'TSIndexSignature'
);
return property.type === 'TSPropertySignature';
default:

@@ -174,2 +167,3 @@ return false;

aliasMap,
enumMap,
tryParse,

@@ -182,13 +176,5 @@ cxxOnly,

const language = parser.language();
if (!isObjectProperty(property, language)) {
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
hasteModuleName,
property,
property.type,
language,
);
}
const name = parser.getKeyName(property, hasteModuleName);
const _property$optional = property.optional,
optional = _property$optional === void 0 ? false : _property$optional;
const name = parser.getKeyName(property, hasteModuleName);
const languageTypeAnnotation =

@@ -198,15 +184,2 @@ language === 'TypeScript'

: property.value;
if (
property.type === 'ObjectTypeIndexer' ||
property.type === 'TSIndexSignature'
) {
return {
name,
optional,
typeAnnotation: wrapNullable(nullable, {
type: 'GenericObjectTypeAnnotation',
}), //TODO: use `emitObject` for typeAnnotation
};
}
const _unwrapNullable = unwrapNullable(

@@ -218,4 +191,6 @@ translateTypeAnnotation(

aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
),

@@ -236,3 +211,2 @@ ),

propertyTypeAnnotation.type,
language,
);

@@ -246,57 +220,2 @@ }

}
function translateDefault(
hasteModuleName,
typeAnnotation,
types,
nullable,
parser,
) {
const maybeEnumDeclaration =
types[parser.nameForGenericTypeAnnotation(typeAnnotation)];
if (maybeEnumDeclaration && parser.isEnumDeclaration(maybeEnumDeclaration)) {
const memberType = parser.getMaybeEnumMemberType(maybeEnumDeclaration);
if (
memberType === 'NumberTypeAnnotation' ||
memberType === 'StringTypeAnnotation'
) {
return wrapNullable(nullable, {
type: 'EnumDeclaration',
memberType: memberType,
});
} else {
throw new UnsupportedEnumDeclarationParserError(
hasteModuleName,
typeAnnotation,
memberType,
parser.language(),
);
}
}
throw new UnsupportedGenericParserError(
hasteModuleName,
typeAnnotation,
parser,
);
}
function getTypeAnnotationParameters(typeAnnotation, language) {
return language === 'Flow'
? typeAnnotation.params
: typeAnnotation.parameters;
}
function getFunctionNameFromParameter(param, language) {
return language === 'Flow' ? param.name : param.typeAnnotation;
}
function getParameterName(param, language) {
return language === 'Flow' ? param.name.name : param.name;
}
function getParameterTypeAnnotation(param, language) {
return language === 'Flow'
? param.typeAnnotation
: param.typeAnnotation.typeAnnotation;
}
function getTypeAnnotationReturnType(typeAnnotation, language) {
return language === 'Flow'
? typeAnnotation.returnType
: typeAnnotation.typeAnnotation.typeAnnotation;
}
function translateFunctionTypeAnnotation(

@@ -306,29 +225,30 @@ hasteModuleName,

// TODO(T71778680): This is a FunctionTypeAnnotation. Type this.
typeAnnotation,
functionTypeAnnotation,
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
translateTypeAnnotation,
language,
parser,
) {
const params = [];
for (const param of getTypeAnnotationParameters(typeAnnotation, language)) {
for (const param of parser.getFunctionTypeAnnotationParameters(
functionTypeAnnotation,
)) {
const parsedParam = tryParse(() => {
if (getFunctionNameFromParameter(param, language) == null) {
throw new UnnamedFunctionParamParserError(
param,
hasteModuleName,
language,
);
if (parser.getFunctionNameFromParameter(param) == null) {
throw new UnnamedFunctionParamParserError(param, hasteModuleName);
}
const paramName = getParameterName(param, language);
const paramName = parser.getParameterName(param);
const _unwrapNullable3 = unwrapNullable(
translateTypeAnnotation(
hasteModuleName,
getParameterTypeAnnotation(param, language),
parser.getParameterTypeAnnotation(param),
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
),

@@ -366,7 +286,9 @@ ),

hasteModuleName,
getTypeAnnotationReturnType(typeAnnotation, language),
parser.getFunctionTypeAnnotationReturnType(functionTypeAnnotation),
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
),

@@ -379,5 +301,4 @@ ),

hasteModuleName,
typeAnnotation,
functionTypeAnnotation,
'FunctionTypeAnnotation',
language,
cxxOnly,

@@ -405,7 +326,8 @@ returnTypeAnnotation.type,

aliasMap,
enumMap,
tryParse,
cxxOnly,
language,
resolveTypeAnnotation,
translateTypeAnnotation,
parser,
) {

@@ -416,3 +338,3 @@ let nullable = false;

const methodName = key.name;
if (language === 'TypeScript') {
if (parser.language() === 'TypeScript') {
value =

@@ -431,3 +353,3 @@ property.type === 'TSMethodSignature'

value.type,
language,
parser.language(),
);

@@ -444,6 +366,7 @@ return {

aliasMap,
enumMap,
tryParse,
cxxOnly,
translateTypeAnnotation,
language,
parser,
),

@@ -453,2 +376,80 @@ ),

}
function buildSchemaFromConfigType(
configType,
filename,
ast,
wrapComponentSchema,
buildComponentSchema,
buildModuleSchema,
parser,
) {
switch (configType) {
case 'component': {
return wrapComponentSchema(buildComponentSchema(ast));
}
case 'module': {
if (filename === undefined || filename === null) {
throw new Error('Filepath expected while parasing a module');
}
const nativeModuleName = extractNativeModuleName(filename);
const _createParserErrorCap = createParserErrorCapturer(),
_createParserErrorCap2 = _slicedToArray(_createParserErrorCap, 2),
parsingErrors = _createParserErrorCap2[0],
tryParse = _createParserErrorCap2[1];
const schema = tryParse(() =>
buildModuleSchema(nativeModuleName, ast, tryParse, parser),
);
if (parsingErrors.length > 0) {
/**
* TODO(T77968131): We have two options:
* - Throw the first error, but indicate there are more then one errors.
* - Display all errors, nicely formatted.
*
* For the time being, we're just throw the first error.
**/
throw parsingErrors[0];
}
invariant(
schema != null,
'When there are no parsing errors, the schema should not be null',
);
return wrapModuleSchema(schema, nativeModuleName);
}
default:
return {
modules: {},
};
}
}
function buildSchema(
contents,
filename,
wrapComponentSchema,
buildComponentSchema,
buildModuleSchema,
Visitor,
parser,
) {
// Early return for non-Spec JavaScript files
if (
!contents.includes('codegenNativeComponent') &&
!contents.includes('TurboModule')
) {
return {
modules: {},
};
}
const ast = parser.getAst(contents);
const configType = getConfigType(ast, Visitor);
return buildSchemaFromConfigType(
configType,
filename,
ast,
wrapComponentSchema,
buildComponentSchema,
buildModuleSchema,
parser,
);
}
module.exports = {

@@ -461,5 +462,6 @@ wrapModuleSchema,

parseObjectProperty,
translateDefault,
translateFunctionTypeAnnotation,
buildPropertySchema,
buildSchemaFromConfigType,
buildSchema,
};

@@ -83,3 +83,6 @@ /**

UnsupportedUnionTypeAnnotationParserError =
_require.UnsupportedUnionTypeAnnotationParserError;
_require.UnsupportedUnionTypeAnnotationParserError,
UnsupportedTypeAnnotationParserError =
_require.UnsupportedTypeAnnotationParserError,
ParserError = _require.ParserError;
const _require2 = require('./error-utils'),

@@ -138,6 +141,7 @@ throwIfArrayElementTypeAnnotationIsUnsupported =

aliasMap,
enumMap,
tryParse,
cxxOnly,
translateTypeAnnotation,
language,
parser,
) {

@@ -149,6 +153,7 @@ const translateFunctionTypeAnnotationValue = translateFunctionTypeAnnotation(

aliasMap,
enumMap,
tryParse,
cxxOnly,
translateTypeAnnotation,
language,
parser,
);

@@ -168,3 +173,3 @@ return wrapNullable(nullable, translateFunctionTypeAnnotationValue);

function typeAliasResolution(
typeAliasResolutionStatus,
typeResolution,
objectTypeAnnotation,

@@ -174,3 +179,3 @@ aliasMap,

) {
if (!typeAliasResolutionStatus.successful) {
if (!typeResolution.successful) {
return wrapNullable(nullable, objectTypeAnnotation);

@@ -182,3 +187,3 @@ }

*/
aliasMap[typeAliasResolutionStatus.aliasName] = objectTypeAnnotation;
aliasMap[typeResolution.name] = objectTypeAnnotation;

@@ -216,5 +221,49 @@ /**

type: 'TypeAliasTypeAnnotation',
name: typeAliasResolutionStatus.aliasName,
name: typeResolution.name,
});
}
function typeEnumResolution(
typeAnnotation,
typeResolution,
nullable,
hasteModuleName,
language,
enumMap,
parser,
) {
if (!typeResolution.successful || typeResolution.type !== 'enum') {
throw new UnsupportedTypeAnnotationParserError(
hasteModuleName,
typeAnnotation,
language,
);
}
const enumName = typeResolution.name;
const enumMemberType = parser.parseEnumMembersType(typeAnnotation);
try {
parser.validateEnumMembersSupported(typeAnnotation, enumMemberType);
} catch (e) {
if (e instanceof Error) {
throw new ParserError(
hasteModuleName,
typeAnnotation,
`Failed parsing the enum ${enumName} in ${hasteModuleName} with the error: ${e.message}`,
);
} else {
throw e;
}
}
const enumMembers = parser.parseEnumMembers(typeAnnotation);
enumMap[enumName] = {
name: enumName,
type: 'EnumDeclarationWithMembers',
memberType: enumMemberType,
members: enumMembers,
};
return wrapNullable(nullable, {
name: enumName,
type: 'EnumDeclaration',
memberType: enumMemberType,
});
}
function emitPromise(

@@ -227,2 +276,3 @@ hasteModuleName,

aliasMap,
enumMap,
tryParse,

@@ -254,4 +304,6 @@ cxxOnly,

aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
),

@@ -266,3 +318,3 @@ });

}
function emitObject(nullable) {
function emitGenericObject(nullable) {
return wrapNullable(nullable, {

@@ -272,2 +324,8 @@ type: 'GenericObjectTypeAnnotation',

}
function emitObject(nullable, properties) {
return wrapNullable(nullable, {
type: 'ObjectTypeAnnotation',
properties,
});
}
function emitFloat(nullable) {

@@ -289,3 +347,2 @@ return wrapNullable(nullable, {

unionTypes,
parser.language(),
);

@@ -302,2 +359,3 @@ }

aliasMap,
enumMap,
cxxOnly,

@@ -307,4 +365,4 @@ arrayType,

nullable,
language,
translateTypeAnnotation,
parser,
) {

@@ -323,2 +381,3 @@ try {

aliasMap,
enumMap,
/**

@@ -334,2 +393,3 @@ * TODO(T72031674): Ensure that all ParsingErrors that are thrown

cxxOnly,
parser,
),

@@ -345,3 +405,2 @@ ),

_elementType.type,
language,
);

@@ -365,2 +424,3 @@ return wrapNullable(nullable, {

aliasMap,
enumMap,
cxxOnly,

@@ -379,2 +439,3 @@ nullable,

aliasMap,
enumMap,
cxxOnly,

@@ -384,4 +445,4 @@ typeAnnotation.type,

nullable,
parser.language(),
translateTypeAnnotation,
parser,
);

@@ -397,2 +458,3 @@ }

emitNumber,
emitGenericObject,
emitObject,

@@ -407,3 +469,4 @@ emitPromise,

typeAliasResolution,
typeEnumResolution,
translateArrayTypeAnnotation,
};

@@ -203,2 +203,3 @@ /**

EdgeInsetsValue,
DimensionValue,
} from 'StyleSheetTypes';

@@ -302,2 +303,9 @@ import type {ViewProps} from 'ViewPropTypes';

insets_optional_both?: EdgeInsetsValue | null | undefined;
// DimensionValue props
dimension_required: DimensionValue;
dimension_optional_key?: DimensionValue;
dimension_optional_value: DimensionValue | null | undefined;
dimension_optional_both?: DimensionValue | null | undefined;
}

@@ -330,2 +338,3 @@

EdgeInsetsValue,
DimensionValue,
} from 'StyleSheetTypes';

@@ -404,2 +413,8 @@ import type {ViewProps} from 'ViewPropTypes';

// DimensionValue props
array_dimension_required: ReadonlyArray<DimensionValue>;
array_dimension_optional_key?: ReadonlyArray<DimensionValue>;
array_dimension_optional_value: ReadonlyArray<DimensionValue> | null | undefined;
array_dimension_optional_both?: ReadonlyArray<DimensionValue> | null | undefined;
// Object props

@@ -622,2 +637,3 @@ array_object_required: ReadonlyArray<Readonly<{prop: string}>>;

EdgeInsetsValue,
DimensionValue,
} from 'StyleSheetTypes';

@@ -688,2 +704,8 @@ import type {ViewProps} from 'ViewPropTypes';

// DimensionValue props
dimension_required: Readonly<{prop: DimensionValue}>;
dimension_optional_key: Readonly<{prop?: DimensionValue}>;
dimension_optional_value: Readonly<{prop: DimensionValue | null | undefined}>;
dimension_optional_both: Readonly<{prop?: DimensionValue | null | undefined}>;
// Nested object props

@@ -690,0 +712,0 @@ object_required: Readonly<{prop: Readonly<{nestedProp: string}>}>;

@@ -15,2 +15,5 @@ /**

parseTopLevelType = _require.parseTopLevelType;
// $FlowFixMe[unclear-type] there's no flowtype for ASTs
function buildCommandSchemaInternal(name, optional, parameters, types) {

@@ -17,0 +20,0 @@ var _firstParam$typeAnnot, _firstParam$typeAnnot2;

@@ -221,2 +221,7 @@ /**

};
case 'DimensionValue':
return {
type: 'ReservedPropTypeAnnotation',
name: 'DimensionPrimitive',
};
case 'TSUnionType':

@@ -223,0 +228,0 @@ return getUnionOfLiterals(

@@ -152,2 +152,52 @@ /**

`;
const EMPTY_ENUM_NATIVE_MODULE = `
/**
* 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 {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport';
import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry';
export enum SomeEnum {
}
export interface Spec extends TurboModule {
readonly getEnums: (a: SomeEnum) => string;
}
export default TurboModuleRegistry.getEnforcing<Spec>(
'EmptyEnumNativeModule',
);
`;
const MIXED_VALUES_ENUM_NATIVE_MODULE = `
/**
* 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 {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport';
import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry';
export enum SomeEnum {
NUM = 1,
STR = 'str',
}
export interface Spec extends TurboModule {
readonly getEnums: (a: SomeEnum) => string;
}
export default TurboModuleRegistry.getEnforcing<Spec>(
'MixedValuesEnumNativeModule',
);
`;
module.exports = {

@@ -161,2 +211,4 @@ NATIVE_MODULES_WITH_UNNAMED_PARAMS,

TWO_NATIVE_EXTENDING_TURBO_MODULE,
EMPTY_ENUM_NATIVE_MODULE,
MIXED_VALUES_ENUM_NATIVE_MODULE,
};

@@ -192,2 +192,88 @@ /**

`;
const NATIVE_MODULE_WITH_NESTED_INTERFACES = `
/**
* 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 {TurboModule} from '../RCTExport';
import * as TurboModuleRegistry from '../TurboModuleRegistry';
interface Bar {
z: number
};
interface Base1 {
bar1: Bar,
}
interface Base2 {
bar2: Bar,
}
interface Base3 extends Base2 {
bar3: Bar,
}
interface Foo extends Base1, Base3 {
bar4: Bar,
};
export interface Spec extends TurboModule {
// Exported methods.
foo1: (x: Foo) => Foo;
foo2: (x: Foo) => void;
}
export default TurboModuleRegistry.getEnforcing<Spec>('SampleTurboModule');
`;
const NATIVE_MODULE_WITH_INTERSECTION_TYPES = `
/**
* 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 {TurboModule} from '../RCTExport';
import * as TurboModuleRegistry from '../TurboModuleRegistry';
type Bar = {
z: number
};
type Base1 = {
bar1: Bar,
}
type Base2 = {
bar2: Bar,
}
type Base3 = Base2 & {
bar3: Bar,
}
type Foo = Base1 & Base3 & {
bar4: Bar,
};
export interface Spec extends TurboModule {
// Exported methods.
foo1: (x: Foo) => Foo;
foo2: (x: Foo) => void;
}
export default TurboModuleRegistry.getEnforcing<Spec>('SampleTurboModule');
`;
const NATIVE_MODULE_WITH_FLOAT_AND_INT32 = `

@@ -253,2 +339,54 @@ /**

`;
const NATIVE_MODULE_WITH_PARTIALS = `
/**
* 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 {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport';
import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry';
export type SomeObj = {
a: string,
b?: boolean,
};
export interface Spec extends TurboModule {
getSomeObj: () => SomeObj;
getPartialSomeObj: () => Partial<SomeObj>;
getSomeObjFromPartialSomeObj: (value: Partial<SomeObj>) => SomeObj;
}
export default TurboModuleRegistry.getEnforcing<Spec>('SampleTurboModule');
`;
const NATIVE_MODULE_WITH_PARTIALS_COMPLEX = `
/**
* 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 {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport';
import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry';
export type SomeObj = {
a: string,
b?: boolean,
};
export type PartialSomeObj = Partial<SomeObj>;
export interface Spec extends TurboModule {
getPartialPartial: (value1: Partial<SomeObj>, value2: PartialSomeObj) => SomeObj;
}
export default TurboModuleRegistry.getEnforcing<Spec>('SampleTurboModule');
`;
const NATIVE_MODULE_WITH_ROOT_TAG = `

@@ -683,2 +821,4 @@ /**

NATIVE_MODULE_WITH_NESTED_ALIASES,
NATIVE_MODULE_WITH_NESTED_INTERFACES,
NATIVE_MODULE_WITH_INTERSECTION_TYPES,
NATIVE_MODULE_WITH_PROMISE,

@@ -689,2 +829,4 @@ NATIVE_MODULE_WITH_COMPLEX_OBJECTS,

NATIVE_MODULE_WITH_UNSAFE_OBJECT,
NATIVE_MODULE_WITH_PARTIALS,
NATIVE_MODULE_WITH_PARTIALS_COMPLEX,
NATIVE_MODULE_WITH_ROOT_TAG,

@@ -691,0 +833,0 @@ NATIVE_MODULE_WITH_NULLABLE_PARAM,

@@ -143,55 +143,113 @@ /**

}
const _require = require('../../utils'),
visit = _require.visit,
isModuleRegistryCall = _require.isModuleRegistryCall,
verifyPlatforms = _require.verifyPlatforms;
const _require2 = require('../utils'),
resolveTypeAnnotation = _require2.resolveTypeAnnotation,
getTypes = _require2.getTypes;
const _require3 = require('../../parsers-commons'),
parseObjectProperty = _require3.parseObjectProperty,
translateDefault = _require3.translateDefault,
buildPropertySchema = _require3.buildPropertySchema;
const _require4 = require('../../parsers-primitives'),
emitArrayType = _require4.emitArrayType,
emitBoolean = _require4.emitBoolean,
emitDouble = _require4.emitDouble,
emitFloat = _require4.emitFloat,
emitFunction = _require4.emitFunction,
emitNumber = _require4.emitNumber,
emitInt32 = _require4.emitInt32,
emitObject = _require4.emitObject,
emitPromise = _require4.emitPromise,
emitRootTag = _require4.emitRootTag,
emitVoid = _require4.emitVoid,
emitString = _require4.emitString,
emitStringish = _require4.emitStringish,
emitMixed = _require4.emitMixed,
emitUnion = _require4.emitUnion,
typeAliasResolution = _require4.typeAliasResolution,
translateArrayTypeAnnotation = _require4.translateArrayTypeAnnotation;
const _require5 = require('../../errors'),
UnsupportedGenericParserError = _require5.UnsupportedGenericParserError,
const _require = require('../parseTopLevelType'),
flattenIntersectionType = _require.flattenIntersectionType;
const _require2 = require('../components/componentsUtils'),
flattenProperties = _require2.flattenProperties;
const _require3 = require('../../utils'),
visit = _require3.visit,
isModuleRegistryCall = _require3.isModuleRegistryCall,
verifyPlatforms = _require3.verifyPlatforms;
const _require4 = require('../utils'),
resolveTypeAnnotation = _require4.resolveTypeAnnotation,
getTypes = _require4.getTypes;
const _require5 = require('../../parsers-commons'),
parseObjectProperty = _require5.parseObjectProperty,
buildPropertySchema = _require5.buildPropertySchema;
const _require6 = require('../../parsers-primitives'),
typeEnumResolution = _require6.typeEnumResolution;
const _require7 = require('../../parsers-primitives'),
emitArrayType = _require7.emitArrayType,
emitBoolean = _require7.emitBoolean,
emitDouble = _require7.emitDouble,
emitFloat = _require7.emitFloat,
emitFunction = _require7.emitFunction,
emitNumber = _require7.emitNumber,
emitInt32 = _require7.emitInt32,
emitGenericObject = _require7.emitGenericObject,
emitObject = _require7.emitObject,
emitPromise = _require7.emitPromise,
emitRootTag = _require7.emitRootTag,
emitVoid = _require7.emitVoid,
emitString = _require7.emitString,
emitStringish = _require7.emitStringish,
emitMixed = _require7.emitMixed,
emitUnion = _require7.emitUnion,
typeAliasResolution = _require7.typeAliasResolution,
translateArrayTypeAnnotation = _require7.translateArrayTypeAnnotation;
const _require8 = require('../../errors'),
UnsupportedGenericParserError = _require8.UnsupportedGenericParserError,
UnsupportedTypeAnnotationParserError =
_require5.UnsupportedTypeAnnotationParserError,
_require8.UnsupportedTypeAnnotationParserError,
IncorrectModuleRegistryCallArgumentTypeParserError =
_require5.IncorrectModuleRegistryCallArgumentTypeParserError;
const _require6 = require('../../error-utils'),
throwIfUntypedModule = _require6.throwIfUntypedModule,
_require8.IncorrectModuleRegistryCallArgumentTypeParserError;
const _require9 = require('../../error-utils'),
throwIfUntypedModule = _require9.throwIfUntypedModule,
throwIfUnusedModuleInterfaceParserError =
_require6.throwIfUnusedModuleInterfaceParserError,
throwIfModuleInterfaceNotFound = _require6.throwIfModuleInterfaceNotFound,
throwIfModuleInterfaceIsMisnamed = _require6.throwIfModuleInterfaceIsMisnamed,
_require9.throwIfUnusedModuleInterfaceParserError,
throwIfModuleInterfaceNotFound = _require9.throwIfModuleInterfaceNotFound,
throwIfModuleInterfaceIsMisnamed = _require9.throwIfModuleInterfaceIsMisnamed,
throwIfWrongNumberOfCallExpressionArgs =
_require6.throwIfWrongNumberOfCallExpressionArgs,
_require9.throwIfWrongNumberOfCallExpressionArgs,
throwIfMoreThanOneModuleRegistryCalls =
_require6.throwIfMoreThanOneModuleRegistryCalls,
_require9.throwIfMoreThanOneModuleRegistryCalls,
throwIfMoreThanOneModuleInterfaceParserError =
_require6.throwIfMoreThanOneModuleInterfaceParserError,
_require9.throwIfMoreThanOneModuleInterfaceParserError,
throwIfIncorrectModuleRegistryCallTypeParameterParserError =
_require6.throwIfIncorrectModuleRegistryCallTypeParameterParserError;
const _require7 = require('../parser'),
TypeScriptParser = _require7.TypeScriptParser;
_require9.throwIfIncorrectModuleRegistryCallTypeParameterParserError;
const language = 'TypeScript';
const parser = new TypeScriptParser();
function translateObjectTypeAnnotation(
hasteModuleName,
/**
* TODO(T108222691): Use flow-types for @babel/parser
*/
nullable,
objectMembers,
typeResolutionStatus,
baseTypes,
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
) {
// $FlowFixMe[missing-type-arg]
const properties = objectMembers
.map(property => {
return tryParse(() => {
return parseObjectProperty(
property,
hasteModuleName,
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
nullable,
translateTypeAnnotation,
parser,
);
});
})
.filter(Boolean);
let objectTypeAnnotation;
if (baseTypes.length === 0) {
objectTypeAnnotation = {
type: 'ObjectTypeAnnotation',
properties,
};
} else {
objectTypeAnnotation = {
type: 'ObjectTypeAnnotation',
properties,
baseTypes,
};
}
return typeAliasResolution(
typeResolutionStatus,
objectTypeAnnotation,
aliasMap,
nullable,
);
}
function translateTypeAnnotation(

@@ -205,4 +263,6 @@ hasteModuleName,

aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
) {

@@ -215,3 +275,3 @@ const _resolveTypeAnnotatio = resolveTypeAnnotation(

typeAnnotation = _resolveTypeAnnotatio.typeAnnotation,
typeAliasResolutionStatus = _resolveTypeAnnotatio.typeAliasResolutionStatus;
typeResolutionStatus = _resolveTypeAnnotatio.typeResolutionStatus;
switch (typeAnnotation.type) {

@@ -223,2 +283,3 @@ case 'TSArrayType': {

aliasMap,
enumMap,
cxxOnly,

@@ -228,4 +289,4 @@ 'Array',

nullable,
language,
translateTypeAnnotation,
parser,
);

@@ -242,2 +303,3 @@ }

aliasMap,
enumMap,
cxxOnly,

@@ -247,4 +309,4 @@ 'ReadonlyArray',

nullable,
language,
translateTypeAnnotation,
parser,
);

@@ -272,2 +334,3 @@ } else {

aliasMap,
enumMap,
tryParse,

@@ -286,2 +349,3 @@ cxxOnly,

aliasMap,
enumMap,
cxxOnly,

@@ -306,10 +370,41 @@ nullable,

case 'Object': {
return emitObject(nullable);
return emitGenericObject(nullable);
}
case 'Partial': {
if (typeAnnotation.typeParameters.params.length !== 1) {
throw new Error(
'Partials only support annotating exactly one parameter.',
);
}
const annotatedElement =
types[typeAnnotation.typeParameters.params[0].typeName.name];
if (!annotatedElement) {
throw new Error(
'Partials only support annotating a type parameter.',
);
}
const properties = annotatedElement.typeAnnotation.members.map(
member => {
return {
name: member.key.name,
optional: true,
typeAnnotation: translateTypeAnnotation(
hasteModuleName,
member.typeAnnotation.typeAnnotation,
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
),
};
},
);
return emitObject(nullable, properties);
}
default: {
return translateDefault(
throw new UnsupportedGenericParserError(
hasteModuleName,
typeAnnotation,
types,
nullable,
parser,

@@ -320,29 +415,108 @@ );

}
case 'TSInterfaceDeclaration': {
var _typeAnnotation$exten;
const baseTypes = (
(_typeAnnotation$exten = typeAnnotation.extends) !== null &&
_typeAnnotation$exten !== void 0
? _typeAnnotation$exten
: []
).map(extend => extend.expression.name);
for (const baseType of baseTypes) {
// ensure base types exist and appear in aliasMap
translateTypeAnnotation(
hasteModuleName,
{
type: 'TSTypeReference',
typeName: {
type: 'Identifier',
name: baseType,
},
},
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
);
}
return translateObjectTypeAnnotation(
hasteModuleName,
nullable,
flattenProperties([typeAnnotation], types),
typeResolutionStatus,
baseTypes,
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
);
}
case 'TSIntersectionType': {
return translateObjectTypeAnnotation(
hasteModuleName,
nullable,
flattenProperties(
flattenIntersectionType(typeAnnotation, types),
types,
),
typeResolutionStatus,
[],
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
);
}
case 'TSTypeLiteral': {
const objectTypeAnnotation = {
type: 'ObjectTypeAnnotation',
// $FlowFixMe[missing-type-arg]
properties: typeAnnotation.members
.map(property => {
return tryParse(() => {
return parseObjectProperty(
property,
hasteModuleName,
types,
aliasMap,
tryParse,
cxxOnly,
nullable,
translateTypeAnnotation,
parser,
);
});
})
.filter(Boolean),
};
return typeAliasResolution(
typeAliasResolutionStatus,
objectTypeAnnotation,
// if there is TSIndexSignature, then it is a dictionary
if (typeAnnotation.members) {
const indexSignatures = typeAnnotation.members.filter(
member => member.type === 'TSIndexSignature',
);
if (indexSignatures.length > 0) {
// check the property type to prevent developers from using unsupported types
// the return value from `translateTypeAnnotation` is unused
const propertyType = indexSignatures[0].typeAnnotation;
translateTypeAnnotation(
hasteModuleName,
propertyType,
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
);
// no need to do further checking
return emitGenericObject(nullable);
}
}
return translateObjectTypeAnnotation(
hasteModuleName,
nullable,
typeAnnotation.members,
typeResolutionStatus,
[],
types,
aliasMap,
enumMap,
tryParse,
cxxOnly,
parser,
);
}
case 'TSEnumDeclaration': {
return typeEnumResolution(
typeAnnotation,
typeResolutionStatus,
nullable,
hasteModuleName,
language,
enumMap,
parser,
);

@@ -369,6 +543,7 @@ }

aliasMap,
enumMap,
tryParse,
cxxOnly,
translateTypeAnnotation,
language,
parser,
);

@@ -413,2 +588,3 @@ }

tryParse,
parser,
) {

@@ -446,3 +622,2 @@ const types = getTypes(ast);

callExpressions,
language,
);

@@ -453,3 +628,2 @@ throwIfMoreThanOneModuleRegistryCalls(

callExpressions.length,
language,
);

@@ -464,3 +638,2 @@ const callExpression = callExpressions[0];

callExpression.arguments.length,
language,
);

@@ -474,3 +647,2 @@ if (callExpression.arguments[0].type !== 'StringLiteral') {

type,
language,
);

@@ -485,3 +657,2 @@ }

$moduleName,
language,
);

@@ -515,4 +686,6 @@ throwIfIncorrectModuleRegistryCallTypeParameterParserError(

const aliasMap = {};
const enumMap = {};
return tryParse(() => ({
aliasMap: aliasMap,
enumMap: enumMap,
propertyShape: buildPropertySchema(

@@ -523,7 +696,8 @@ hasteModuleName,

aliasMap,
enumMap,
tryParse,
cxxOnly,
language,
resolveTypeAnnotation,
translateTypeAnnotation,
parser,
),

@@ -534,9 +708,13 @@ }));

.reduce(
(moduleSchema, {aliasMap, propertyShape}) => {
(moduleSchema, {aliasMap, enumMap, propertyShape}) => {
return {
type: 'NativeModule',
aliases: _objectSpread(
_objectSpread({}, moduleSchema.aliases),
aliasMap: _objectSpread(
_objectSpread({}, moduleSchema.aliasMap),
aliasMap,
),
enumMap: _objectSpread(
_objectSpread({}, moduleSchema.enumMap),
enumMap,
),
spec: {

@@ -551,3 +729,4 @@ properties: [...moduleSchema.spec.properties, propertyShape],

type: 'NativeModule',
aliases: {},
aliasMap: {},
enumMap: {},
spec: {

@@ -554,0 +733,0 @@ properties: [],

@@ -41,5 +41,18 @@ /**

}
const _require = require('../errors'),
// $FlowFixMe[untyped-import] Use flow-types for @babel/parser
const babelParser = require('@babel/parser');
const _require = require('../parsers-commons'),
buildSchema = _require.buildSchema;
const _require2 = require('./Visitor'),
Visitor = _require2.Visitor;
const _require3 = require('./components'),
buildComponentSchema = _require3.buildComponentSchema;
const _require4 = require('./components/schema'),
wrapComponentSchema = _require4.wrapComponentSchema;
const _require5 = require('./modules'),
buildModuleSchema = _require5.buildModuleSchema;
const fs = require('fs');
const _require6 = require('../errors'),
UnsupportedObjectPropertyTypeAnnotationParserError =
_require.UnsupportedObjectPropertyTypeAnnotationParserError;
_require6.UnsupportedObjectPropertyTypeAnnotationParserError;
class TypeScriptParser {

@@ -53,28 +66,16 @@ constructor() {

}
getKeyName(propertyOrIndex, hasteModuleName) {
switch (propertyOrIndex.type) {
case 'TSPropertySignature':
return propertyOrIndex.key.name;
case 'TSIndexSignature':
return propertyOrIndex.parameters[0].name;
default:
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
hasteModuleName,
propertyOrIndex,
propertyOrIndex.type,
this.language(),
);
}
isProperty(property) {
return property.type === 'TSPropertySignature';
}
getMaybeEnumMemberType(maybeEnumDeclaration) {
if (maybeEnumDeclaration.members[0].initializer) {
return maybeEnumDeclaration.members[0].initializer.type
.replace('NumericLiteral', 'NumberTypeAnnotation')
.replace('StringLiteral', 'StringTypeAnnotation');
getKeyName(property, hasteModuleName) {
if (!this.isProperty(property)) {
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
hasteModuleName,
property,
property.type,
this.language(),
);
}
return 'StringTypeAnnotation';
return property.key.name;
}
isEnumDeclaration(maybeEnumDeclaration) {
return maybeEnumDeclaration.type === 'TSEnumDeclaration';
}
language() {

@@ -104,2 +105,107 @@ return 'TypeScript';

}
parseFile(filename) {
const contents = fs.readFileSync(filename, 'utf8');
return this.parseString(contents, filename);
}
parseString(contents, filename) {
return buildSchema(
contents,
filename,
wrapComponentSchema,
buildComponentSchema,
buildModuleSchema,
Visitor,
this,
);
}
parseModuleFixture(filename) {
const contents = fs.readFileSync(filename, 'utf8');
return this.parseString(contents, 'path/NativeSampleTurboModule.ts');
}
getAst(contents) {
return babelParser.parse(contents, {
sourceType: 'module',
plugins: ['typescript'],
}).program;
}
getFunctionTypeAnnotationParameters(functionTypeAnnotation) {
return functionTypeAnnotation.parameters;
}
getFunctionNameFromParameter(parameter) {
return parameter.typeAnnotation;
}
getParameterName(parameter) {
return parameter.name;
}
getParameterTypeAnnotation(parameter) {
return parameter.typeAnnotation.typeAnnotation;
}
getFunctionTypeAnnotationReturnType(functionTypeAnnotation) {
return functionTypeAnnotation.typeAnnotation.typeAnnotation;
}
parseEnumMembersType(typeAnnotation) {
var _typeAnnotation$membe;
const enumInitializer =
(_typeAnnotation$membe = typeAnnotation.members[0]) === null ||
_typeAnnotation$membe === void 0
? void 0
: _typeAnnotation$membe.initializer;
const enumMembersType =
!enumInitializer || enumInitializer.type === 'StringLiteral'
? 'StringTypeAnnotation'
: enumInitializer.type === 'NumericLiteral'
? 'NumberTypeAnnotation'
: null;
if (!enumMembersType) {
throw new Error(
'Enum values must be either blank, number, or string values.',
);
}
return enumMembersType;
}
validateEnumMembersSupported(typeAnnotation, enumMembersType) {
if (!typeAnnotation.members || typeAnnotation.members.length === 0) {
throw new Error('Enums should have at least one member.');
}
const enumInitializerType =
enumMembersType === 'StringTypeAnnotation'
? 'StringLiteral'
: enumMembersType === 'NumberTypeAnnotation'
? 'NumericLiteral'
: null;
typeAnnotation.members.forEach(member => {
var _member$initializer$t, _member$initializer;
if (
((_member$initializer$t =
(_member$initializer = member.initializer) === null ||
_member$initializer === void 0
? void 0
: _member$initializer.type) !== null &&
_member$initializer$t !== void 0
? _member$initializer$t
: 'StringLiteral') !== enumInitializerType
) {
throw new Error(
'Enum values can not be mixed. They all must be either blank, number, or string values.',
);
}
});
}
parseEnumMembers(typeAnnotation) {
return typeAnnotation.members.map(member => {
var _member$initializer$v, _member$initializer2;
return {
name: member.id.name,
value:
(_member$initializer$v =
(_member$initializer2 = member.initializer) === null ||
_member$initializer2 === void 0
? void 0
: _member$initializer2.value) !== null &&
_member$initializer$v !== void 0
? _member$initializer$v
: member.id.name,
};
});
}
}

@@ -106,0 +212,0 @@ module.exports = {

@@ -19,3 +19,2 @@ /**

*/
function getTypes(ast) {

@@ -65,3 +64,3 @@ return ast.body.reduce((types, node) => {

let nullable = false;
let typeAliasResolutionStatus = {
let typeResolutionStatus = {
successful: false,

@@ -73,21 +72,42 @@ };

node = topLevelType.type;
if (node.type === 'TSTypeReference') {
typeAliasResolutionStatus = {
successful: true,
aliasName: node.typeName.name,
};
const resolvedTypeAnnotation = types[node.typeName.name];
if (
resolvedTypeAnnotation == null ||
resolvedTypeAnnotation.type === 'TSEnumDeclaration'
) {
if (node.type !== 'TSTypeReference') {
break;
}
const resolvedTypeAnnotation = types[node.typeName.name];
if (resolvedTypeAnnotation == null) {
break;
}
switch (resolvedTypeAnnotation.type) {
case 'TSTypeAliasDeclaration': {
typeResolutionStatus = {
successful: true,
type: 'alias',
name: node.typeName.name,
};
node = resolvedTypeAnnotation.typeAnnotation;
break;
}
invariant(
resolvedTypeAnnotation.type === 'TSTypeAliasDeclaration',
`GenericTypeAnnotation '${node.typeName.name}' must resolve to a TSTypeAliasDeclaration. Instead, it resolved to a '${resolvedTypeAnnotation.type}'`,
);
node = resolvedTypeAnnotation.typeAnnotation;
} else {
break;
case 'TSInterfaceDeclaration': {
typeResolutionStatus = {
successful: true,
type: 'alias',
name: node.typeName.name,
};
node = resolvedTypeAnnotation;
break;
}
case 'TSEnumDeclaration': {
typeResolutionStatus = {
successful: true,
type: 'enum',
name: node.typeName.name,
};
node = resolvedTypeAnnotation;
break;
}
default: {
throw new TypeError(
`A non GenericTypeAnnotation must be a type declaration ('TSTypeAliasDeclaration'), an interface ('TSInterfaceDeclaration'), or enum ('TSEnumDeclaration'). Instead, got the unsupported ${resolvedTypeAnnotation.type}.`,
);
}
}

@@ -98,3 +118,3 @@ }

typeAnnotation: node,
typeAliasResolutionStatus,
typeResolutionStatus,
};

@@ -101,0 +121,0 @@ }

@@ -13,77 +13,5 @@ /**

function _slicedToArray(arr, i) {
return (
_arrayWithHoles(arr) ||
_iterableToArrayLimit(arr, i) ||
_unsupportedIterableToArray(arr, i) ||
_nonIterableRest()
);
}
function _nonIterableRest() {
throw new TypeError(
'Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.',
);
}
function _unsupportedIterableToArray(o, minLen) {
if (!o) return;
if (typeof o === 'string') return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === 'Object' && o.constructor) n = o.constructor.name;
if (n === 'Map' || n === 'Set') return Array.from(o);
if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
return arr2;
}
function _iterableToArrayLimit(arr, i) {
var _i =
null == arr
? null
: ('undefined' != typeof Symbol && arr[Symbol.iterator]) ||
arr['@@iterator'];
if (null != _i) {
var _s,
_e,
_x,
_r,
_arr = [],
_n = !0,
_d = !1;
try {
if (((_x = (_i = _i.call(arr)).next), 0 === i)) {
if (Object(_i) !== _i) return;
_n = !1;
} else
for (
;
!(_n = (_s = _x.call(_i)).done) &&
(_arr.push(_s.value), _arr.length !== i);
_n = !0
);
} catch (err) {
(_d = !0), (_e = err);
} finally {
try {
if (!_n && null != _i.return && ((_r = _i.return()), Object(_r) !== _r))
return;
} finally {
if (_d) throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
const _require = require('./errors'),
ParserError = _require.ParserError;
const _require2 = require('./parsers-commons'),
wrapModuleSchema = _require2.wrapModuleSchema;
const fs = require('fs');
const path = require('path');
const invariant = require('invariant');
function extractNativeModuleName(filename) {

@@ -134,6 +62,2 @@ // this should drop everything after the file name. For Example it will drop:

}
function parseFile(filename, callback) {
const contents = fs.readFileSync(filename, 'utf8');
return callback(contents, filename);
}

@@ -161,49 +85,2 @@ // TODO(T108222691): Use flow-types for @babel/parser

}
function buildSchemaFromConfigType(
configType,
filename,
ast,
wrapComponentSchema,
buildComponentSchema,
buildModuleSchema,
) {
switch (configType) {
case 'component': {
return wrapComponentSchema(buildComponentSchema(ast));
}
case 'module': {
if (filename === undefined || filename === null) {
throw new Error('Filepath expected while parasing a module');
}
const nativeModuleName = extractNativeModuleName(filename);
const _createParserErrorCap = createParserErrorCapturer(),
_createParserErrorCap2 = _slicedToArray(_createParserErrorCap, 2),
parsingErrors = _createParserErrorCap2[0],
tryParse = _createParserErrorCap2[1];
const schema = tryParse(() =>
buildModuleSchema(nativeModuleName, ast, tryParse),
);
if (parsingErrors.length > 0) {
/**
* TODO(T77968131): We have two options:
* - Throw the first error, but indicate there are more then one errors.
* - Display all errors, nicely formatted.
*
* For the time being, we're just throw the first error.
**/
throw parsingErrors[0];
}
invariant(
schema != null,
'When there are no parsing errors, the schema should not be null',
);
return wrapModuleSchema(schema, nativeModuleName);
}
default:
return {
modules: {},
};
}
}
function getConfigType(

@@ -272,6 +149,4 @@ // TODO(T71778680): Flow-type this node.

verifyPlatforms,
parseFile,
visit,
buildSchemaFromConfigType,
isModuleRegistryCall,
};
{
"name": "@react-native/codegen",
"version": "0.72.1",
"version": "0.72.2",
"description": "⚛️ Code generation tools for React Native",

@@ -44,3 +44,6 @@ "homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/react-native-codegen",

"rimraf": "^3.0.2"
},
"peerDependencies": {
"@babel/preset-env": "^7.1.6"
}
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc