diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json index 4d08e20071..6a17e44390 100644 --- a/packages/babel-core/package.json +++ b/packages/babel-core/package.json @@ -32,7 +32,7 @@ "babel-template": "7.0.0-alpha.15", "babel-traverse": "7.0.0-alpha.15", "babel-types": "7.0.0-alpha.15", - "babylon": "7.0.0-beta.15", + "babylon": "7.0.0-beta.17", "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 4259e3ff13..5b4d366ef5 100644 --- a/packages/babel-generator/package.json +++ b/packages/babel-generator/package.json @@ -20,6 +20,6 @@ }, "devDependencies": { "babel-helper-fixtures": "7.0.0-alpha.15", - "babylon": "^7.0.0-beta.15" + "babylon": "^7.0.0-beta.17" } } diff --git a/packages/babel-generator/src/generators/statements.js b/packages/babel-generator/src/generators/statements.js index c2d75a497b..29d914fbfc 100644 --- a/packages/babel-generator/src/generators/statements.js +++ b/packages/babel-generator/src/generators/statements.js @@ -171,10 +171,12 @@ export function TryStatement(node: Object) { export function CatchClause(node: Object) { this.word("catch"); this.space(); - this.token("("); - this.print(node.param, node); - this.token(")"); - this.space(); + if (node.param) { + this.token("("); + this.print(node.param, node); + this.token(")"); + this.space(); + } this.print(node.body, node); } diff --git a/packages/babel-generator/test/fixtures/types/Optional-TryStatement-CatchClause/actual.js b/packages/babel-generator/test/fixtures/types/Optional-TryStatement-CatchClause/actual.js new file mode 100644 index 0000000000..fd6b162cc2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/Optional-TryStatement-CatchClause/actual.js @@ -0,0 +1,51 @@ +try {} catch (err) {} + +try {} catch {} + +try { + bar; +} catch (err) {} + +try { + bar; +} catch {} + +try { + bar; +} catch (err) { + foo(); +} + +try { + bar; +} catch { + foo(); +} + +try { + bar; +} catch (err) { + foo(); +} finally { + yay(); +} + +try { + bar; +} catch { + foo(); +} finally { + yay(); +} + +try { + bar; +} catch (err) { + foo(); +} finally {} + +try { + bar; +} catch { + foo(); +} finally {} diff --git a/packages/babel-generator/test/fixtures/types/Optional-TryStatement-CatchClause/expected.js b/packages/babel-generator/test/fixtures/types/Optional-TryStatement-CatchClause/expected.js new file mode 100644 index 0000000000..fd6b162cc2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/Optional-TryStatement-CatchClause/expected.js @@ -0,0 +1,51 @@ +try {} catch (err) {} + +try {} catch {} + +try { + bar; +} catch (err) {} + +try { + bar; +} catch {} + +try { + bar; +} catch (err) { + foo(); +} + +try { + bar; +} catch { + foo(); +} + +try { + bar; +} catch (err) { + foo(); +} finally { + yay(); +} + +try { + bar; +} catch { + foo(); +} finally { + yay(); +} + +try { + bar; +} catch (err) { + foo(); +} finally {} + +try { + bar; +} catch { + foo(); +} finally {} diff --git a/packages/babel-generator/test/index.js b/packages/babel-generator/test/index.js index 95056f589e..ee952fb30b 100644 --- a/packages/babel-generator/test/index.js +++ b/packages/babel-generator/test/index.js @@ -388,6 +388,7 @@ suites.forEach(function(testSuite) { "jsx", "objectRestSpread", "optionalChaining", + "optionalCatchBinding", ], strictMode: false, sourceType: "module", diff --git a/packages/babel-plugin-syntax-optional-catch-binding/.npmignore b/packages/babel-plugin-syntax-optional-catch-binding/.npmignore new file mode 100644 index 0000000000..f980694583 --- /dev/null +++ b/packages/babel-plugin-syntax-optional-catch-binding/.npmignore @@ -0,0 +1,3 @@ +src +test +*.log diff --git a/packages/babel-plugin-syntax-optional-catch-binding/README.md b/packages/babel-plugin-syntax-optional-catch-binding/README.md new file mode 100644 index 0000000000..d6a43b68db --- /dev/null +++ b/packages/babel-plugin-syntax-optional-catch-binding/README.md @@ -0,0 +1,52 @@ +# babel-plugin-syntax-optional-catch-binding + +> This plugin allows Babel to parse optional catch bindings. + +## Example + +**Syntax** + +```javascript +try { + throw 0; +} catch { + doSomethingWhichDoesntCareAboutTheValueThrown(); + console.log("Yay, code executes!"); +} +``` + +## Installation + +```sh +npm install --save-dev babel-plugin-syntax-optional-catch-binding +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["syntax-optional-catch-binding"] +} +``` + +### Via CLI + +```sh +babel --plugins syntax-optional-catch-binding script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["syntax-optional-catch-binding"] +}); +``` + +## References + +* [Proposal: Optional Catch Binding for ECMAScript](https://github.com/babel/proposals/issues/7) diff --git a/packages/babel-plugin-syntax-optional-catch-binding/package.json b/packages/babel-plugin-syntax-optional-catch-binding/package.json new file mode 100644 index 0000000000..e30edd7abc --- /dev/null +++ b/packages/babel-plugin-syntax-optional-catch-binding/package.json @@ -0,0 +1,13 @@ +{ + "name": "babel-plugin-syntax-optional-catch-binding", + "version": "7.0.0-alpha.15", + "description": "Allow parsing of optional catch bindings", + "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-catch-binding", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ], + "dependencies": {}, + "devDependencies": {} +} diff --git a/packages/babel-plugin-syntax-optional-catch-binding/src/index.js b/packages/babel-plugin-syntax-optional-catch-binding/src/index.js new file mode 100644 index 0000000000..769a8df74f --- /dev/null +++ b/packages/babel-plugin-syntax-optional-catch-binding/src/index.js @@ -0,0 +1,7 @@ +export default function() { + return { + manipulateOptions(opts, parserOpts) { + parserOpts.plugins.push("optionalCatchBinding"); + }, + }; +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/.npmignore b/packages/babel-plugin-transform-optional-catch-binding/.npmignore new file mode 100644 index 0000000000..f980694583 --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/.npmignore @@ -0,0 +1,3 @@ +src +test +*.log diff --git a/packages/babel-plugin-transform-optional-catch-binding/README.md b/packages/babel-plugin-transform-optional-catch-binding/README.md new file mode 100644 index 0000000000..ece0e1c4ec --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/README.md @@ -0,0 +1,60 @@ +# babel-plugin-transform-optional-catch-binding + +> Optional catch binding enables the catch block to execute whether or not an argument is passed to the catch statement (CatchClause). + + +## Examples + +```js +try { + throw 0; +} catch { + doSomethingWhichDoesntCareAboutTheValueThrown(); +} +``` + +```js +try { + throw 0; +} catch { + doSomethingWhichDoesntCareAboutTheValueThrown(); +} finally { + doSomeCleanup(); +} +``` + + +## Installation + +```sh +npm install --save-dev babel-plugin-transform-optional-catch-binding +``` + +## Usage + +### Via `.babelrc` (Recommended) + +**.babelrc** + +```json +{ + "plugins": ["transform-optional-catch-binding"] +} +``` + +### Via CLI + +```sh +babel --plugins transform-optional-catch-binding script.js +``` + +### Via Node API + +```javascript +require("babel-core").transform("code", { + plugins: ["transform-optional-catch-binding"] +}); +``` + +## References +- [Proposal: Optional Catch Binding for ECMAScript](https://github.com/babel/proposals/issues/7) diff --git a/packages/babel-plugin-transform-optional-catch-binding/package.json b/packages/babel-plugin-transform-optional-catch-binding/package.json new file mode 100644 index 0000000000..45f86f3f19 --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/package.json @@ -0,0 +1,17 @@ +{ + "name": "babel-plugin-transform-optional-catch-binding", + "version": "7.0.0-alpha.15", + "description": "Compile optional catch bindings", + "repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-optional-catch-binding", + "license": "MIT", + "main": "lib/index.js", + "keywords": [ + "babel-plugin" + ], + "dependencies": { + "babel-plugin-syntax-optional-catch-binding": "7.0.0-alpha.15" + }, + "devDependencies": { + "babel-helper-plugin-test-runner": "7.0.0-alpha.15" + } +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/src/index.js b/packages/babel-plugin-transform-optional-catch-binding/src/index.js new file mode 100644 index 0000000000..9430e4e732 --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/src/index.js @@ -0,0 +1,17 @@ +import syntaxOptionalCatchBinding from "babel-plugin-syntax-optional-catch-binding"; + +export default function() { + return { + inherits: syntaxOptionalCatchBinding, + + visitor: { + CatchClause(path) { + if (!path.node.param) { + const uid = path.scope.generateUidIdentifier("unused"); + const paramPath = path.get("param"); + paramPath.replaceWith(uid); + } + }, + }, + }; +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/exec.js b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/exec.js new file mode 100644 index 0000000000..c55bbe53ac --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/exec.js @@ -0,0 +1,19 @@ +const test = () => { + try { + throw 0; + } + catch { + return true; + } +} +assert(test()); + +const test2 = () => { + try { + throw 0; + } + catch (err) { + return true; + } +} +assert(test2()); diff --git a/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-binding/actual.js b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-binding/actual.js new file mode 100644 index 0000000000..0f989f7bdc --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-binding/actual.js @@ -0,0 +1,5 @@ +try { + throw 0; +} catch (err) { + console.log("it failed, but this code executes"); +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-binding/expected.js b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-binding/expected.js new file mode 100644 index 0000000000..0f989f7bdc --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-binding/expected.js @@ -0,0 +1,5 @@ +try { + throw 0; +} catch (err) { + console.log("it failed, but this code executes"); +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-no-binding/actual.js b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-no-binding/actual.js new file mode 100644 index 0000000000..1bf3a12cd8 --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-no-binding/actual.js @@ -0,0 +1,5 @@ +try { + throw 0; +} catch { + console.log("it failed, but this code executes"); +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-no-binding/expected.js b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-no-binding/expected.js new file mode 100644 index 0000000000..9a562edbb3 --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-block-no-binding/expected.js @@ -0,0 +1,5 @@ +try { + throw 0; +} catch (_unused) { + console.log("it failed, but this code executes"); +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-binding/actual.js b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-binding/actual.js new file mode 100644 index 0000000000..ba0539adf7 --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-binding/actual.js @@ -0,0 +1,7 @@ +try { + throw 0; +} catch (err) { + console.log("it failed, but this code executes"); +} finally { + console.log("this code also executes"); +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-binding/expected.js b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-binding/expected.js new file mode 100644 index 0000000000..ba0539adf7 --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-binding/expected.js @@ -0,0 +1,7 @@ +try { + throw 0; +} catch (err) { + console.log("it failed, but this code executes"); +} finally { + console.log("this code also executes"); +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-no-binding/actual.js b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-no-binding/actual.js new file mode 100644 index 0000000000..31e6ca9ff4 --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-no-binding/actual.js @@ -0,0 +1,7 @@ +try { + throw 0; +} catch { + console.log("it failed, but this code executes"); +} finally { + console.log("this code also executes"); +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-no-binding/expected.js b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-no-binding/expected.js new file mode 100644 index 0000000000..a4eac719cf --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/optional-catch-bindings/try-catch-finally-no-binding/expected.js @@ -0,0 +1,7 @@ +try { + throw 0; +} catch (_unused) { + console.log("it failed, but this code executes"); +} finally { + console.log("this code also executes"); +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/options.json b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/options.json new file mode 100644 index 0000000000..09559345df --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/test/fixtures/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-optional-catch-binding"] +} diff --git a/packages/babel-plugin-transform-optional-catch-binding/test/index.js b/packages/babel-plugin-transform-optional-catch-binding/test/index.js new file mode 100644 index 0000000000..09cfbc31f5 --- /dev/null +++ b/packages/babel-plugin-transform-optional-catch-binding/test/index.js @@ -0,0 +1,3 @@ +import runner from "babel-helper-plugin-test-runner"; + +runner(__dirname); diff --git a/packages/babel-template/package.json b/packages/babel-template/package.json index 694b47c292..3371ae62f7 100644 --- a/packages/babel-template/package.json +++ b/packages/babel-template/package.json @@ -10,7 +10,7 @@ "dependencies": { "babel-traverse": "7.0.0-alpha.15", "babel-types": "7.0.0-alpha.15", - "babylon": "7.0.0-beta.13", + "babylon": "7.0.0-beta.17", "lodash": "^4.2.0" } } diff --git a/packages/babel-traverse/package.json b/packages/babel-traverse/package.json index 9195219584..d32b6f65ab 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.15", "babel-messages": "7.0.0-alpha.15", "babel-types": "7.0.0-alpha.15", - "babylon": "7.0.0-beta.15", + "babylon": "7.0.0-beta.17", "debug": "^2.2.0", "globals": "^10.0.0", "invariant": "^2.2.0", diff --git a/packages/babel-types/package.json b/packages/babel-types/package.json index 688326cb4f..dfb4e04110 100644 --- a/packages/babel-types/package.json +++ b/packages/babel-types/package.json @@ -14,6 +14,6 @@ }, "devDependencies": { "babel-generator": "7.0.0-alpha.15", - "babylon": "^7.0.0-beta.15" + "babylon": "^7.0.0-beta.17" } } diff --git a/packages/babel-types/src/definitions/core.js b/packages/babel-types/src/definitions/core.js index 3c51f41bf2..b99efe79d1 100644 --- a/packages/babel-types/src/definitions/core.js +++ b/packages/babel-types/src/definitions/core.js @@ -143,6 +143,7 @@ defineType("CatchClause", { fields: { param: { validate: assertNodeType("Identifier"), + optional: true, }, body: { validate: assertNodeType("BlockStatement"),