Simplify type source file resolution logic (#49785)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/49785

Changelog: [Internal]

Reviewed By: cipolleschi, iwoplaza

Differential Revision: D70487265

fbshipit-source-id: ed4654e975f5fec0fe76f8d5f156fef611e24d14
This commit is contained in:
Alex Hunt
2025-03-04 05:35:34 -08:00
committed by Facebook GitHub Bot
parent 3132cc88dd
commit ec851ccf4f
3 changed files with 12 additions and 11 deletions
-9
View File
@@ -11,7 +11,6 @@
const {PACKAGES_DIR, REPO_ROOT} = require('../../consts');
const getRequireStack = require('./resolution/getRequireStack');
const resolveTypeInputFile = require('./resolution/resolveTypeInputFile');
const translatedModuleTemplate = require('./templates/translatedModule.d.ts-template');
const translateSourceFile = require('./translateSourceFile');
const {promises: fs} = require('fs');
@@ -103,14 +102,6 @@ async function buildTypes(): Promise<void> {
const dependencyEdges: DependencyEdges = [];
while (files.size > 0) {
for (const file of files) {
const interfaceFile = resolveTypeInputFile(file);
if (interfaceFile) {
files.delete(file);
translatedFiles.add(file);
files.add(interfaceFile);
}
}
const dependencies = await translateSourceFiles(dependencyEdges, files);
dependencyEdges.push(...dependencies);
@@ -12,6 +12,7 @@
import type {DependencyContext} from './simpleResolve';
import type {ParseResult} from 'hermes-transform/dist/transform/parse';
const resolveTypeInputFile = require('./resolveTypeInputFile');
const simpleResolve = require('./simpleResolve');
const debug = require('debug')('build-types:resolution');
const {traverse} = require('hermes-transform/dist/traverse/traverse');
@@ -82,7 +83,7 @@ async function getDependencies(
);
if (resolved != null) {
dependencies.add(resolved);
dependencies.add(resolveTypeInputFile(resolved) ?? resolved);
}
}),
);
@@ -20,18 +20,25 @@ const TYPEDEF_MAPPING: Record<string, $ReadOnlyArray<string>> = {
'.js': ['.js.flow'],
};
const cached = new Map<string, ?string>();
/**
* Resolve the Flow file defining the type interface for a given source file.
*
* Ensures common interface file (js.flow) or base implementation (.js) exists for
* platform-specific files (.android.js or .ios.js).
*/
function resolveTypeInputFile(file: string): string | null {
function resolveTypeInputFile(file: string): ?string {
if (cached.has(file)) {
return cached.get(file);
}
const [pathWithoutExt, extension] = splitPathAndExtension(file);
const extsToCheck = TYPEDEF_MAPPING[extension];
if (!extsToCheck) {
cached.set(file, null);
return null;
}
@@ -44,12 +51,14 @@ function resolveTypeInputFile(file: string): string | null {
path.relative(REPO_ROOT, file),
path.relative(REPO_ROOT, interfaceFile),
);
cached.set(file, interfaceFile);
return interfaceFile;
}
}
if (extension === '.js') {
// .js files do not require a common interface
cached.set(file, null);
return null;
}