Implement importInterop: "node" option for module transforms (#12838)

This commit is contained in:
Nicolò Ribaudo
2021-04-28 18:22:47 +02:00
committed by GitHub
parent 22b0eb038f
commit be03be1bc3
101 changed files with 834 additions and 32 deletions

View File

@@ -27,6 +27,7 @@
"devDependencies": {
"@babel/core": "workspace:*",
"@babel/helper-plugin-test-runner": "workspace:*",
"@babel/plugin-external-helpers": "workspace:*",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3"
},
"homepage": "https://babel.dev/docs/en/next/babel-plugin-transform-modules-commonjs"

View File

@@ -30,6 +30,7 @@ export default declare((api, options) => {
strict,
strictMode,
noInterop,
importInterop,
lazy = false,
// Defaulting to 'true' for now. May change before 7.x major.
allowCommonJSExports = true,
@@ -178,6 +179,7 @@ export default declare((api, options) => {
strictMode,
allowTopLevelThis,
noInterop,
importInterop,
lazy,
esNamespaceOnly:
typeof state.filename === "string" &&

View File

@@ -0,0 +1 @@
module.exports = function () { return 1 };

View File

@@ -0,0 +1,2 @@
module.exports = function () { return 2 };
module.exports.__esModule = true;

View File

@@ -0,0 +1 @@
module.exports = function () { return 3 };

View File

@@ -0,0 +1,2 @@
module.exports = function () { return 4 };
module.exports.__esModule = true;

View File

@@ -0,0 +1,2 @@
exports.default = function () { return 5 };

View File

@@ -0,0 +1,2 @@
exports.default = function () { return 6 };
exports.__esModule = true;

View File

@@ -0,0 +1,2 @@
exports.named = function () { return 7 };

View File

@@ -0,0 +1,2 @@
exports.named = function () { return 8 };
exports.__esModule = true;

View File

@@ -0,0 +1,36 @@
import dep1 from "./dep1.js";
import dep2 from "./dep2.js";
import * as dep3 from "./dep3.js";
import * as dep4 from "./dep4.js";
import dep5 from "./dep5.js";
import dep6 from "./dep6.js";
import { named as dep7 } from "./dep7.js";
import { named as dep8 } from "./dep8.js";
expect(typeof dep1).toBe("function");
expect(dep1()).toBe(1);
expect(typeof dep2).toBe("function");
expect(dep2()).toBe(2);
expect(typeof dep3).toBe("object");
expect(typeof dep3.default).toBe("function");
expect(dep3.default()).toBe(3);
expect(typeof dep4).toBe("object");
expect(typeof dep4.default).toBe("function");
expect(dep4.default()).toBe(4);
expect(typeof dep5).toBe("object");
expect(typeof dep5.default).toBe("function");
expect(dep5.default()).toBe(5);
expect(typeof dep6).toBe("object");
expect(typeof dep6.default).toBe("function");
expect(dep6.default()).toBe(6);
expect(typeof dep7).toBe("function");
expect(dep7()).toBe(7);
expect(typeof dep8).toBe("function");
expect(dep8()).toBe(8);

View File

@@ -0,0 +1,3 @@
{
"sourceType": "module"
}

View File

@@ -0,0 +1 @@
export { default } from 'dep';

View File

@@ -0,0 +1,8 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _dep;
var _dep = require("dep");

View File

@@ -0,0 +1 @@
export { default, name } from 'dep';

View File

@@ -0,0 +1,19 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function () {
return _dep.default;
}
});
Object.defineProperty(exports, "name", {
enumerable: true,
get: function () {
return _dep.name;
}
});
var _dep = babelHelpers.interopRequireWildcard(require("dep"), true);

View File

@@ -0,0 +1 @@
export { name } from 'dep';

View File

@@ -0,0 +1,13 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "name", {
enumerable: true,
get: function () {
return _dep.name;
}
});
var _dep = require("dep");

View File

@@ -0,0 +1,3 @@
import foo from "foo";
foo();

View File

@@ -0,0 +1,5 @@
"use strict";
var _foo = require("foo");
_foo();

View File

@@ -0,0 +1,4 @@
import foo, { named } from "foo";
foo();
named();

View File

@@ -0,0 +1,6 @@
"use strict";
var _foo = babelHelpers.interopRequireWildcard(require("foo"), true);
(0, _foo.default)();
(0, _foo.named)();

View File

@@ -0,0 +1,3 @@
import { named } from "foo";
named();

View File

@@ -0,0 +1,5 @@
"use strict";
var _foo = require("foo");
(0, _foo.named)();

View File

@@ -0,0 +1,4 @@
import * as foo from 'foo';
foo.bar();
foo.baz();

View File

@@ -0,0 +1,5 @@
"use strict";
var foo = babelHelpers.interopRequireWildcard(require("foo"), true);
foo.bar();
foo.baz();

View File

@@ -0,0 +1,3 @@
{
"plugins": [["transform-modules-commonjs", { "importInterop": "node" }]]
}

View File

@@ -0,0 +1 @@
export { default } from 'foo';

View File

@@ -0,0 +1,13 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function () {
return _foo.default;
}
});
var _foo = require("foo");

View File

@@ -0,0 +1,3 @@
import foo from "foo";
foo();

View File

@@ -0,0 +1,5 @@
"use strict";
var _foo = require("foo");
(0, _foo.default)();

View File

@@ -0,0 +1,4 @@
import * as foo from 'foo';
foo.bar();
foo.baz();

View File

@@ -0,0 +1,6 @@
"use strict";
var foo = require("foo");
foo.bar();
foo.baz();

View File

@@ -0,0 +1,3 @@
{
"plugins": [["transform-modules-commonjs", { "importInterop": "none" }]]
}

View File

@@ -9,6 +9,6 @@ var foo = _interopRequireWildcard(require("./moduleWithGetter"));
exports.foo = foo;
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

View File

@@ -0,0 +1,46 @@
import * as babel from "@babel/core";
import transformCommonjs from "../lib";
import externalHelpers from "@babel/plugin-external-helpers";
it("'importInterop' accepts a function", function () {
const code = `
import a from "a";
import b from "b";
import c from "c";
a();
b();
c();
`;
const importInterop = source => {
if (source === "a") return "babel";
else if (source === "b") return "node";
else if (source === "c") return "none";
};
const output = babel.transformSync(code, {
configFile: false,
ast: false,
plugins: [
[externalHelpers, { helperVersion: "7.100.0" }],
[transformCommonjs, { importInterop }],
],
}).code;
expect(output).toMatchInlineSnapshot(`
"\\"use strict\\";
var _a = babelHelpers.interopRequireDefault(require(\\"a\\"));
var _b = require(\\"b\\");
var _c = require(\\"c\\");
(0, _a.default)();
_b();
(0, _c.default)();"
`);
});