From 32ce95cc0129e1ba158a36868824d36e7f5f921f Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Sun, 11 May 2025 22:49:43 -0700 Subject: [PATCH] Move transforms to build-types (#50982) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/50982 Changelog: [Internal] Reviewed By: huntie Differential Revision: D73667539 fbshipit-source-id: dc9ab6f3efef17f8ffd58a854363b39a31ec59d7 --- .../__fixtures__/sortProperties.d.ts | 0 .../__fixtures__/sortTypeDefinitions.d.ts | 0 .../transforms/__fixtures__/sortUnions.d.ts | 0 .../__snapshots__/sortProperties-test.js.snap | 0 .../sortTypeDefinitions-test.js.snap | 0 .../__snapshots__/sortUnions-test.js.snap | 0 .../removeReactNativeImports-test.js | 49 +++++++++++++++ .../__tests__/sortProperties-test.js | 0 .../__tests__/sortTypeDefinitions-test.js | 0 .../transforms/__tests__/sortUnions-test.js | 0 .../transforms/removeReactNativeImports.js | 63 +++++++++++++++++++ .../transforms/replaceDefaultExportName.js | 4 +- .../build-types/transforms/sortProperties.js | 0 .../transforms/sortTypeDefinitions.js | 0 .../build-types/transforms/sortUnions.js | 0 scripts/build-types/translateSourceFile.js | 7 ++- 16 files changed, 119 insertions(+), 4 deletions(-) rename scripts/{build => }/build-types/transforms/__fixtures__/sortProperties.d.ts (100%) rename scripts/{build => }/build-types/transforms/__fixtures__/sortTypeDefinitions.d.ts (100%) rename scripts/{build => }/build-types/transforms/__fixtures__/sortUnions.d.ts (100%) rename scripts/{build => }/build-types/transforms/__tests__/__snapshots__/sortProperties-test.js.snap (100%) rename scripts/{build => }/build-types/transforms/__tests__/__snapshots__/sortTypeDefinitions-test.js.snap (100%) rename scripts/{build => }/build-types/transforms/__tests__/__snapshots__/sortUnions-test.js.snap (100%) create mode 100644 scripts/build-types/transforms/__tests__/removeReactNativeImports-test.js rename scripts/{build => }/build-types/transforms/__tests__/sortProperties-test.js (100%) rename scripts/{build => }/build-types/transforms/__tests__/sortTypeDefinitions-test.js (100%) rename scripts/{build => }/build-types/transforms/__tests__/sortUnions-test.js (100%) create mode 100644 scripts/build-types/transforms/removeReactNativeImports.js rename scripts/{build => }/build-types/transforms/sortProperties.js (100%) rename scripts/{build => }/build-types/transforms/sortTypeDefinitions.js (100%) rename scripts/{build => }/build-types/transforms/sortUnions.js (100%) diff --git a/scripts/build/build-types/transforms/__fixtures__/sortProperties.d.ts b/scripts/build-types/transforms/__fixtures__/sortProperties.d.ts similarity index 100% rename from scripts/build/build-types/transforms/__fixtures__/sortProperties.d.ts rename to scripts/build-types/transforms/__fixtures__/sortProperties.d.ts diff --git a/scripts/build/build-types/transforms/__fixtures__/sortTypeDefinitions.d.ts b/scripts/build-types/transforms/__fixtures__/sortTypeDefinitions.d.ts similarity index 100% rename from scripts/build/build-types/transforms/__fixtures__/sortTypeDefinitions.d.ts rename to scripts/build-types/transforms/__fixtures__/sortTypeDefinitions.d.ts diff --git a/scripts/build/build-types/transforms/__fixtures__/sortUnions.d.ts b/scripts/build-types/transforms/__fixtures__/sortUnions.d.ts similarity index 100% rename from scripts/build/build-types/transforms/__fixtures__/sortUnions.d.ts rename to scripts/build-types/transforms/__fixtures__/sortUnions.d.ts diff --git a/scripts/build/build-types/transforms/__tests__/__snapshots__/sortProperties-test.js.snap b/scripts/build-types/transforms/__tests__/__snapshots__/sortProperties-test.js.snap similarity index 100% rename from scripts/build/build-types/transforms/__tests__/__snapshots__/sortProperties-test.js.snap rename to scripts/build-types/transforms/__tests__/__snapshots__/sortProperties-test.js.snap diff --git a/scripts/build/build-types/transforms/__tests__/__snapshots__/sortTypeDefinitions-test.js.snap b/scripts/build-types/transforms/__tests__/__snapshots__/sortTypeDefinitions-test.js.snap similarity index 100% rename from scripts/build/build-types/transforms/__tests__/__snapshots__/sortTypeDefinitions-test.js.snap rename to scripts/build-types/transforms/__tests__/__snapshots__/sortTypeDefinitions-test.js.snap diff --git a/scripts/build/build-types/transforms/__tests__/__snapshots__/sortUnions-test.js.snap b/scripts/build-types/transforms/__tests__/__snapshots__/sortUnions-test.js.snap similarity index 100% rename from scripts/build/build-types/transforms/__tests__/__snapshots__/sortUnions-test.js.snap rename to scripts/build-types/transforms/__tests__/__snapshots__/sortUnions-test.js.snap diff --git a/scripts/build-types/transforms/__tests__/removeReactNativeImports-test.js b/scripts/build-types/transforms/__tests__/removeReactNativeImports-test.js new file mode 100644 index 00000000000..de35d914ceb --- /dev/null +++ b/scripts/build-types/transforms/__tests__/removeReactNativeImports-test.js @@ -0,0 +1,49 @@ +/** + * 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 + * @oncall react_native + */ + +const removeReactNativeImports = require('../removeReactNativeImports.js'); +const babel = require('@babel/core'); + +async function translate(code: string): Promise { + const result = await babel.transformAsync(code, { + plugins: ['@babel/plugin-syntax-typescript', removeReactNativeImports], + }); + + return result.code; +} + +describe('removeReactNativeImports', () => { + test('should remove import and remove suffix', async () => { + const code = ` + import {View as View_2} from 'react-native'; + const Foo = View_2; + export default Foo; + `; + const result = await translate(code); + expect(result).toMatchInlineSnapshot(` + "const Foo = View; + export default Foo;" + `); + }); + + test('should remove import and decrease suffix', async () => { + const code = ` + import {View as View_3} from 'react-native'; + const Foo = View_3; + export default Foo; + `; + const result = await translate(code); + expect(result).toMatchInlineSnapshot(` + "const Foo = View_2; + export default Foo;" + `); + }); +}); diff --git a/scripts/build/build-types/transforms/__tests__/sortProperties-test.js b/scripts/build-types/transforms/__tests__/sortProperties-test.js similarity index 100% rename from scripts/build/build-types/transforms/__tests__/sortProperties-test.js rename to scripts/build-types/transforms/__tests__/sortProperties-test.js diff --git a/scripts/build/build-types/transforms/__tests__/sortTypeDefinitions-test.js b/scripts/build-types/transforms/__tests__/sortTypeDefinitions-test.js similarity index 100% rename from scripts/build/build-types/transforms/__tests__/sortTypeDefinitions-test.js rename to scripts/build-types/transforms/__tests__/sortTypeDefinitions-test.js diff --git a/scripts/build/build-types/transforms/__tests__/sortUnions-test.js b/scripts/build-types/transforms/__tests__/sortUnions-test.js similarity index 100% rename from scripts/build/build-types/transforms/__tests__/sortUnions-test.js rename to scripts/build-types/transforms/__tests__/sortUnions-test.js diff --git a/scripts/build-types/transforms/removeReactNativeImports.js b/scripts/build-types/transforms/removeReactNativeImports.js new file mode 100644 index 00000000000..06c98c9b0bf --- /dev/null +++ b/scripts/build-types/transforms/removeReactNativeImports.js @@ -0,0 +1,63 @@ +/** + * 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 + * @oncall react_native + */ + +import type {PluginObj} from '@babel/core'; + +import * as t from '@babel/types'; + +// When @microsoft/api-extractor bundles @virtualized-list types into the +// rollup, it does so preserving the imports from react-native. This casues +// the type duplication under aliased names. I.e. View_2 instead of View. +// This plugin removes the imports from react-native and updates references +// to the aliased names. +const visitor: PluginObj = { + visitor: { + Program(path) { + path.traverse({ + ImportDeclaration(importPath) { + const source = importPath.node.source.value; + + if (source === 'react-native') { + const specifiers = importPath.node.specifiers; + + specifiers.forEach(specifier => { + if (t.isImportSpecifier(specifier)) { + const localName = specifier.local.name; + const match = localName.match(/(\w+)_(\d+)/); + + if (match) { + const aliasName = match[1]; + const aliasIndex = Number(match[2]) - 1; + const newName = + aliasIndex === 1 ? aliasName : `${aliasName}_${aliasIndex}`; + + const binding = importPath.scope.getBinding(localName); + if (binding) { + binding.referencePaths.forEach(referencePath => { + // $FlowExpectedError[prop-missing] + // $FlowExpectedError[incompatible-type] + referencePath.node.name = newName; + }); + binding.identifier.name = newName; + } + } + } + }); + + importPath.remove(); + } + }, + }); + }, + }, +}; + +module.exports = visitor; diff --git a/scripts/build-types/transforms/replaceDefaultExportName.js b/scripts/build-types/transforms/replaceDefaultExportName.js index 9bab2e4c9e6..23367a1b024 100644 --- a/scripts/build-types/transforms/replaceDefaultExportName.js +++ b/scripts/build-types/transforms/replaceDefaultExportName.js @@ -11,7 +11,7 @@ import type {PluginObj} from '@babel/core'; -function createReplaceDefaultExportName(filePath: string): PluginObj { +function createDefaultExportNameReplacer(filePath: string): PluginObj { return { visitor: { Identifier(node) { @@ -29,4 +29,4 @@ function createReplaceDefaultExportName(filePath: string): PluginObj { }; } -module.exports = createReplaceDefaultExportName; +module.exports = createDefaultExportNameReplacer; diff --git a/scripts/build/build-types/transforms/sortProperties.js b/scripts/build-types/transforms/sortProperties.js similarity index 100% rename from scripts/build/build-types/transforms/sortProperties.js rename to scripts/build-types/transforms/sortProperties.js diff --git a/scripts/build/build-types/transforms/sortTypeDefinitions.js b/scripts/build-types/transforms/sortTypeDefinitions.js similarity index 100% rename from scripts/build/build-types/transforms/sortTypeDefinitions.js rename to scripts/build-types/transforms/sortTypeDefinitions.js diff --git a/scripts/build/build-types/transforms/sortUnions.js b/scripts/build-types/transforms/sortUnions.js similarity index 100% rename from scripts/build/build-types/transforms/sortUnions.js rename to scripts/build-types/transforms/sortUnions.js diff --git a/scripts/build-types/translateSourceFile.js b/scripts/build-types/translateSourceFile.js index 87d012ed634..134da0aa1a8 100644 --- a/scripts/build-types/translateSourceFile.js +++ b/scripts/build-types/translateSourceFile.js @@ -14,7 +14,7 @@ import type {ParseResult} from 'hermes-transform/dist/transform/parse'; import type {TransformASTResult} from 'hermes-transform/dist/transform/transformAST'; const getDependencies = require('./resolution/getDependencies'); -const createReplaceDefaultExportName = require('./transforms/replaceDefaultExportName'); +const createDefaultExportNameReplacer = require('./transforms/replaceDefaultExportName'); const babel = require('@babel/core'); const translate = require('flow-api-translator'); const {parse, print} = require('hermes-transform'); @@ -107,11 +107,14 @@ async function applyPostTransforms( source: string, filePath: string, ): Promise { + const fileName = filePath.split('/').pop() ?? ''; + const fileNameWithoutExt = fileName.split('.')[0]; + const result = await babel.transformAsync(source, { plugins: [ '@babel/plugin-syntax-typescript', ...postTransforms, - createReplaceDefaultExportName(filePath), + createDefaultExportNameReplacer(fileNameWithoutExt), ], });