diff --git a/packages/babel-plugin-proposal-decorators/src/index.js b/packages/babel-plugin-proposal-decorators/src/index.js index 84c627e6decd..be8e25403c04 100644 --- a/packages/babel-plugin-proposal-decorators/src/index.js +++ b/packages/babel-plugin-proposal-decorators/src/index.js @@ -6,16 +6,12 @@ import legacyVisitor from "./transformer-legacy"; export default declare((api, options) => { api.assertVersion(7); - const { - legacy = false, - decoratorsBeforeExport, - automaticParentheses, - } = options; - + const { legacy = false } = options; if (typeof legacy !== "boolean") { throw new Error("'legacy' must be a boolean."); } + let { decoratorsBeforeExport } = options; if (decoratorsBeforeExport !== undefined) { if (legacy) { throw new Error( @@ -25,8 +21,11 @@ export default declare((api, options) => { if (typeof decoratorsBeforeExport !== "boolean") { throw new Error("'decoratorsBeforeExport' must be a boolean."); } + } else if (!legacy) { + decoratorsBeforeExport = true; } + const { automaticParentheses } = options; if (automaticParentheses !== undefined) { if (legacy) { throw new Error( diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/export-default/input.mjs b/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/export-default/input.mjs index 99eb5ad60db3..97db46f8a830 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/export-default/input.mjs +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/transformation/export-default/input.mjs @@ -1 +1,2 @@ -export default @dec() class {} \ No newline at end of file +@dec() +export default class {} diff --git a/packages/babel-plugin-syntax-decorators/src/index.js b/packages/babel-plugin-syntax-decorators/src/index.js index 8f0c12fbc0d4..5a208d351566 100644 --- a/packages/babel-plugin-syntax-decorators/src/index.js +++ b/packages/babel-plugin-syntax-decorators/src/index.js @@ -8,14 +8,6 @@ export default declare((api, options) => { throw new Error("'legacy' must be a boolean."); } - if (legacy !== true) { - throw new Error( - "The new decorators proposal is not supported yet." + - ' You must pass the `"legacy": true` option to' + - " @babel/plugin-syntax-decorators", - ); - } - let { decoratorsBeforeExport } = options; if (decoratorsBeforeExport !== undefined) { if (legacy) { diff --git a/packages/babel-plugin-syntax-decorators/test/index.js b/packages/babel-plugin-syntax-decorators/test/index.js index 79e201fcc2e9..9242acad527c 100644 --- a/packages/babel-plugin-syntax-decorators/test/index.js +++ b/packages/babel-plugin-syntax-decorators/test/index.js @@ -15,7 +15,7 @@ describe("'legacy' option", function() { expect(makeParser("", { legacy: "legacy" })).toThrow(); }); - test.skip("'legacy': false", function() { + test("'legacy': false", function() { expect(makeParser("({ @dec fn() {} })", { legacy: false })).toThrow(); }); @@ -23,17 +23,13 @@ describe("'legacy' option", function() { expect(makeParser("({ @dec fn() {} })", { legacy: true })).not.toThrow(); }); - test.skip("defaults to 'false'", function() { + test("defaults to 'false'", function() { expect(makeParser("({ @dec fn() {} })", {})).toThrow(); }); - - test("it must be true", function() { - expect(makeParser("", { legacy: false })).toThrow(); - }); }); describe("'decoratorsBeforeExport' option", function() { - test.skip("must be boolean", function() { + test("must be boolean", function() { expect(makeParser("", { decoratorsBeforeExport: "before" })).toThrow(); }); @@ -46,7 +42,6 @@ describe("'decoratorsBeforeExport' option", function() { const BEFORE = "@dec export class Foo {}"; const AFTER = "export @dec class Foo {}"; - // These are skipped run(BEFORE, undefined, false); run(AFTER, undefined, true); run(BEFORE, true, false); @@ -61,7 +56,7 @@ describe("'decoratorsBeforeExport' option", function() { (code === BEFORE ? "before" : "after") + "export"; - test.skip(name, function() { + test(name, function() { const expectTheParser = expect( makeParser(code, { decoratorsBeforeExport: before }), ); diff --git a/packages/babel-types/src/asserts/generated/index.js b/packages/babel-types/src/asserts/generated/index.js index 5feffa76e445..4fc988f4fd7d 100644 --- a/packages/babel-types/src/asserts/generated/index.js +++ b/packages/babel-types/src/asserts/generated/index.js @@ -468,6 +468,12 @@ export function assertObjectTypeAnnotation( ): void { assert("ObjectTypeAnnotation", node, opts); } +export function assertObjectTypeInternalSlot( + node: Object, + opts?: Object = {}, +): void { + assert("ObjectTypeInternalSlot", node, opts); +} export function assertObjectTypeCallProperty( node: Object, opts?: Object = {}, diff --git a/packages/babel-types/src/builders/generated/index.js b/packages/babel-types/src/builders/generated/index.js index fdb9bde25685..eda7514c11fe 100644 --- a/packages/babel-types/src/builders/generated/index.js +++ b/packages/babel-types/src/builders/generated/index.js @@ -429,6 +429,10 @@ export function ObjectTypeAnnotation(...args: Array): Object { return builder("ObjectTypeAnnotation", ...args); } export { ObjectTypeAnnotation as objectTypeAnnotation }; +export function ObjectTypeInternalSlot(...args: Array): Object { + return builder("ObjectTypeInternalSlot", ...args); +} +export { ObjectTypeInternalSlot as objectTypeInternalSlot }; export function ObjectTypeCallProperty(...args: Array): Object { return builder("ObjectTypeCallProperty", ...args); } diff --git a/packages/babel-types/src/validators/generated/index.js b/packages/babel-types/src/validators/generated/index.js index 1171e9a55711..42de2ad2e8da 100644 --- a/packages/babel-types/src/validators/generated/index.js +++ b/packages/babel-types/src/validators/generated/index.js @@ -1522,6 +1522,20 @@ export function isObjectTypeAnnotation(node: Object, opts?: Object): boolean { return false; } +export function isObjectTypeInternalSlot(node: Object, opts?: Object): boolean { + if (!node) return false; + + const nodeType = node.type; + if (nodeType === "ObjectTypeInternalSlot") { + if (typeof opts === "undefined") { + return true; + } else { + return shallowEqual(node, opts); + } + } + + return false; +} export function isObjectTypeCallProperty(node: Object, opts?: Object): boolean { if (!node) return false; @@ -3659,6 +3673,7 @@ export function isUserWhitespacable(node: Object, opts?: Object): boolean { nodeType === "UserWhitespacable" || "ObjectMethod" === nodeType || "ObjectProperty" === nodeType || + "ObjectTypeInternalSlot" === nodeType || "ObjectTypeCallProperty" === nodeType || "ObjectTypeIndexer" === nodeType || "ObjectTypeProperty" === nodeType || @@ -3882,6 +3897,7 @@ export function isFlow(node: Object, opts?: Object): boolean { "NumberLiteralTypeAnnotation" === nodeType || "NumberTypeAnnotation" === nodeType || "ObjectTypeAnnotation" === nodeType || + "ObjectTypeInternalSlot" === nodeType || "ObjectTypeCallProperty" === nodeType || "ObjectTypeIndexer" === nodeType || "ObjectTypeProperty" === nodeType ||