From 3cf400a51bc1e3e4963ca15bad04a4e71bdd8efe Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Mon, 3 Feb 2025 03:49:23 -0800 Subject: [PATCH] Convert build scripts to regular Flow syntax (#49103) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/49103 Changelog: [Internal] Reviewed By: j-piasecki Differential Revision: D68960540 fbshipit-source-id: 0ac01529eaea97db98b85b6021532092997d633b --- scripts/babel-register.js | 30 +++++++++++++++++-- scripts/build/babel/node.config.js | 4 +-- scripts/build/build-types.js | 12 ++++---- .../transforms/stripPrivateProperties.js | 18 +++++------ .../build/build-types/translateSourceFile.js | 18 ++++------- scripts/build/build.js | 2 ++ scripts/build/clean.js | 2 ++ scripts/build/config.js | 20 ++++++------- 8 files changed, 63 insertions(+), 43 deletions(-) diff --git a/scripts/babel-register.js b/scripts/babel-register.js index d2c20f6524a..c174a3c8c21 100644 --- a/scripts/babel-register.js +++ b/scripts/babel-register.js @@ -9,9 +9,14 @@ * @oncall react_native */ -const {PACKAGES_DIR, RN_INTEGRATION_TESTS_RUNNER_DIR} = require('./consts'); +const { + PACKAGES_DIR, + RN_INTEGRATION_TESTS_RUNNER_DIR, + SCRIPTS_DIR, +} = require('./consts'); let isRegisteredForMonorepo = false; +let isRegisteredForScriptsDir = false; /** * Calling this function enables all Node.js packages to run from source when @@ -46,4 +51,25 @@ function registerForMonorepo() { isRegisteredForMonorepo = true; } -module.exports = {registerForMonorepo}; +/** + * Calling this function enables entry points under scripts/ to run from source. + * + * ```js + * // Place in a script entry point + * require('../babel-register').registerForScript(); + * ``` + */ +function registerForScript() { + if (isRegisteredForScriptsDir) { + return; + } + + require('metro-babel-register')([SCRIPTS_DIR]); + + isRegisteredForScriptsDir = true; +} + +module.exports = { + registerForMonorepo, + registerForScript, +}; diff --git a/scripts/build/babel/node.config.js b/scripts/build/babel/node.config.js index a30d835a335..76c2eb8365b 100644 --- a/scripts/build/babel/node.config.js +++ b/scripts/build/babel/node.config.js @@ -9,13 +9,11 @@ * @oncall react_native */ -/*:: import type {BabelCoreOptions} from '@babel/core'; -*/ const TARGET_NODE_VERSION = '18'; -const config /*: BabelCoreOptions */ = { +const config: BabelCoreOptions = { presets: [ require.resolve('@babel/preset-flow'), [ diff --git a/scripts/build/build-types.js b/scripts/build/build-types.js index 495079ddd10..000c9c27f17 100644 --- a/scripts/build/build-types.js +++ b/scripts/build/build-types.js @@ -9,6 +9,8 @@ * @oncall react_native */ +require('../babel-register').registerForScript(); + const {PACKAGES_DIR, REPO_ROOT} = require('../consts'); const translateSourceFile = require('./build-types/translateSourceFile'); const chalk = require('chalk'); @@ -103,11 +105,11 @@ async function main() { ); } -function getPackageName(file /*: string */) /*: string */ { +function getPackageName(file: string): string { return path.relative(PACKAGES_DIR, file).split(path.sep)[0]; } -function getBuildPath(file /*: string */) /*: string */ { +function getBuildPath(file: string): string { const packageDir = path.join(PACKAGES_DIR, getPackageName(file)); return path.join( @@ -119,9 +121,9 @@ function getBuildPath(file /*: string */) /*: string */ { ); } -function ignoreShadowedFiles(files /*: Array */) /*: Array */ { - const shadowedPrefixes /*: Record */ = {}; - const result /*: Array */ = []; +function ignoreShadowedFiles(files: Array): Array { + const shadowedPrefixes: Record = {}; + const result: Array = []; // Find all flow definition files that shadow other files for (const file of files) { diff --git a/scripts/build/build-types/transforms/stripPrivateProperties.js b/scripts/build/build-types/transforms/stripPrivateProperties.js index 5eb45927693..0fc46999cf8 100644 --- a/scripts/build/build-types/transforms/stripPrivateProperties.js +++ b/scripts/build/build-types/transforms/stripPrivateProperties.js @@ -9,31 +9,29 @@ * @oncall react_native */ -/*:: import type {TransformVisitor} from 'hermes-transform'; -import type {TransformASTResult} from 'hermes-transform/dist/transform/transformAST'; import type {ParseResult} from 'hermes-transform/dist/transform/parse'; - */ +import type {TransformASTResult} from 'hermes-transform/dist/transform/transformAST'; const {transformAST} = require('hermes-transform/dist/transform/transformAST'); -const visitors /*: TransformVisitor */ = context => ({ - ObjectTypeProperty(node) /*: void */ { +const visitors: TransformVisitor = context => ({ + ObjectTypeProperty(node): void { if (node.key.type === 'Identifier' && node.key.name.startsWith('_')) { context.removeNode(node); } }, - Property(node) /*: void */ { + Property(node): void { if (node.key.type === 'Identifier' && node.key.name.startsWith('_')) { context.removeNode(node); } }, - PropertyDefinition(node) /*: void */ { + PropertyDefinition(node): void { if (node.key.type === 'Identifier' && node.key.name.startsWith('_')) { context.removeNode(node); } }, - MethodDefinition(node) /*: void */ { + MethodDefinition(node): void { if (node.key.type === 'Identifier' && node.key.name.startsWith('_')) { context.removeNode(node); } @@ -41,8 +39,8 @@ const visitors /*: TransformVisitor */ = context => ({ }); async function stripPrivateProperties( - source /*: ParseResult */, -) /*: Promise */ { + source: ParseResult, +): Promise { return transformAST(source, visitors); } diff --git a/scripts/build/build-types/translateSourceFile.js b/scripts/build/build-types/translateSourceFile.js index 6a98d5e525b..10b6ec984e3 100644 --- a/scripts/build/build-types/translateSourceFile.js +++ b/scripts/build/build-types/translateSourceFile.js @@ -9,19 +9,15 @@ * @oncall react_native */ -/*:: import type {ParseResult} from 'hermes-transform/dist/transform/parse'; import type {TransformASTResult} from 'hermes-transform/dist/transform/transformAST'; -*/ const translate = require('flow-api-translator'); const {parse, print} = require('hermes-transform'); -/*:: -type TransformFn = (ParseResult) => Promise; -*/ +type TransformFn = ParseResult => Promise; -const preTransforms /*: Array */ = [ +const preTransforms: Array = [ require('./transforms/stripPrivateProperties'), ]; const prettierOptions = {parser: 'babel'}; @@ -32,9 +28,7 @@ const prettierOptions = {parser: 'babel'}; * This uses [flow-api-translator](https://www.npmjs.com/package/flow-api-translator), * and applies extra transformations such as stripping private properties. */ -async function translateSourceFile( - source /*: string */, -) /*: Promise */ { +async function translateSourceFile(source: string): Promise { // Parse Flow source const parsed = await parse(source); @@ -49,9 +43,9 @@ async function translateSourceFile( } async function applyTransforms( - source /*: ParseResult */, - transforms /*: $ReadOnlyArray */, -) /*: Promise */ { + source: ParseResult, + transforms: $ReadOnlyArray, +): Promise { return transforms.reduce((input, transform) => { return input.then(async result => { const transformed = await transform(result); diff --git a/scripts/build/build.js b/scripts/build/build.js index 1bc07e39c64..1f12a1d6e93 100644 --- a/scripts/build/build.js +++ b/scripts/build/build.js @@ -9,6 +9,8 @@ * @oncall react_native */ +require('../babel-register').registerForScript(); + const {PACKAGES_DIR, REPO_ROOT} = require('../consts'); const { buildConfig, diff --git a/scripts/build/clean.js b/scripts/build/clean.js index f405362e61f..343862d6fe8 100644 --- a/scripts/build/clean.js +++ b/scripts/build/clean.js @@ -9,6 +9,8 @@ * @oncall react_native */ +require('../babel-register').registerForScript(); + const {BUILD_DIR, PACKAGES_DIR} = require('./build'); const {buildConfig} = require('./config'); const fs = require('fs'); diff --git a/scripts/build/config.js b/scripts/build/config.js index e889eb4d1b7..71bdc843cd6 100644 --- a/scripts/build/config.js +++ b/scripts/build/config.js @@ -9,13 +9,12 @@ * @oncall react_native */ -/*:: +require('../babel-register').registerForScript(); + import type {BabelCoreOptions} from '@babel/core'; -*/ const {ModuleResolutionKind} = require('typescript'); -/*:: export type BuildOptions = $ReadOnly<{ // The target runtime to compile for. target: 'node', @@ -31,7 +30,6 @@ export type BuildConfig = $ReadOnly<{ // The packages to include for build and their build options. packages: $ReadOnly<{[packageName: string]: BuildOptions}>, }>; -*/ /** * - BUILD CONFIG - @@ -40,7 +38,7 @@ export type BuildConfig = $ReadOnly<{ * setup. These must use a consistent package structure and (today) target * Node.js packages only. */ -const buildConfig /*: BuildConfig */ = { +const buildConfig: BuildConfig = { /* eslint sort-keys: "error" */ packages: { 'community-cli-plugin': { @@ -67,8 +65,8 @@ const defaultBuildOptions = { }; function getBuildOptions( - packageName /*: $Keys */, -) /*: Required */ { + packageName: $Keys, +): Required { return { ...defaultBuildOptions, ...buildConfig.packages[packageName], @@ -76,8 +74,8 @@ function getBuildOptions( } function getBabelConfig( - packageName /*: $Keys */, -) /*: BabelCoreOptions */ { + packageName: $Keys, +): BabelCoreOptions { const {target} = getBuildOptions(packageName); switch (target) { @@ -87,8 +85,8 @@ function getBabelConfig( } function getTypeScriptCompilerOptions( - packageName /*: $Keys */, -) /*: Object */ { + packageName: $Keys, +): Object { const {target} = getBuildOptions(packageName); switch (target) {