Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[internal] Use the Node.js behavior for default imports #12795

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
52 changes: 52 additions & 0 deletions babel.config.js
Expand Up @@ -158,6 +158,7 @@ module.exports = function (api) {

convertESM ? "@babel/proposal-export-namespace-from" : null,
convertESM ? "@babel/transform-modules-commonjs" : null,
convertESM ? pluginNodeImportInterop : null,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Q: This plugin will be no-op for babel parser and some plugins bundled by Rollup, is that intended?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is not a problem because all the bundled packages don't have any third-party dependency. And even if they did, it would only be a problem if these third-party dependencies used __esModule.

However, I asked to reopen rollup/plugins#635 to add an option to @rollup/plugin-commonjs to mirror the Node.js behavior.


pluginPackageJsonMacro,

Expand Down Expand Up @@ -413,3 +414,54 @@ function pluginPackageJsonMacro({ types: t }) {
},
};
}

// Match the Node.js behavior (the default import is module.exports)
function pluginNodeImportInterop({ template }) {
return {
visitor: {
ImportDeclaration(path) {
const specifiers = path.get("specifiers");
if (specifiers.length === 0) {
return;
}

const { source } = path.node;
if (
source.value.startsWith(".") ||
source.value.startsWith("@babel/") ||
source.value === "charcodes"
) {
// For internal modules, it's either "all CJS" or "all ESM".
// We don't need to worry about interop.
return;
}

const defImport = specifiers.find(s => s.isImportDefaultSpecifier());
const nsImport = specifiers.find(s => s.isImportNamespaceSpecifier());

if (defImport) {
path.insertAfter(
template.ast`
const ${defImport.node.local} = require(${source});
`
);
defImport.remove();
}

if (nsImport) {
path.insertAfter(
template.ast`
const ${nsImport.node.local} = {
...require(${source}),
default: require(${source}),
};
`
);
nsImport.remove();
}

if (path.node.specifiers.length === 0) path.remove();
},
},
};
}
6 changes: 3 additions & 3 deletions lib/babel-polyfills.js.flow
@@ -1,9 +1,9 @@
declare module "babel-plugin-polyfill-regenerator" {
declare module.exports: Function;
declare module.exports: { default: Function };
}
declare module "babel-plugin-polyfill-corejs2" {
declare module.exports: Function;
declare module.exports: { default: Function };
}
declare module "babel-plugin-polyfill-corejs3" {
declare module.exports: Function;
declare module.exports: { default: Function };
}
Expand Up @@ -13,10 +13,12 @@ import assert from "assert";
import fs from "fs";
import path from "path";
import vm from "vm";
import checkDuplicatedNodes from "babel-check-duplicated-nodes";
import QuickLRU from "quick-lru";
import escapeRegExp from "./escape-regexp.cjs";

import _checkDuplicatedNodes from "babel-check-duplicated-nodes";
const checkDuplicatedNodes = _checkDuplicatedNodes.default;

const EXTERNAL_HELPERS_VERSION = "7.100.0";

const cachedScripts = new QuickLRU({ maxSize: 10 });
Expand Down
10 changes: 4 additions & 6 deletions packages/babel-highlight/src/index.ts
@@ -1,7 +1,8 @@
/// <reference path="../../../lib/third-party-libs.d.ts" />

import jsTokens, * as jsTokensNs from "js-tokens";
import type { Token, JSXToken } from "js-tokens";
import jsTokens from "js-tokens";

import {
isStrictReservedWord,
isKeyword,
Expand Down Expand Up @@ -158,9 +159,6 @@ if (process.env.BABEL_8_BREAKING) {
}
};
} else {
// This is only available in js-tokens@4, and not in js-tokens@6
const { matchToToken } = jsTokensNs as any;

/**
* RegExp to test for what seems to be a JSX tag name.
*/
Expand Down Expand Up @@ -204,8 +202,8 @@ if (process.env.BABEL_8_BREAKING) {

tokenize = function* (text: string) {
let match;
while ((match = (jsTokens as any).exec(text))) {
const token = matchToToken(match);
while ((match = (jsTokens as any).default.exec(text))) {
const token = (jsTokens as any).matchToToken(match);

yield {
type: getTokenType(token, match.index, text),
Expand Down
9 changes: 6 additions & 3 deletions packages/babel-plugin-transform-runtime/src/index.js
Expand Up @@ -5,9 +5,12 @@ import { types as t } from "@babel/core";
import { hasMinVersion } from "./helpers";
import getRuntimePath from "./get-runtime-path";

import pluginCorejs2 from "babel-plugin-polyfill-corejs2";
import pluginCorejs3 from "babel-plugin-polyfill-corejs3";
import pluginRegenerator from "babel-plugin-polyfill-regenerator";
import _pluginCorejs2 from "babel-plugin-polyfill-corejs2";
import _pluginCorejs3 from "babel-plugin-polyfill-corejs3";
import _pluginRegenerator from "babel-plugin-polyfill-regenerator";
const pluginCorejs2 = _pluginCorejs2.default;
const pluginCorejs3 = _pluginCorejs3.default;
const pluginRegenerator = _pluginRegenerator.default;

const pluginsCompat = "#__secret_key__@babel/runtime__compatibility";

Expand Down
9 changes: 6 additions & 3 deletions packages/babel-preset-env/src/index.js
Expand Up @@ -16,9 +16,12 @@ import overlappingPlugins from "@babel/compat-data/overlapping-plugins";
import removeRegeneratorEntryPlugin from "./polyfills/regenerator";
import legacyBabelPolyfillPlugin from "./polyfills/babel-polyfill";

import pluginCoreJS2 from "babel-plugin-polyfill-corejs2";
import pluginCoreJS3 from "babel-plugin-polyfill-corejs3";
import pluginRegenerator from "babel-plugin-polyfill-regenerator";
import _pluginCoreJS2 from "babel-plugin-polyfill-corejs2";
import _pluginCoreJS3 from "babel-plugin-polyfill-corejs3";
import _pluginRegenerator from "babel-plugin-polyfill-regenerator";
const pluginCoreJS2 = _pluginCoreJS2.default;
const pluginCoreJS3 = _pluginCoreJS3.default;
const pluginRegenerator = _pluginRegenerator.default;

import getTargets, {
prettifyTargets,
Expand Down