Rely entirely on sourceType for module vs script differentiation. (#7417)

This commit is contained in:
Logan Smyth 2018-02-27 18:11:13 -08:00 committed by GitHub
parent bf8b25289b
commit ddd40bf5c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 25 additions and 26 deletions

View File

@ -214,6 +214,7 @@ describe("api", function() {
function execTest(passPerPreset) { function execTest(passPerPreset) {
return babel.transform("type Foo = number; let x = (y): Foo => y;", { return babel.transform("type Foo = number; let x = (y): Foo => y;", {
sourceType: "script",
passPerPreset: passPerPreset, passPerPreset: passPerPreset,
presets: [ presets: [
// First preset with our plugin, "before" // First preset with our plugin, "before"

View File

@ -209,7 +209,7 @@ export default class ImportInjector {
// to a variable. // to a variable.
let name = nameHint || importName; let name = nameHint || importName;
const isMod = isModule(this._programPath, true); const isMod = isModule(this._programPath);
const isModuleForNode = isMod && importingInterop === "node"; const isModuleForNode = isMod && importingInterop === "node";
const isModuleForBabel = isMod && importingInterop === "babel"; const isModuleForBabel = isMod && importingInterop === "babel";

View File

@ -1,11 +1,7 @@
/** /**
* A small utility to check if a file qualifies as a module, based on a few * A small utility to check if a file qualifies as a module.
* possible conditions.
*/ */
export default function isModule( export default function isModule(path: NodePath) {
path: NodePath,
requireUnambiguous: boolean = false,
) {
const { sourceType } = path.node; const { sourceType } = path.node;
if (sourceType !== "module" && sourceType !== "script") { if (sourceType !== "module" && sourceType !== "script") {
throw path.buildCodeFrameError( throw path.buildCodeFrameError(
@ -13,19 +9,5 @@ export default function isModule(
); );
} }
const filename = path.hub.file.opts.filename; return path.node.sourceType === "module";
if (/\.mjs$/.test(filename)) {
requireUnambiguous = false;
}
return (
path.node.sourceType === "module" &&
(!requireUnambiguous || isUnambiguousModule(path))
);
}
// This approach is not ideal. It is here to preserve compatibility for now,
// but really this should just return true or be deleted.
function isUnambiguousModule(path) {
return path.get("body").some(p => p.isModuleDeclaration());
} }

View File

@ -330,6 +330,7 @@ function run(task) {
const newOpts = merge( const newOpts = merge(
{ {
filename: self.loc, filename: self.loc,
sourceType: "unambiguous",
}, },
opts, opts,
); );

View File

@ -1,4 +1,5 @@
{ {
"sourceType": "module",
"moduleIds": true, "moduleIds": true,
"moduleId": "my custom module name" "moduleId": "my custom module name"
} }

View File

@ -1,3 +1,4 @@
{ {
"sourceType": "module",
"moduleIds": true "moduleIds": true
} }

View File

@ -1,4 +1,5 @@
{ {
"sourceType": "module",
"moduleIds": true, "moduleIds": true,
"moduleId": "my custom module name", "moduleId": "my custom module name",
"plugins": [ "plugins": [

View File

@ -1,4 +1,5 @@
{ {
"sourceType": "module",
"moduleIds": true, "moduleIds": true,
"plugins": [ "plugins": [
"external-helpers", "external-helpers",

View File

@ -98,9 +98,7 @@ export default function(api, options) {
visitor: { visitor: {
Program: { Program: {
exit(path) { exit(path) {
// For now this requires unambiguous rather that just sourceType if (!isModule(path)) return;
// because Babel currently parses all files as sourceType:module.
if (!isModule(path, true /* requireUnambiguous */)) return;
// Rename the bindings auto-injected into the scope so there is no // Rename the bindings auto-injected into the scope so there is no
// risk of conflict between the bindings. // risk of conflict between the bindings.

View File

@ -1,4 +1,5 @@
{ {
"sourceType": "module",
"moduleIds": true, "moduleIds": true,
"moduleId": "my custom module name", "moduleId": "my custom module name",
"plugins": [ "plugins": [

View File

@ -1,4 +1,5 @@
{ {
"sourceType": "module",
"moduleId": "MyLib", "moduleId": "MyLib",
"plugins": [ "plugins": [
"external-helpers", "external-helpers",

View File

@ -1,4 +1,5 @@
{ {
"sourceType": "module",
"moduleIds": true, "moduleIds": true,
"plugins": [ "plugins": [
"external-helpers", "external-helpers",

View File

@ -1,4 +1,5 @@
{ {
"sourceType": "module",
"moduleIds": true, "moduleIds": true,
"moduleId": "my custom module name" "moduleId": "my custom module name"
} }

View File

@ -1,3 +1,4 @@
{ {
"sourceType": "module",
"moduleId": "MyLib" "moduleId": "MyLib"
} }

View File

@ -1,3 +1,4 @@
{ {
"sourceType": "module",
"moduleIds": true "moduleIds": true
} }

View File

@ -7,6 +7,7 @@ require("../babel-preset-env");
describe("babel-preset-env-standalone", () => { describe("babel-preset-env-standalone", () => {
it("works w/o targets", () => { it("works w/o targets", () => {
const output = Babel.transform("const a = 1;", { const output = Babel.transform("const a = 1;", {
sourceType: "script",
presets: ["env"], presets: ["env"],
}).code; }).code;
assert.equal(output, "var a = 1;"); assert.equal(output, "var a = 1;");
@ -14,6 +15,7 @@ describe("babel-preset-env-standalone", () => {
it("doesn't transpile `const` with chrome 60", () => { it("doesn't transpile `const` with chrome 60", () => {
const output = Babel.transform("const a = 1;", { const output = Babel.transform("const a = 1;", {
sourceType: "script",
presets: [ presets: [
[ [
"env", "env",
@ -30,6 +32,7 @@ describe("babel-preset-env-standalone", () => {
it("transpiles `const` with chrome 60 and preset-es2015", () => { it("transpiles `const` with chrome 60 and preset-es2015", () => {
const output = Babel.transform("const a = 1;", { const output = Babel.transform("const a = 1;", {
sourceType: "script",
presets: [ presets: [
[ [
"env", "env",
@ -47,6 +50,7 @@ describe("babel-preset-env-standalone", () => {
it("uses transform-new-targets plugin", () => { it("uses transform-new-targets plugin", () => {
const output = Babel.transform("function Foo() {new.target}", { const output = Babel.transform("function Foo() {new.target}", {
sourceType: "script",
presets: ["env"], presets: ["env"],
}).code; }).code;
assert.equal( assert.equal(

View File

@ -1,4 +1,5 @@
{ {
"sourceType": "module",
"presets": [ "presets": [
["../../../../lib", { ["../../../../lib", {
"useBuiltIns": "usage" "useBuiltIns": "usage"

View File

@ -1,4 +1,5 @@
{ {
"sourceType": "module",
"presets": [ "presets": [
["../../../../lib", { ["../../../../lib", {
"shippedProposals": true, "shippedProposals": true,

View File

@ -16,6 +16,7 @@ describe("@babel/standalone", () => {
}); });
it("handles the es2015-loose preset", () => { it("handles the es2015-loose preset", () => {
const output = Babel.transform("class A {}", { const output = Babel.transform("class A {}", {
sourceType: "script",
presets: ["es2015-loose"], presets: ["es2015-loose"],
}).code; }).code;
assert.equal(output, "var A = function A() {};"); assert.equal(output, "var A = function A() {};");
@ -52,7 +53,7 @@ describe("@babel/standalone", () => {
}, },
}, },
], ],
sourceType: "module", sourceType: "script",
}; };
const output = Babel.transformFromAst(ast, "42", { presets: ["es2015"] }) const output = Babel.transformFromAst(ast, "42", { presets: ["es2015"] })
.code; .code;