rnx-kit/packages/metro-resolver-symlinks
renovate[bot] 57013d2191
fix(deps): update eslint (major) (#3394)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Tommy Nguyen <4123478+tido64@users.noreply.github.com>
2024-10-17 14:41:52 +00:00
..
src fix(deps): update eslint (major) (#3394) 2024-10-17 14:41:52 +00:00
test feat(tools-react-native): add caching layer on top of `loadConfig` (#3261) 2024-08-06 18:48:48 +02:00
CHANGELOG.md RELEASING: Releasing 7 package(s) (#3353) 2024-09-23 08:44:48 +02:00
README.md docs: use the new alerts syntax (#2866) 2023-12-04 11:58:14 +00:00
eslint.config.js chore: migrate to ESLint flat config (#2782) 2023-11-03 14:02:18 +01:00
jest.config.js test(metro-resolver-symlinks): address pnpm issues (#2794) 2023-11-07 18:09:34 +01:00
package.json fix(deps): update eslint (major) (#3394) 2024-10-17 14:41:52 +00:00
tsconfig.json feat(tsconfig): base TypeScript configs for working with Node (#2886) 2023-12-18 12:05:07 +01:00

README.md

@rnx-kit/metro-resolver-symlinks

Build npm version

@rnx-kit/metro-resolver-symlinks is a Metro resolver with proper support for symlinks. This is especially useful in monorepos, or repos using package managers that make heavy use of symlinks (such as pnpm).

Installation

yarn add @rnx-kit/metro-resolver-symlinks --dev

or if you're using npm

npm add --save-dev @rnx-kit/metro-resolver-symlinks

Usage

Import and assign the resolver to resolver.resolveRequest in your metro.config.js:

 const { makeMetroConfig } = require("@rnx-kit/metro-config");
+const MetroSymlinksResolver = require("@rnx-kit/metro-resolver-symlinks");

 module.exports = makeMetroConfig({
   resolver: {
+    resolveRequest: MetroSymlinksResolver(),
   },
 });

Options

Option Type Description
remapModule (moduleId: string) => string A custom function for remapping additional modules.
experimental_retryResolvingFromDisk boolean [Experimental] Whether to retry module resolution on disk if not found in Haste map. This option is useful for scenarios where you want to reduce the number of watched files (and thus the initial time spent on crawling). Note that enabling this will likely be slower than having a warm cache.

remapModule

remapModule allows additional remapping of modules. For instance, there is a remapImportPath utility that remaps requests of lib/**/*.js to src/**/*.ts. This is useful for packages that don't correctly export everything in their main JS file.

 const { makeMetroConfig } = require("@rnx-kit/metro-config");
 const MetroSymlinksResolver = require("@rnx-kit/metro-resolver-symlinks");

 module.exports = makeMetroConfig({
   projectRoot: __dirname,
   resolver: {
     resolveRequest: MetroSymlinksResolver({
+      remapModule: MetroSymlinksResolver.remapImportPath({
+        test: (moduleId) => moduleId.startsWith("@rnx-kit/"),
+        extensions: [".ts", ".tsx"],     // optional
+        mainFields: ["module", "main"],  // optional
+      }),
     }),
   },
 });

[!TIP]

When Metro releases a version with the ability to set a custom resolver for Haste requests, this way of remapping modules is preferable over @rnx-kit/babel-plugin-import-path-remapper. The Babel plugin mutates the AST and requires a second pass.