diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json index cf3deea3d9..02786a5df2 100644 --- a/packages/babel-core/package.json +++ b/packages/babel-core/package.json @@ -32,7 +32,7 @@ "babel-template": "7.0.0-alpha.10", "babel-traverse": "7.0.0-alpha.10", "babel-types": "7.0.0-alpha.10", - "babylon": "7.0.0-beta.11", + "babylon": "7.0.0-beta.12", "convert-source-map": "^1.1.0", "debug": "^2.1.1", "json5": "^0.5.0", diff --git a/packages/babel-generator/package.json b/packages/babel-generator/package.json index a9a170f102..19f30e85ca 100644 --- a/packages/babel-generator/package.json +++ b/packages/babel-generator/package.json @@ -21,6 +21,6 @@ }, "devDependencies": { "babel-helper-fixtures": "7.0.0-alpha.10", - "babylon": "^7.0.0-beta.8" + "babylon": "^7.0.0-beta.12" } } diff --git a/packages/babel-plugin-syntax-numeric-separator/.npmignore b/packages/babel-plugin-syntax-numeric-separator/.npmignore new file mode 100644 index 0000000000..cace0d6ddc --- /dev/null +++ b/packages/babel-plugin-syntax-numeric-separator/.npmignore @@ -0,0 +1,3 @@ +node_modules +*.log +src diff --git a/packages/babel-plugin-syntax-numeric-separator/README.md b/packages/babel-plugin-syntax-numeric-separator/README.md new file mode 100644 index 0000000000..02199eb42f --- /dev/null +++ b/packages/babel-plugin-syntax-numeric-separator/README.md @@ -0,0 +1,36 @@ +# babel-plugin-syntax-numeric-separator + +> Allow parsing of Numeric Literals (Decimal, Binary, Hex and Octal) that contain a _NumericLiteralSeparator_. + + +## Installation + +```sh +npm install --save-dev babel-plugin-syntax-numeric-separator +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["syntax-numeric-separator"] +} +``` + +### Via CLI + +```sh +babel --plugins syntax-numeric-separator script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["syntax-numeric-separator"] +}); +``` diff --git a/packages/babel-plugin-syntax-numeric-separator/package.json b/packages/babel-plugin-syntax-numeric-separator/package.json new file mode 100644 index 0000000000..312cb5c87d --- /dev/null +++ b/packages/babel-plugin-syntax-numeric-separator/package.json @@ -0,0 +1,13 @@ +{ + "name": "babel-plugin-syntax-numeric-separator", + "version": "7.0.0-alpha.12", + "description": "Allow parsing of Decimal, Binary, Hex and Octal literals that contain a Numeric Literal Separator", + "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-numeric-separator", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ], + "dependencies": {}, + "devDependencies": {} +} diff --git a/packages/babel-plugin-syntax-numeric-separator/src/index.js b/packages/babel-plugin-syntax-numeric-separator/src/index.js new file mode 100644 index 0000000000..751844a69b --- /dev/null +++ b/packages/babel-plugin-syntax-numeric-separator/src/index.js @@ -0,0 +1,7 @@ +export default function () { + return { + manipulateOptions(opts, parserOpts) { + parserOpts.plugins.push("numericSeparator"); + }, + }; +} diff --git a/packages/babel-plugin-transform-numeric-separator/.npmignore b/packages/babel-plugin-transform-numeric-separator/.npmignore new file mode 100644 index 0000000000..f980694583 --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/.npmignore @@ -0,0 +1,3 @@ +src +test +*.log diff --git a/packages/babel-plugin-transform-numeric-separator/README.md b/packages/babel-plugin-transform-numeric-separator/README.md new file mode 100644 index 0000000000..2b68ef2eaf --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/README.md @@ -0,0 +1,114 @@ +# babel-plugin-transform-numeric-separator + +> This plugin allows Babel to transform Decimal, Binary, Hex and Octal literals containing Numeric Literal Separator to their non-separated form. + +## Example + +### Decimal Literals + +```js +let budget = 1_000_000_000_000; + +// What is the value of `budget`? It's 1 trillion! +// +// Let's confirm: +console.log(budget === 10 ** 12); // true +``` + +### Binary Literals + +```js +let nibbles = 0b1010_0001_1000_0101; + +// Is bit 7 on? It sure is! +// 0b1010_0001_1000_0101 +// ^ +// +// We can double check: +console.log(!!(nibbles & (1 << 7))); // true +``` + +### Hex Literal + +```js +// Messages are sent as 24 bit values, but should be +// treated as 3 distinct bytes: +let message = 0xA0_B0_C0; + +// What's the value of the upper most byte? It's A0, or 160. +// We can confirm that: +let a = (message >> 16) & 0xFF; +console.log(a.toString(16), a); // a0, 160 + +// What's the value of the middle byte? It's B0, or 176. +// Let's just make sure... +let b = (message >> 8) & 0xFF; +console.log(b.toString(16), b); // b0, 176 + +// What's the value of the lower most byte? It's C0, or 192. +// Again, let's prove that: +let c = message & 0xFF; +console.log(c.toString(16), b); // c0, 192 +``` + +### Octal Literal + +*hand wave emoji* + +Octals are great for permissions, but also look better when represented in `0o0000` form. No real benefit with separators here. + +## Installation + +```sh +npm install --save-dev babel-plugin-transform-numeric-separator +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["transform-numeric-separator"] +} +``` + +### Via CLI + +```sh +babel --plugins transform-numeric-separator script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["transform-numeric-separator"] +}); +``` + +## Additional Information + +If you need to further compile ES2015 Decimal, Binary, Hex and Octal number representations to their pre-ES2015 numeric literal form, add the [`"transform-es2015-literals"`](http://babeljs.io/docs/plugins/transform-es2015-literals/) plugin: + +> `transform-es2015-literals` is already included in [babel-preset-env](https://github.com/babel/babel-preset-env) and babel-preset-es2015. + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "presets": ["env"], + "plugins": ["transform-numeric-separator"] +} +{ + "plugins": ["transform-numeric-separator", "transform-es2015-literals"] +} +``` + +## References + +* [Proposal: Numeric Separators](https://github.com/samuelgoto/proposal-numeric-separator) diff --git a/packages/babel-plugin-transform-numeric-separator/package.json b/packages/babel-plugin-transform-numeric-separator/package.json new file mode 100644 index 0000000000..e628810e6d --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/package.json @@ -0,0 +1,17 @@ +{ + "name": "babel-plugin-transform-numeric-separator", + "version": "7.0.0-alpha.12", + "description": "Remove numeric separators from Decimal, Binary, Hex and Octal literals", + "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-numeric-separator", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ], + "dependencies": { + "babel-plugin-syntax-numeric-separator": "7.0.0-alpha.12" + }, + "devDependencies": { + "babel-helper-plugin-test-runner": "7.0.0-alpha.10" + } +} diff --git a/packages/babel-plugin-transform-numeric-separator/src/index.js b/packages/babel-plugin-transform-numeric-separator/src/index.js new file mode 100644 index 0000000000..1b02b72ad0 --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/src/index.js @@ -0,0 +1,31 @@ +import syntaxNumericSeparator from "babel-plugin-syntax-numeric-separator"; + +export default function () { + + function replacer(value) { + return value.replace(/_/g, ""); + } + + function replaceNumberArg({ node }) { + if (node.callee.name === "Number") { + node.arguments[0].value = replacer(node.arguments[0].value); + } + } + + const CallExpression = replaceNumberArg; + const NewExpression = replaceNumberArg; + + return { + inherits: syntaxNumericSeparator, + + visitor: { + CallExpression, + NewExpression, + NumericLiteral({ node }) { + if (node.extra && /_/.test(node.extra.raw)) { + node.value = replacer(node.extra.raw); + } + }, + }, + }; +} diff --git a/packages/babel-plugin-transform-numeric-separator/test/fixtures/number/exec.js b/packages/babel-plugin-transform-numeric-separator/test/fixtures/number/exec.js new file mode 100644 index 0000000000..753b2855dc --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/test/fixtures/number/exec.js @@ -0,0 +1,9 @@ +assert.equal(Number("1_000"), Number("1000")); +assert.equal(Number("0xAE_BE_CE"), Number("0xAEBECE")); +assert.equal(Number("0b1010_0001_1000_0101"), Number("0b1010000110000101")); +assert.equal(Number("0o0_6_6_6"), Number("0o0666")); + +assert.equal(new Number("1_000").valueOf(), new Number("1000").valueOf()); +assert.equal(new Number("0xAE_BE_CE").valueOf(), new Number("0xAEBECE").valueOf()); +assert.equal(new Number("0b1010_0001_1000_0101").valueOf(), new Number("0b1010000110000101").valueOf()); +assert.equal(new Number("0o0_6_6_6").valueOf(), new Number("0o0666").valueOf()); diff --git a/packages/babel-plugin-transform-numeric-separator/test/fixtures/number/options.json b/packages/babel-plugin-transform-numeric-separator/test/fixtures/number/options.json new file mode 100644 index 0000000000..2ecd3a18a1 --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/test/fixtures/number/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-numeric-separator"] +} diff --git a/packages/babel-plugin-transform-numeric-separator/test/fixtures/removal/exec.js b/packages/babel-plugin-transform-numeric-separator/test/fixtures/removal/exec.js new file mode 100644 index 0000000000..2ccbbfbd9f --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/test/fixtures/removal/exec.js @@ -0,0 +1,4 @@ +assert.equal(1_000, 1000); +assert.equal(0xAE_BE_CE, 0xAEBECE); +assert.equal(0b1010_0001_1000_0101, 0b1010000110000101); +assert.equal(0o0_6_6_6, 0o0666); diff --git a/packages/babel-plugin-transform-numeric-separator/test/fixtures/removal/options.json b/packages/babel-plugin-transform-numeric-separator/test/fixtures/removal/options.json new file mode 100644 index 0000000000..2ecd3a18a1 --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/test/fixtures/removal/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-numeric-separator"] +} diff --git a/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/actual.js b/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/actual.js new file mode 100644 index 0000000000..a9c770d8c2 --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/actual.js @@ -0,0 +1,4 @@ +1_000; +0xA0_B0_C0; +0b1010_0001_1000_0101; +0o0_6_6_6; diff --git a/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/exec.js b/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/exec.js new file mode 100644 index 0000000000..6fe7659a0c --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/exec.js @@ -0,0 +1,4 @@ +assert.equal(1_000, 1000); +assert.equal(0xAE_BE_CE, 11452110); +assert.equal(0b1010_0001_1000_0101, 41349); +assert.equal(0o0_6_6_6, 438); diff --git a/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/expected.js b/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/expected.js new file mode 100644 index 0000000000..86dba506f9 --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/expected.js @@ -0,0 +1,4 @@ +1000; +10531008; +41349; +438; diff --git a/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/options.json b/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/options.json new file mode 100644 index 0000000000..bf1d8be512 --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/test/fixtures/used-with-transform-es2015-literals/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-numeric-separator", "transform-es2015-literals"] +} diff --git a/packages/babel-plugin-transform-numeric-separator/test/index.js b/packages/babel-plugin-transform-numeric-separator/test/index.js new file mode 100644 index 0000000000..09cfbc31f5 --- /dev/null +++ b/packages/babel-plugin-transform-numeric-separator/test/index.js @@ -0,0 +1,3 @@ +import runner from "babel-helper-plugin-test-runner"; + +runner(__dirname); diff --git a/packages/babel-preset-stage-1/package.json b/packages/babel-preset-stage-1/package.json index 4a4eec9c6d..dbcbd03470 100644 --- a/packages/babel-preset-stage-1/package.json +++ b/packages/babel-preset-stage-1/package.json @@ -8,6 +8,7 @@ "repository": "https://github.com/babel/babel/tree/master/packages/babel-preset-stage-1", "main": "lib/index.js", "dependencies": { + "babel-plugin-syntax-numeric-separator": "7.0.0-alpha.12", "babel-plugin-transform-decorators": "7.0.0-alpha.10", "babel-plugin-transform-export-extensions": "7.0.0-alpha.10", "babel-preset-stage-2": "7.0.0-alpha.10" diff --git a/packages/babel-preset-stage-1/src/index.js b/packages/babel-preset-stage-1/src/index.js index 15000e690b..fd1be2d539 100644 --- a/packages/babel-preset-stage-1/src/index.js +++ b/packages/babel-preset-stage-1/src/index.js @@ -2,6 +2,7 @@ import presetStage2 from "babel-preset-stage-2"; import transformDecorators from "babel-plugin-transform-decorators"; import transformExportExtensions from "babel-plugin-transform-export-extensions"; +import transformNumericSeparator from "babel-plugin-transform-numeric-separator"; export default function () { return { @@ -11,6 +12,7 @@ export default function () { plugins: [ transformDecorators, transformExportExtensions, + transformNumericSeparator, ], }; } diff --git a/packages/babel-template/package.json b/packages/babel-template/package.json index db7b314ef9..77ed04e681 100644 --- a/packages/babel-template/package.json +++ b/packages/babel-template/package.json @@ -8,7 +8,7 @@ "repository": "https://github.com/babel/babel/tree/master/packages/babel-template", "main": "lib/index.js", "dependencies": { - "babylon": "7.0.0-beta.11", + "babylon": "7.0.0-beta.12", "babel-traverse": "7.0.0-alpha.10", "babel-types": "7.0.0-alpha.10", "lodash": "^4.2.0" diff --git a/packages/babel-traverse/package.json b/packages/babel-traverse/package.json index cb6b4b0e62..dd3670b2da 100644 --- a/packages/babel-traverse/package.json +++ b/packages/babel-traverse/package.json @@ -12,7 +12,7 @@ "babel-helper-function-name": "7.0.0-alpha.7", "babel-messages": "7.0.0-alpha.10", "babel-types": "7.0.0-alpha.10", - "babylon": "7.0.0-beta.11", + "babylon": "7.0.0-beta.12", "debug": "^2.2.0", "globals": "^9.0.0", "invariant": "^2.2.0", diff --git a/packages/babel-types/package.json b/packages/babel-types/package.json index 7e73481d5c..6e7ebeff51 100644 --- a/packages/babel-types/package.json +++ b/packages/babel-types/package.json @@ -14,6 +14,6 @@ }, "devDependencies": { "babel-generator": "7.0.0-alpha.10", - "babylon": "^7.0.0-beta.8" + "babylon": "^7.0.0-beta.12" } }