From 8186510b5defd06a9841713705a3a2d87ca9d162 Mon Sep 17 00:00:00 2001 From: phantom10111 Date: Tue, 24 Nov 2015 22:26:17 +0100 Subject: [PATCH 1/4] Add validators to CallExpression and SequenceExpression --- packages/babel-types/src/definitions/core.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/babel-types/src/definitions/core.js b/packages/babel-types/src/definitions/core.js index 49228d692c..df89024caa 100644 --- a/packages/babel-types/src/definitions/core.js +++ b/packages/babel-types/src/definitions/core.js @@ -112,7 +112,7 @@ defineType("CallExpression", { validate: assertNodeType("Expression") }, arguments: { - validate: assertValueType("array") + validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression", "SpreadElement"))) } }, aliases: ["Expression"] @@ -435,7 +435,7 @@ defineType("NewExpression", { validate: assertNodeType("Expression") }, arguments: { - validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression"))) + validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression", "SpreadElement"))) } } }); @@ -554,7 +554,9 @@ defineType("ReturnStatement", { defineType("SequenceExpression", { visitor: ["expressions"], fields: { - expressions: { validate: assertValueType("array") } + expressions: { + validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression"))) + } }, aliases: ["Expression"] }); From 615160ba66a05e1b6a83dc1d3e590d3d02ff336f Mon Sep 17 00:00:00 2001 From: phantom10111 Date: Tue, 24 Nov 2015 22:42:14 +0100 Subject: [PATCH 2/4] Fix babel-helper-remap-async-to-generator to not fail with the new validation rules --- .../babel-helper-remap-async-to-generator/src/index.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/babel-helper-remap-async-to-generator/src/index.js b/packages/babel-helper-remap-async-to-generator/src/index.js index a8ba68f0be..9984c662c1 100644 --- a/packages/babel-helper-remap-async-to-generator/src/index.js +++ b/packages/babel-helper-remap-async-to-generator/src/index.js @@ -53,6 +53,12 @@ function plainFunction(path: NodePath, callId: Object) { let asyncFnId = node.id; node.id = null; + let isDeclaration = path.isFunctionDeclaration(); + + if (isDeclaration) { + node.type = "FunctionExpression"; + } + let built = t.callExpression(callId, [node]); let container = buildWrapper({ FUNCTION: built, @@ -61,9 +67,7 @@ function plainFunction(path: NodePath, callId: Object) { let retFunction = container.body.body[1].argument; - if (path.isFunctionDeclaration()) { - node.type = "FunctionExpression"; - + if (isDeclaration) { let declar = t.variableDeclaration("let", [ t.variableDeclarator( t.identifier(asyncFnId.name), From d0f63c1a7ba0e5e046646fbacc1673b1d8e6309a Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Tue, 24 Nov 2015 22:25:35 -0500 Subject: [PATCH 3/4] add validators for TemplateLiteral and ArrayExpression --- packages/babel-types/src/definitions/core.js | 2 +- packages/babel-types/src/definitions/es2015.js | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/babel-types/src/definitions/core.js b/packages/babel-types/src/definitions/core.js index df89024caa..93f6110761 100644 --- a/packages/babel-types/src/definitions/core.js +++ b/packages/babel-types/src/definitions/core.js @@ -20,7 +20,7 @@ import defineType, { defineType("ArrayExpression", { fields: { elements: { - validate: assertValueType("array") + validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression", "SpreadElement"))) } }, visitor: ["elements"], diff --git a/packages/babel-types/src/definitions/es2015.js b/packages/babel-types/src/definitions/es2015.js index e699ba3d18..d70cebd15d 100644 --- a/packages/babel-types/src/definitions/es2015.js +++ b/packages/babel-types/src/definitions/es2015.js @@ -329,7 +329,12 @@ defineType("TemplateLiteral", { visitor: ["quasis", "expressions"], aliases: ["Expression", "Literal"], fields: { - // todo + quasis: { + validate: chain(assertValueType("array"), assertEach(assertNodeType("TemplateElement"))) + }, + expressions: { + validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression"))) + } } }); From 11a80864324139e4e15fb1fbade40039bbd7acce Mon Sep 17 00:00:00 2001 From: phantom10111 Date: Wed, 25 Nov 2015 23:39:35 +0100 Subject: [PATCH 4/4] Make ArrayExpression validator accept nulls as holes in the array --- packages/babel-types/src/definitions/core.js | 3 ++- packages/babel-types/src/definitions/index.js | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) 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;