From 4730526bf26d7609cda4cfc0d158000cb420a846 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Mon, 18 Jan 2016 19:05:39 -0800 Subject: [PATCH 1/3] Add transform-es2015-duplicate-keys plugin. --- .../.npmignore | 3 ++ .../README.md | 40 +++++++++++++++++++ .../package.json | 18 +++++++++ .../src/index.js | 33 +++++++++++++++ .../test/fixtures/combination/dupes/actual.js | 1 + .../fixtures/combination/dupes/expected.js | 1 + .../fixtures/combination/no-dupes/actual.js | 1 + .../fixtures/combination/no-dupes/expected.js | 1 + .../test/fixtures/combination/options.json | 3 ++ .../duplicate-keys/both-quoted/actual.js | 1 + .../duplicate-keys/both-quoted/expected.js | 1 + .../fixtures/duplicate-keys/dupes/actual.js | 1 + .../fixtures/duplicate-keys/dupes/expected.js | 1 + .../fixtures/duplicate-keys/getter/actual.js | 1 + .../duplicate-keys/getter/expected.js | 3 ++ .../duplicate-keys/no-dupes/actual.js | 1 + .../duplicate-keys/no-dupes/expected.js | 1 + .../duplicate-keys/one-quoted/actual.js | 1 + .../duplicate-keys/one-quoted/expected.js | 1 + .../test/fixtures/duplicate-keys/options.json | 3 ++ .../test/index.js | 1 + 21 files changed, 117 insertions(+) create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/.npmignore create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/README.md create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/package.json create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/dupes/actual.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/dupes/expected.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/no-dupes/actual.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/no-dupes/expected.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/options.json create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/both-quoted/actual.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/both-quoted/expected.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/dupes/actual.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/dupes/expected.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getter/actual.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getter/expected.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/no-dupes/actual.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/no-dupes/expected.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/one-quoted/actual.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/one-quoted/expected.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/options.json create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/index.js diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/.npmignore b/packages/babel-plugin-transform-es2015-duplicate-keys/.npmignore new file mode 100644 index 0000000000..246c4aa256 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/.npmignore @@ -0,0 +1,3 @@ +node_modules +src +test diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/README.md b/packages/babel-plugin-transform-es2015-duplicate-keys/README.md new file mode 100644 index 0000000000..0e5c9e8962 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/README.md @@ -0,0 +1,40 @@ +# babel-plugin-transform-es2015-duplicate-keys + +Compile objects with duplicate keys to valid strict ES5. + +This plugin actually converts duplicate keys in objects to be computed +properties, which then must be handled by the +transform-es2015-computed-properties plugin. The final result won't contain any +object literals with duplicate keys. + +## Installation + +```sh +$ npm install babel-plugin-transform-es2015-duplicate-keys +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["transform-es2015-duplicate-keys"] +} +``` + +### Via CLI + +```sh +$ babel --plugins transform-es2015-duplicate-keys script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["transform-es2015-duplicate-keys"] +}); +``` diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/package.json b/packages/babel-plugin-transform-es2015-duplicate-keys/package.json new file mode 100644 index 0000000000..30efda522c --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/package.json @@ -0,0 +1,18 @@ +{ + "name": "babel-plugin-transform-es2015-duplicate-keys", + "version": "6.4.0", + "description": "Compile objects with duplicate keys to valid strict ES5", + "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-duplicate-keys", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ], + "dependencies": { + "babel-runtime": "^5.0.0", + "babel-types": "^6.4.0" + }, + "devDependencies": { + "babel-helper-plugin-test-runner": "^6.3.13" + } +} diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js b/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js new file mode 100644 index 0000000000..7bfc68a785 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js @@ -0,0 +1,33 @@ +import * as t from "babel-types"; + +function getName(key) { + if (t.isIdentifier(key)) { + return key.name; + } + return key.value.toString(); +} + +export default function() { + return { + visitor: { + ObjectExpression(path) { + const { node } = path; + const plainProps = node.properties.filter(prop => !t.isSpreadProperty(prop) && !prop.computed); + + const alreadySeenNames = Object.create(null); + + for (let prop of plainProps) { + const name = getName(prop.key); + if (!alreadySeenNames[name]) { + alreadySeenNames[name] = true; + } else { + // Rely on the computed properties transform to split the property + // assignment out of the object literal. + prop.computed = true; + prop.key = t.stringLiteral(name); + } + } + } + } + }; +} diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/dupes/actual.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/dupes/actual.js new file mode 100644 index 0000000000..cec58665c7 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/dupes/actual.js @@ -0,0 +1 @@ +var x = { a: 5, a: 6 }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/dupes/expected.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/dupes/expected.js new file mode 100644 index 0000000000..54c948c8e5 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/dupes/expected.js @@ -0,0 +1 @@ +var x = babelHelpers.defineProperty({ a: 5 }, "a", 6); diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/no-dupes/actual.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/no-dupes/actual.js new file mode 100644 index 0000000000..66138dc6b1 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/no-dupes/actual.js @@ -0,0 +1 @@ +var x = { a: 5, b: 6 }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/no-dupes/expected.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/no-dupes/expected.js new file mode 100644 index 0000000000..66138dc6b1 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/no-dupes/expected.js @@ -0,0 +1 @@ +var x = { a: 5, b: 6 }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/options.json b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/options.json new file mode 100644 index 0000000000..9ca5c26b5e --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/combination/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["external-helpers", "transform-es2015-duplicate-keys", "transform-es2015-computed-properties"] +} diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/both-quoted/actual.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/both-quoted/actual.js new file mode 100644 index 0000000000..3cd7f70f71 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/both-quoted/actual.js @@ -0,0 +1 @@ +var x = { "a\n b": 5, "a\n b": 6 }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/both-quoted/expected.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/both-quoted/expected.js new file mode 100644 index 0000000000..485e0ceafc --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/both-quoted/expected.js @@ -0,0 +1 @@ +var x = { "a\n b": 5, ["a\n b"]: 6 }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/dupes/actual.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/dupes/actual.js new file mode 100644 index 0000000000..cec58665c7 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/dupes/actual.js @@ -0,0 +1 @@ +var x = { a: 5, a: 6 }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/dupes/expected.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/dupes/expected.js new file mode 100644 index 0000000000..b7d37c4511 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/dupes/expected.js @@ -0,0 +1 @@ +var x = { a: 5, ["a"]: 6 }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getter/actual.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getter/actual.js new file mode 100644 index 0000000000..abd4f63845 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getter/actual.js @@ -0,0 +1 @@ +var x = { a: 5, get a() {return 6;} }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getter/expected.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getter/expected.js new file mode 100644 index 0000000000..7b43d87415 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getter/expected.js @@ -0,0 +1,3 @@ +var x = { a: 5, get ["a"]() { + return 6; + } }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/no-dupes/actual.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/no-dupes/actual.js new file mode 100644 index 0000000000..66138dc6b1 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/no-dupes/actual.js @@ -0,0 +1 @@ +var x = { a: 5, b: 6 }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/no-dupes/expected.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/no-dupes/expected.js new file mode 100644 index 0000000000..66138dc6b1 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/no-dupes/expected.js @@ -0,0 +1 @@ +var x = { a: 5, b: 6 }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/one-quoted/actual.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/one-quoted/actual.js new file mode 100644 index 0000000000..677b1ed40e --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/one-quoted/actual.js @@ -0,0 +1 @@ +var x = { a: 5, "a": 6 }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/one-quoted/expected.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/one-quoted/expected.js new file mode 100644 index 0000000000..b7d37c4511 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/one-quoted/expected.js @@ -0,0 +1 @@ +var x = { a: 5, ["a"]: 6 }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/options.json b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/options.json new file mode 100644 index 0000000000..a081c68256 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-es2015-duplicate-keys"] +} diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/index.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/index.js new file mode 100644 index 0000000000..1f6634aabd --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/index.js @@ -0,0 +1 @@ +require("babel-helper-plugin-test-runner")(__dirname); From f01eaa8e475da669881b1d267eaad52144c7d3f9 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Mon, 18 Jan 2016 19:06:00 -0800 Subject: [PATCH 2/3] Put transform-es2015-duplicate-keys plugin in es2015 preset. --- packages/babel-preset-es2015/index.js | 1 + packages/babel-preset-es2015/package.json | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/babel-preset-es2015/index.js b/packages/babel-preset-es2015/index.js index f8fdb617e4..d9b84f65d1 100644 --- a/packages/babel-preset-es2015/index.js +++ b/packages/babel-preset-es2015/index.js @@ -8,6 +8,7 @@ module.exports = { require("babel-plugin-transform-es2015-classes"), require("babel-plugin-transform-es2015-object-super"), require("babel-plugin-transform-es2015-shorthand-properties"), + require("babel-plugin-transform-es2015-duplicate-keys"), require("babel-plugin-transform-es2015-computed-properties"), require("babel-plugin-transform-es2015-for-of"), require("babel-plugin-transform-es2015-sticky-regex"), diff --git a/packages/babel-preset-es2015/package.json b/packages/babel-preset-es2015/package.json index 3abbd0bfce..5a8c0a0be5 100644 --- a/packages/babel-preset-es2015/package.json +++ b/packages/babel-preset-es2015/package.json @@ -17,6 +17,7 @@ "babel-plugin-transform-es2015-object-super": "^6.3.13", "babel-plugin-transform-es2015-shorthand-properties": "^6.3.13", "babel-plugin-transform-es2015-computed-properties": "^6.3.13", + "babel-plugin-transform-es2015-duplicate-keys": "^6.4.0", "babel-plugin-transform-es2015-for-of": "^6.3.13", "babel-plugin-transform-es2015-sticky-regex": "^6.3.13", "babel-plugin-transform-es2015-unicode-regex": "^6.3.13", From b2aecd4320d131d6cb5ee086804042a21335962f Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Fri, 26 Feb 2016 08:57:34 -0800 Subject: [PATCH 3/3] Fix arrow style issue --- .../babel-plugin-transform-es2015-duplicate-keys/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js b/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js index 7bfc68a785..be9fab7851 100644 --- a/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js @@ -12,7 +12,7 @@ export default function() { visitor: { ObjectExpression(path) { const { node } = path; - const plainProps = node.properties.filter(prop => !t.isSpreadProperty(prop) && !prop.computed); + const plainProps = node.properties.filter((prop) => !t.isSpreadProperty(prop) && !prop.computed); const alreadySeenNames = Object.create(null);