diff --git a/packages/babel-types/src/definitions/core.js b/packages/babel-types/src/definitions/core.js index 93f6110761..623160163e 100644 --- a/packages/babel-types/src/definitions/core.js +++ b/packages/babel-types/src/definitions/core.js @@ -12,6 +12,7 @@ import { import defineType, { assertValueType, assertNodeType, + assertNodeOrValueType, assertEach, chain, assertOneOf, @@ -20,7 +21,7 @@ import defineType, { defineType("ArrayExpression", { fields: { elements: { - validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression", "SpreadElement"))) + validate: chain(assertValueType("array"), assertEach(assertNodeOrValueType("null", "Expression", "SpreadElement"))) } }, visitor: ["elements"], diff --git a/packages/babel-types/src/definitions/index.js b/packages/babel-types/src/definitions/index.js index dc0b4e64fe..2f6c7dfc76 100644 --- a/packages/babel-types/src/definitions/index.js +++ b/packages/babel-types/src/definitions/index.js @@ -61,6 +61,27 @@ export function assertNodeType(...types: Array): Function { return validate; } +export function assertNodeOrValueType(...types: Array): Function { + function validate(node, key, val) { + let valid = false; + + for (let type of types) { + if (getType(val) === type || t.is(type, val)) { + valid = true; + break; + } + } + + if (!valid) { + throw new TypeError(`Property ${key} of ${node.type} expected node to be of a type ${JSON.stringify(types)} but instead got ${JSON.stringify(val && val.type)}`); + } + } + + validate.oneOfNodeOrValueTypes = types; + + return validate; +} + export function assertValueType(type: string): Function { function validate(node, key, val) { let valid = getType(val) === type;