Skip to content

Commit

Permalink
Move metro-config package into monorepo build, enable TS generation (#…
Browse files Browse the repository at this point in the history
…41836)

Summary:
This adds `react-native/metro-config` to the monorepo build tool and emits the missing typescript declarations.

Right now, we do have typescript declarations on `metro-config`, but not `react-native/metro-config`. Which makes everything a bit harder extend from "[the default React Native metro config](#36502)" in Expo.

> Note, I also added the same `exports` block from `react-native/dev-middleware` for conformity.

One open question here is, why aren't we exporting _all_ helper functions from `metro-config`? To me, its a bit weird that we need both `metro-config` _and_ `react-native/metro-config` as `loadConfig` isn't exported.

## Changelog:

[INTERNAL] [FIXED] - Emit typescript declaration files for `react-native/metro-config`

Pull Request resolved: #41836

Test Plan:
Run the build tool, and check if the typescript declarations are emitted for `react-native/metro-config`.

```
yarn build metro-config
```

Reviewed By: hoxyq

Differential Revision: D51943453

Pulled By: huntie

fbshipit-source-id: cfaffe5660053fc9a9fcbe3dacf7f6ccc2bde01b
  • Loading branch information
huntie authored and facebook-github-bot committed Feb 12, 2024
1 parent 49c3c34 commit b41a33e
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 16 deletions.
5 changes: 5 additions & 0 deletions packages/metro-config/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Dependencies
/node_modules

# Build output
/dist
8 changes: 7 additions & 1 deletion packages/metro-config/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,13 @@
"engines": {
"node": ">=18"
},
"exports": "./index.js",
"exports": {
".": "./src/index.js",
"./package.json": "./package.json"
},
"files": [
"dist"
],
"dependencies": {
"@react-native/js-polyfills": "0.74.0",
"@react-native/metro-babel-transformer": "0.74.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
* @noformat
* @flow strict-local
* @format
* @oncall react_native
*/

/*:: import type {ConfigT} from 'metro-config'; */
import type {ConfigT} from 'metro-config';

const {getDefaultConfig: getBaseConfig, mergeConfig} = require('metro-config');
import {getDefaultConfig as getBaseConfig, mergeConfig} from 'metro-config';

const INTERNAL_CALLSITES_REGEX = new RegExp(
[
Expand All @@ -36,12 +37,12 @@ const INTERNAL_CALLSITES_REGEX = new RegExp(
].join('|'),
);

export {mergeConfig} from 'metro-config';

/**
* Get the base Metro configuration for a React Native project.
*/
function getDefaultConfig(
projectRoot /*: string */
) /*: ConfigT */ {
export function getDefaultConfig(projectRoot: string): ConfigT {
const config = {
resolver: {
resolverMainFields: ['react-native', 'browser', 'main'],
Expand All @@ -53,15 +54,16 @@ function getDefaultConfig(
getModulesRunBeforeMainModule: () => [
require.resolve('react-native/Libraries/Core/InitializeCore'),
],
// $FlowFixMe[untyped-import]
getPolyfills: () => require('@react-native/js-polyfills')(),
},
server: {
port: Number(process.env.RCT_METRO_PORT) || 8081,
},
symbolicator: {
customizeFrame: (frame /*: $ReadOnly<{file: ?string, ...}>*/) => {
customizeFrame: (frame: $ReadOnly<{file: ?string, ...}>) => {
const collapse = Boolean(
frame.file && INTERNAL_CALLSITES_REGEX.test(frame.file),
frame.file != null && INTERNAL_CALLSITES_REGEX.test(frame.file),
);
return {collapse};
},
Expand All @@ -88,10 +90,5 @@ function getDefaultConfig(
// Set global hook so that the CLI can detect when this config has been loaded
global.__REACT_NATIVE_METRO_CONFIG_LOADED = true;

return mergeConfig(
getBaseConfig.getDefaultValues(projectRoot),
config,
);
return mergeConfig(getBaseConfig.getDefaultValues(projectRoot), config);
}

module.exports = {getDefaultConfig, mergeConfig};
20 changes: 20 additions & 0 deletions packages/metro-config/src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* 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
* @format
* @oncall react_native
*/

/*::
export type * from './index.flow';
*/

if (!process.env.BUILD_EXCLUDE_BABEL_REGISTER) {
require('../../../scripts/build/babel-register').registerForMonorepo();
}

export * from './index.flow';
4 changes: 4 additions & 0 deletions scripts/build/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ const buildConfig /*: BuildConfig */ = {
target: 'node',
emitTypeScriptDefs: true,
},
'metro-config': {
target: 'node',
emitTypeScriptDefs: true,
},
},
};

Expand Down

0 comments on commit b41a33e

Please sign in to comment.