diff --git a/jest/preprocessor.js b/jest/preprocessor.js index 22b3ab40c87c..63b9f9aeec2e 100644 --- a/jest/preprocessor.js +++ b/jest/preprocessor.js @@ -32,7 +32,7 @@ if (process.env.FBSOURCE_ENV === '1') { require('@fb-tools/babel-register'); } else { // Register Babel to allow local packages to be loaded from source - require('../scripts/build/babel-register').registerForMonorepo(); + require('../scripts/babel-register').registerForMonorepo(); } const transformer = require('@react-native/metro-babel-transformer'); diff --git a/packages/community-cli-plugin/src/index.js b/packages/community-cli-plugin/src/index.js index c95fbd8400e1..82b4e1d8f883 100644 --- a/packages/community-cli-plugin/src/index.js +++ b/packages/community-cli-plugin/src/index.js @@ -14,7 +14,7 @@ export type * from './index.flow'; */ if (!process.env.BUILD_EXCLUDE_BABEL_REGISTER) { - require('../../../scripts/build/babel-register').registerForMonorepo(); + require('../../../scripts/babel-register').registerForMonorepo(); } module.exports = require('./index.flow'); diff --git a/packages/core-cli-utils/src/index.js b/packages/core-cli-utils/src/index.js index 092239e58a61..baa362979221 100644 --- a/packages/core-cli-utils/src/index.js +++ b/packages/core-cli-utils/src/index.js @@ -14,7 +14,7 @@ export type * from './index.flow'; */ if (process.env.BUILD_EXCLUDE_BABEL_REGISTER == null) { - require('../../../scripts/build/babel-register').registerForMonorepo(); + require('../../../scripts/babel-register').registerForMonorepo(); } module.exports = require('./index.flow'); diff --git a/packages/core-cli-utils/src/public/version.js b/packages/core-cli-utils/src/public/version.js index 56ecb01ba751..4b22c1e3f972 100644 --- a/packages/core-cli-utils/src/public/version.js +++ b/packages/core-cli-utils/src/public/version.js @@ -14,7 +14,7 @@ export type * from './version.flow'; */ if (process.env.BUILD_EXCLUDE_BABEL_REGISTER == null) { - require('../../../../scripts/build/babel-register').registerForMonorepo(); + require('../../../../scripts/babel-register').registerForMonorepo(); } module.exports = require('./version.flow'); diff --git a/packages/dev-middleware/src/index.js b/packages/dev-middleware/src/index.js index b1cd97b5d455..c5770f1c554c 100644 --- a/packages/dev-middleware/src/index.js +++ b/packages/dev-middleware/src/index.js @@ -14,7 +14,7 @@ export type * from './index.flow'; */ if (!process.env.BUILD_EXCLUDE_BABEL_REGISTER) { - require('../../../scripts/build/babel-register').registerForMonorepo(); + require('../../../scripts/babel-register').registerForMonorepo(); } export * from './index.flow'; diff --git a/packages/helloworld/cli.js b/packages/helloworld/cli.js index b5ba1ed3c555..ce740de20997 100644 --- a/packages/helloworld/cli.js +++ b/packages/helloworld/cli.js @@ -32,7 +32,7 @@ function injectCoreCLIUtilsRuntimePatch() { if (process.env.BUILD_EXCLUDE_BABEL_REGISTER == null) { // $FlowFixMe[cannot-resolve-module] - require('../../scripts/build/babel-register').registerForMonorepo(); + require('../../scripts/babel-register').registerForMonorepo(); } injectCoreCLIUtilsRuntimePatch(); diff --git a/packages/metro-config/src/index.js b/packages/metro-config/src/index.js index c95fbd8400e1..82b4e1d8f883 100644 --- a/packages/metro-config/src/index.js +++ b/packages/metro-config/src/index.js @@ -14,7 +14,7 @@ export type * from './index.flow'; */ if (!process.env.BUILD_EXCLUDE_BABEL_REGISTER) { - require('../../../scripts/build/babel-register').registerForMonorepo(); + require('../../../scripts/babel-register').registerForMonorepo(); } module.exports = require('./index.flow'); diff --git a/packages/react-native-fantom/config/metro-babel-transformer.js b/packages/react-native-fantom/config/metro-babel-transformer.js index 3080b3c8f624..43db237cafea 100644 --- a/packages/react-native-fantom/config/metro-babel-transformer.js +++ b/packages/react-native-fantom/config/metro-babel-transformer.js @@ -9,5 +9,5 @@ 'use strict'; -require('../../../scripts/build/babel-register').registerForMonorepo(); +require('../../../scripts/babel-register').registerForMonorepo(); module.exports = require('@react-native/metro-babel-transformer'); diff --git a/packages/react-native-fantom/runner/index.js b/packages/react-native-fantom/runner/index.js index 8caba4a174f9..882f09953fce 100644 --- a/packages/react-native-fantom/runner/index.js +++ b/packages/react-native-fantom/runner/index.js @@ -8,6 +8,6 @@ * @oncall react_native */ -require('../../../scripts/build/babel-register').registerForMonorepo(); +require('../../../scripts/babel-register').registerForMonorepo(); module.exports = require('./runner'); diff --git a/packages/react-native-fantom/runner/warmup/index.js b/packages/react-native-fantom/runner/warmup/index.js index 1e3f3ef54bab..ead585893a96 100644 --- a/packages/react-native-fantom/runner/warmup/index.js +++ b/packages/react-native-fantom/runner/warmup/index.js @@ -8,6 +8,6 @@ * @oncall react_native */ -require('../../../../scripts/build/babel-register').registerForMonorepo(); +require('../../../../scripts/babel-register').registerForMonorepo(); module.exports = require('./warmup'); diff --git a/packages/react-native/scripts/featureflags/index.js b/packages/react-native/scripts/featureflags/index.js index 1a8627ce8ede..3cb2dcb3410e 100644 --- a/packages/react-native/scripts/featureflags/index.js +++ b/packages/react-native/scripts/featureflags/index.js @@ -8,7 +8,7 @@ */ if (require.main === module) { - require('../../../../scripts/build/babel-register').registerForMonorepo(); + require('../../../../scripts/babel-register').registerForMonorepo(); let command; diff --git a/packages/rn-tester/cli.js b/packages/rn-tester/cli.js index b5ba1ed3c555..ce740de20997 100644 --- a/packages/rn-tester/cli.js +++ b/packages/rn-tester/cli.js @@ -32,7 +32,7 @@ function injectCoreCLIUtilsRuntimePatch() { if (process.env.BUILD_EXCLUDE_BABEL_REGISTER == null) { // $FlowFixMe[cannot-resolve-module] - require('../../scripts/build/babel-register').registerForMonorepo(); + require('../../scripts/babel-register').registerForMonorepo(); } injectCoreCLIUtilsRuntimePatch(); diff --git a/scripts/build/babel-register.js b/scripts/babel-register.js similarity index 56% rename from scripts/build/babel-register.js rename to scripts/babel-register.js index 8472e135814a..c174a3c8c213 100644 --- a/scripts/build/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 @@ -21,9 +26,12 @@ let isRegisteredForMonorepo = false; * paths in "exports"), inside a special `if` condition that will be compiled * away on build. * - * if (!process.env.BUILD_EXCLUDE_BABEL_REGISTER) { - * require('../../../scripts/build/babel-register').registerForMonorepo(); - * } + * ```js + * // Place in a package entry point + * if (!process.env.BUILD_EXCLUDE_BABEL_REGISTER) { + * require('../../../scripts/babel-register').registerForMonorepo(); + * } + * ``` */ function registerForMonorepo() { if (isRegisteredForMonorepo) { @@ -43,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 a30d835a335d..76c2eb8365b6 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 495079ddd107..000c9c27f170 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 5eb45927693d..0fc46999cf86 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 6a98d5e525b5..10b6ec984e37 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 1bc07e39c644..1f12a1d6e93e 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 f405362e61f6..343862d6fe89 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 e889eb4d1b79..71bdc843cd69 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) {