Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion jest/preprocessor.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
2 changes: 1 addition & 1 deletion packages/community-cli-plugin/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
2 changes: 1 addition & 1 deletion packages/core-cli-utils/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
2 changes: 1 addition & 1 deletion packages/core-cli-utils/src/public/version.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
2 changes: 1 addition & 1 deletion packages/dev-middleware/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
2 changes: 1 addition & 1 deletion packages/helloworld/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion packages/metro-config/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Original file line number Diff line number Diff line change
Expand Up @@ -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');
2 changes: 1 addition & 1 deletion packages/react-native-fantom/runner/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
* @oncall react_native
*/

require('../../../scripts/build/babel-register').registerForMonorepo();
require('../../../scripts/babel-register').registerForMonorepo();

module.exports = require('./runner');
2 changes: 1 addition & 1 deletion packages/react-native-fantom/runner/warmup/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
* @oncall react_native
*/

require('../../../../scripts/build/babel-register').registerForMonorepo();
require('../../../../scripts/babel-register').registerForMonorepo();

module.exports = require('./warmup');
2 changes: 1 addition & 1 deletion packages/react-native/scripts/featureflags/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
*/

if (require.main === module) {
require('../../../../scripts/build/babel-register').registerForMonorepo();
require('../../../../scripts/babel-register').registerForMonorepo();

let command;

Expand Down
2 changes: 1 addition & 1 deletion packages/rn-tester/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
39 changes: 34 additions & 5 deletions scripts/build/babel-register.js → scripts/babel-register.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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) {
Expand All @@ -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,
};
4 changes: 1 addition & 3 deletions scripts/build/babel/node.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'),
[
Expand Down
12 changes: 7 additions & 5 deletions scripts/build/build-types.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down Expand Up @@ -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(
Expand All @@ -119,9 +121,9 @@ function getBuildPath(file /*: string */) /*: string */ {
);
}

function ignoreShadowedFiles(files /*: Array<string> */) /*: Array<string> */ {
const shadowedPrefixes /*: Record<string, boolean> */ = {};
const result /*: Array<string> */ = [];
function ignoreShadowedFiles(files: Array<string>): Array<string> {
const shadowedPrefixes: Record<string, boolean> = {};
const result: Array<string> = [];

// Find all flow definition files that shadow other files
for (const file of files) {
Expand Down
18 changes: 8 additions & 10 deletions scripts/build/build-types/transforms/stripPrivateProperties.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,40 +9,38 @@
* @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);
}
},
});

async function stripPrivateProperties(
source /*: ParseResult */,
) /*: Promise<TransformASTResult> */ {
source: ParseResult,
): Promise<TransformASTResult> {
return transformAST(source, visitors);
}

Expand Down
18 changes: 6 additions & 12 deletions scripts/build/build-types/translateSourceFile.js
Original file line number Diff line number Diff line change
Expand Up @@ -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<TransformASTResult>;
*/
type TransformFn = ParseResult => Promise<TransformASTResult>;

const preTransforms /*: Array<TransformFn> */ = [
const preTransforms: Array<TransformFn> = [
require('./transforms/stripPrivateProperties'),
];
const prettierOptions = {parser: 'babel'};
Expand All @@ -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<string> */ {
async function translateSourceFile(source: string): Promise<string> {
// Parse Flow source
const parsed = await parse(source);

Expand All @@ -49,9 +43,9 @@ async function translateSourceFile(
}

async function applyTransforms(
source /*: ParseResult */,
transforms /*: $ReadOnlyArray<TransformFn> */,
) /*: Promise<ParseResult> */ {
source: ParseResult,
transforms: $ReadOnlyArray<TransformFn>,
): Promise<ParseResult> {
return transforms.reduce((input, transform) => {
return input.then(async result => {
const transformed = await transform(result);
Expand Down
2 changes: 2 additions & 0 deletions scripts/build/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
* @oncall react_native
*/

require('../babel-register').registerForScript();

const {PACKAGES_DIR, REPO_ROOT} = require('../consts');
const {
buildConfig,
Expand Down
2 changes: 2 additions & 0 deletions scripts/build/clean.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
20 changes: 9 additions & 11 deletions scripts/build/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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 -
Expand All @@ -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': {
Expand All @@ -67,17 +65,17 @@ const defaultBuildOptions = {
};

function getBuildOptions(
packageName /*: $Keys<BuildConfig['packages']> */,
) /*: Required<BuildOptions> */ {
packageName: $Keys<BuildConfig['packages']>,
): Required<BuildOptions> {
return {
...defaultBuildOptions,
...buildConfig.packages[packageName],
};
}

function getBabelConfig(
packageName /*: $Keys<BuildConfig['packages']> */,
) /*: BabelCoreOptions */ {
packageName: $Keys<BuildConfig['packages']>,
): BabelCoreOptions {
const {target} = getBuildOptions(packageName);

switch (target) {
Expand All @@ -87,8 +85,8 @@ function getBabelConfig(
}

function getTypeScriptCompilerOptions(
packageName /*: $Keys<BuildConfig['packages']> */,
) /*: Object */ {
packageName: $Keys<BuildConfig['packages']>,
): Object {
const {target} = getBuildOptions(packageName);

switch (target) {
Expand Down