From ec851ccf4f329bb6e629b6b48839f5345e18b86b Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Tue, 4 Mar 2025 05:35:34 -0800 Subject: [PATCH] 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 --- scripts/build/build-types/buildTypes.js | 9 --------- .../build/build-types/resolution/getDependencies.js | 3 ++- .../build-types/resolution/resolveTypeInputFile.js | 11 ++++++++++- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/scripts/build/build-types/buildTypes.js b/scripts/build/build-types/buildTypes.js index 5ea7cf623e0..1b1159e71bb 100644 --- a/scripts/build/build-types/buildTypes.js +++ b/scripts/build/build-types/buildTypes.js @@ -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 { 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); diff --git a/scripts/build/build-types/resolution/getDependencies.js b/scripts/build/build-types/resolution/getDependencies.js index 4baee42c509..15e78bd8dcc 100644 --- a/scripts/build/build-types/resolution/getDependencies.js +++ b/scripts/build/build-types/resolution/getDependencies.js @@ -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); } }), ); diff --git a/scripts/build/build-types/resolution/resolveTypeInputFile.js b/scripts/build/build-types/resolution/resolveTypeInputFile.js index f35d6464768..a7ac87519cc 100644 --- a/scripts/build/build-types/resolution/resolveTypeInputFile.js +++ b/scripts/build/build-types/resolution/resolveTypeInputFile.js @@ -20,18 +20,25 @@ const TYPEDEF_MAPPING: Record> = { '.js': ['.js.flow'], }; +const cached = new Map(); + /** * 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; }