Skip to content

Restore compatibility with interopRequireDefault (import Things from 'metro-pkg') in Metro public Node.js APIs.#1565

Closed
robhogan wants to merge 1 commit into
mainfrom
export-D81127738
Closed

Restore compatibility with interopRequireDefault (import Things from 'metro-pkg') in Metro public Node.js APIs.#1565
robhogan wants to merge 1 commit into
mainfrom
export-D81127738

Conversation

@robhogan

Copy link
Copy Markdown
Contributor

Summary:
In #1549 (Migrate Metro to ESM syntax), which was intended to be non-breaking, there was one use case I overlooked.

If your code consuming Metro under Node.js uses ESM-style imports transformed to CommonJS with Babel's default interop mode, you could've written any of:

// Import default
import Resolver from 'metro-resolver';
Resolver.resolve('./foo');

or,

// Import all named as namespace
import * as Resolver from 'metro-resolver';
Resolver.resolve('./foo');

or,

// Import named
import {resolve} from 'metro-resolver';
resolve('./foo');

However, when we switched from a module.exports object to ESM-style named exports, the first case would fail, because Babel marks our index file with __esModule, which causes interopRequireDefault to select the default prop (which is now undefined).

The consumer would be transformed to this, which would throw:

var _metroResolver = _interopRequireDefault(require("metro-resolver"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
_metroResolver.default.resolve('./foo'); // TypeError: Cannot access property resolve of undefined

This restores compatibility by adding an explicit default export alongside the named exports, for all public package entry points that were not already __esModules. These will be removed in a future breaking change.

Changelog: Internal - fix unreleased breaking change from #1549

Reviewed By: vzaidman

Differential Revision: D81127738

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Aug 29, 2025
@facebook-github-bot

Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D81127738

facebook-github-bot pushed a commit that referenced this pull request Aug 29, 2025
… 'metro-pkg'`) in Metro public Node.js APIs. (#1565)

Summary:

In #1549 (Migrate Metro to ESM syntax), which was intended to be non-breaking, there was one use case I overlooked.

If your code consuming Metro under Node.js uses ESM-style imports transformed to CommonJS with Babel's default interop mode, you could've written any of:

```
// Import default
import Resolver from 'metro-resolver';
Resolver.resolve('./foo');
```

or,


```
// Import all named as namespace
import * as Resolver from 'metro-resolver';
Resolver.resolve('./foo');
```

or, 


```
// Import named
import {resolve} from 'metro-resolver';
resolve('./foo');
```

However, when we switched from a `module.exports` object to ESM-style named exports, the first case would fail, because Babel marks our index file with `__esModule`, which causes `interopRequireDefault` to select the `default` prop (which is now undefined).

The consumer would be transformed to this, which would throw:

```
var _metroResolver = _interopRequireDefault(require("metro-resolver"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
_metroResolver.default.resolve('./foo'); // TypeError: Cannot access property resolve of undefined
```

This restores compatibility by adding an explicit default export alongside the named exports, for all public package entry points that were not already `__esModule`s. These will be removed in a future breaking change.

Changelog: Internal - fix unreleased breaking change from #1549

Reviewed By: vzaidman

Differential Revision: D81127738
@facebook-github-bot

Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D81127738

… 'metro-pkg'`) in Metro public Node.js APIs. (#1565)

Summary:

In #1549 (Migrate Metro to ESM syntax), which was intended to be non-breaking, there was one use case I overlooked.

If your code consuming Metro under Node.js uses ESM-style imports transformed to CommonJS with Babel's default interop mode, you could've written any of:

```
// Import default
import Resolver from 'metro-resolver';
Resolver.resolve('./foo');
```

or,


```
// Import all named as namespace
import * as Resolver from 'metro-resolver';
Resolver.resolve('./foo');
```

or, 


```
// Import named
import {resolve} from 'metro-resolver';
resolve('./foo');
```

However, when we switched from a `module.exports` object to ESM-style named exports, the first case would fail, because Babel marks our index file with `__esModule`, which causes `interopRequireDefault` to select the `default` prop (which is now undefined).

The consumer would be transformed to this, which would throw:

```
var _metroResolver = _interopRequireDefault(require("metro-resolver"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
_metroResolver.default.resolve('./foo'); // TypeError: Cannot access property resolve of undefined
```

This restores compatibility by adding an explicit default export alongside the named exports, for all public package entry points that were not already `__esModule`s. These will be removed in a future breaking change.

Changelog: Internal - fix unreleased breaking change from #1549

Reviewed By: vzaidman

Differential Revision: D81127738
@facebook-github-bot

Copy link
Copy Markdown
Contributor

This pull request was exported from Phabricator. Differential Revision: D81127738

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@robhogan has imported this pull request. If you are a Meta employee, you can view this in D81127738.

facebook-github-bot pushed a commit that referenced this pull request Aug 29, 2025
… 'metro-pkg'`) in Metro public Node.js APIs. (#1565)

Summary:
In #1549 (Migrate Metro to ESM syntax), which was intended to be non-breaking, there was one use case I overlooked.

If your code consuming Metro under Node.js uses ESM-style imports transformed to CommonJS with Babel's default interop mode, you could've written any of:

```
// Import default
import Resolver from 'metro-resolver';
Resolver.resolve('./foo');
```

or,

```
// Import all named as namespace
import * as Resolver from 'metro-resolver';
Resolver.resolve('./foo');
```

or,

```
// Import named
import {resolve} from 'metro-resolver';
resolve('./foo');
```

However, when we switched from a `module.exports` object to ESM-style named exports, the first case would fail, because Babel marks our index file with `__esModule`, which causes `interopRequireDefault` to select the `default` prop (which is now undefined).

The consumer would be transformed to this, which would throw:

```
var _metroResolver = _interopRequireDefault(require("metro-resolver"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
_metroResolver.default.resolve('./foo'); // TypeError: Cannot access property resolve of undefined
```

This restores compatibility by adding an explicit default export alongside the named exports, for all public package entry points that were not already `__esModule`s. These will be removed in a future breaking change.

Changelog: Internal - fix unreleased breaking change from #1549

Test Plan:
Imported from GitHub, without a `Test Plan:` line.

Rollback Plan:

Differential Revision: D81127738

Pulled By: robhogan

fbshipit-source-id: c4caf30cc75ec7f7f3a87ed8df206c0fa0c58ffd
@robhogan

robhogan commented Oct 1, 2025

Copy link
Copy Markdown
Contributor Author

This was merged in e7e69b1, I guess the bot missed closing this PR.

@robhogan robhogan closed this Oct 1, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. fb-exported

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants