diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/instanceof/options.json b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/instanceof/options.json new file mode 100644 index 0000000000..dd7a694498 --- /dev/null +++ b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/instanceof/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["external-helpers-2", "transform-es2015-instanceof"] +} diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/options.json b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/typeof/options.json similarity index 100% rename from packages/babel-core/test/fixtures/transformation/es6.spec.symbols/options.json rename to packages/babel-core/test/fixtures/transformation/es6.spec.symbols/typeof/options.json diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 8ad999f6f8..ae464bc581 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -181,7 +181,7 @@ export let inherits = template(` export let _instanceof = template(` (function (left, right) { - if (right != null && right[Symbol.hasInstance]) { + if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { return right[Symbol.hasInstance](left); } else { return left instanceof right; diff --git a/packages/babel-plugin-transform-es2015-instanceof/.npmignore b/packages/babel-plugin-transform-es2015-instanceof/.npmignore new file mode 100644 index 0000000000..47cdd2c655 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-instanceof/.npmignore @@ -0,0 +1,3 @@ +src +test +node_modules diff --git a/packages/babel-plugin-transform-es2015-instanceof/package.json b/packages/babel-plugin-transform-es2015-instanceof/package.json new file mode 100644 index 0000000000..bd030ef15b --- /dev/null +++ b/packages/babel-plugin-transform-es2015-instanceof/package.json @@ -0,0 +1,14 @@ +{ + "name": "babel-plugin-transform-es2015-typeof-symbol", + "version": "6.0.15", + "description": "", + "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-typeof-symbol", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ], + "dependencies": { + "babel-runtime": "^5.0.0" + } +} diff --git a/packages/babel-plugin-transform-es2015-instanceof/src/index.js b/packages/babel-plugin-transform-es2015-instanceof/src/index.js new file mode 100644 index 0000000000..d12f4c6fc9 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-instanceof/src/index.js @@ -0,0 +1,12 @@ +export default function ({ types: t }) { + return { + visitor: { + BinaryExpression(path) { + let { node } = path; + if (node.operator === "instanceof") { + path.replaceWith(t.callExpression(this.addHelper("instanceof"), [node.left, node.right])); + } + } + } + }; +} diff --git a/packages/babel-plugin-transform-es2015-typeof-symbol/package.json b/packages/babel-plugin-transform-es2015-typeof-symbol/package.json index bd030ef15b..5fc895b339 100644 --- a/packages/babel-plugin-transform-es2015-typeof-symbol/package.json +++ b/packages/babel-plugin-transform-es2015-typeof-symbol/package.json @@ -1,8 +1,8 @@ { - "name": "babel-plugin-transform-es2015-typeof-symbol", + "name": "babel-plugin-transform-es2015-instanceof", "version": "6.0.15", "description": "", - "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-typeof-symbol", + "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-instanceof", "license": "MIT", "main": "lib/index.js", "keywords": [ diff --git a/packages/babel-plugin-transform-es2015-typeof-symbol/src/index.js b/packages/babel-plugin-transform-es2015-typeof-symbol/src/index.js index 04ff17a507..a3da0e6267 100644 --- a/packages/babel-plugin-transform-es2015-typeof-symbol/src/index.js +++ b/packages/babel-plugin-transform-es2015-typeof-symbol/src/index.js @@ -1,9 +1,12 @@ export default function ({ types: t }) { + let IGNORE = Symbol(); + return { visitor: { UnaryExpression(path) { let { node, parent } = path; - if (node._ignoreSpecSymbols) return; + if (node[IGNORE]) return; + if (path.find(path => !!path.node._generated)) return; if (path.parentPath.isBinaryExpression() && t.EQUALITY_BINARY_OPERATORS.indexOf(parent.operator) >= 0) { // optimise `typeof foo === "string"` since we can determine that they'll never need to handle symbols @@ -18,7 +21,7 @@ export default function ({ types: t }) { if (path.get("argument").isIdentifier()) { let undefLiteral = t.stringLiteral("undefined"); let unary = t.unaryExpression("typeof", node.argument); - unary._ignoreSpecSymbols = true; + unary[IGNORE] = true; path.replaceWith(t.conditionalExpression( t.binaryExpression("===", unary, undefLiteral), undefLiteral, @@ -28,17 +31,6 @@ export default function ({ types: t }) { path.replaceWith(call); } } - }, - - BinaryExpression(path) { - let { node } = path; - if (node.operator === "instanceof") { - path.replaceWith(t.callExpression(this.addHelper("instanceof"), [node.left, node.right])); - } - }, - - "VariableDeclaration|FunctionDeclaration"(path) { - if (path.node._generated) path.skip(); } } };