From 484229e1ba9ea05e5cd49bbee8d18ed5e4cebed3 Mon Sep 17 00:00:00 2001 From: Michael Rawlings Date: Mon, 4 Jun 2018 12:08:17 -0700 Subject: [PATCH 1/7] tag param spike --- src/compiler/Builder.js | 6 +++++ src/compiler/ast/CustomTag.js | 7 ++++-- src/compiler/ast/FunctionDeclaration.js | 2 ++ src/compiler/util/parseJavaScript.js | 22 +++++++++++++------ src/compiler/util/parseJavaScriptParams.js | 13 +++++++++++ .../components/name/code-generator.js | 5 +++++ .../tag-params/components/name/index.marko | 17 ++++++++++++++ .../tag-params/components/name/marko-tag.json | 4 ++++ .../tag-params/components/name/transformer.js | 8 +++++++ .../fixtures/tag-params/index.marko | 5 +++++ .../fixtures/tag-params/test.js | 7 ++++++ 11 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 src/compiler/util/parseJavaScriptParams.js create mode 100644 test/components-browser/fixtures/tag-params/components/name/code-generator.js create mode 100644 test/components-browser/fixtures/tag-params/components/name/index.marko create mode 100644 test/components-browser/fixtures/tag-params/components/name/marko-tag.json create mode 100644 test/components-browser/fixtures/tag-params/components/name/transformer.js create mode 100644 test/components-browser/fixtures/tag-params/index.marko create mode 100644 test/components-browser/fixtures/tag-params/test.js diff --git a/src/compiler/Builder.js b/src/compiler/Builder.js index 1278e98bbb..478381451c 100644 --- a/src/compiler/Builder.js +++ b/src/compiler/Builder.js @@ -52,6 +52,7 @@ var CustomTag = require("./ast/CustomTag"); var parseExpression = require("./util/parseExpression"); var parseStatement = require("./util/parseStatement"); var parseJavaScriptArgs = require("./util/parseJavaScriptArgs"); +var parseJavaScriptParams = require("./util/parseJavaScriptParams"); var replacePlaceholderEscapeFuncs = require("./util/replacePlaceholderEscapeFuncs"); var isValidJavaScriptIdentifier = require("./util/isValidJavaScriptIdentifier"); @@ -475,6 +476,11 @@ class Builder { return parseJavaScriptArgs(args, DEFAULT_BUILDER); } + parseJavaScriptParams(params) { + ok(typeof params === "string", '"params" should be a string'); + return parseJavaScriptParams(params, DEFAULT_BUILDER); + } + parseStatement(str) { ok(typeof str === "string", '"str" should be a string expression'); var parsed = parseStatement(str, DEFAULT_BUILDER); diff --git a/src/compiler/ast/CustomTag.js b/src/compiler/ast/CustomTag.js index cbcfdf6b16..43bff8ef0a 100644 --- a/src/compiler/ast/CustomTag.js +++ b/src/compiler/ast/CustomTag.js @@ -77,8 +77,11 @@ function getNestedVariables(elNode, tagDef, codegen) { } if (elNode.additionalNestedVars.length) { - elNode.additionalNestedVars.forEach(varName => { - variableNames.push(codegen.builder.identifier(varName)); + elNode.additionalNestedVars.forEach(variable => { + if (typeof variable === "string") { + variable = codegen.builder.identifier(variable); + } + variableNames.push(variable); }); } diff --git a/src/compiler/ast/FunctionDeclaration.js b/src/compiler/ast/FunctionDeclaration.js index 884471985c..37e24f37a7 100644 --- a/src/compiler/ast/FunctionDeclaration.js +++ b/src/compiler/ast/FunctionDeclaration.js @@ -50,6 +50,7 @@ class FunctionDeclaration extends Node { if (typeof param === "string") { writer.write(param); } else { + /* if (param.type !== "Identifier") { throw new Error( "Illegal param " + @@ -58,6 +59,7 @@ class FunctionDeclaration extends Node { JSON.stringify(this) ); } + */ writer.write(param); } } diff --git a/src/compiler/util/parseJavaScript.js b/src/compiler/util/parseJavaScript.js index 11806dd138..50fc507be8 100644 --- a/src/compiler/util/parseJavaScript.js +++ b/src/compiler/util/parseJavaScript.js @@ -8,6 +8,19 @@ function parseExpression(src, builder, isExpression) { ok(builder, '"builder" is required'); function convert(node) { + if (Array.isArray(node)) { + return node.map(convert); + } + let markoNode = getMarkoNode(node); + if (!markoNode) { + markoNode = builder.expression( + src.slice(node.range[0], node.range[1]) + ); + } + return markoNode; + } + + function getMarkoNode(node) { if (Array.isArray(node)) { let nodes = node; for (let i = 0; i < nodes.length; i++) { @@ -298,7 +311,7 @@ function parseExpression(src, builder, isExpression) { if (isExpression) { src = "(" + src + ")"; } - jsAST = esprima.parseScript(src); + jsAST = esprima.parseScript(src, { range: true }); } catch (e) { if (e.index == null) { // Doesn't look like an Esprima parse error... just rethrow the exception @@ -324,12 +337,7 @@ function parseExpression(src, builder, isExpression) { throw wrappedError; } - var converted = convert(jsAST); - if (converted == null) { - converted = builder.expression(src); - } - - return converted; + return convert(jsAST); } module.exports = parseExpression; diff --git a/src/compiler/util/parseJavaScriptParams.js b/src/compiler/util/parseJavaScriptParams.js new file mode 100644 index 0000000000..d18ec906a3 --- /dev/null +++ b/src/compiler/util/parseJavaScriptParams.js @@ -0,0 +1,13 @@ +"use strict"; + +var ok = require("assert").ok; + +function parseJavaScriptParams(params, builder) { + ok(typeof params === "string", '"params" should be a string'); + ok(builder, '"builder" is required'); + + var parsed = builder.parseExpression("function(" + params + "){}"); + return parsed.params; +} + +module.exports = parseJavaScriptParams; diff --git a/test/components-browser/fixtures/tag-params/components/name/code-generator.js b/test/components-browser/fixtures/tag-params/components/name/code-generator.js new file mode 100644 index 0000000000..1f72250db6 --- /dev/null +++ b/test/components-browser/fixtures/tag-params/components/name/code-generator.js @@ -0,0 +1,5 @@ +module.exports = function(el) { + if (el.params) { + el.params.forEach(param => el.addNestedVariable(param)); + } +}; diff --git a/test/components-browser/fixtures/tag-params/components/name/index.marko b/test/components-browser/fixtures/tag-params/components/name/index.marko new file mode 100644 index 0000000000..004467d6dc --- /dev/null +++ b/test/components-browser/fixtures/tag-params/components/name/index.marko @@ -0,0 +1,17 @@ +class { + onCreate() { + this.state = { + name:'Anna' + } + } + changeName() { + this.state.name = 'Vickie'; + } +} + +
+ + +
\ No newline at end of file diff --git a/test/components-browser/fixtures/tag-params/components/name/marko-tag.json b/test/components-browser/fixtures/tag-params/components/name/marko-tag.json new file mode 100644 index 0000000000..0884dfdb61 --- /dev/null +++ b/test/components-browser/fixtures/tag-params/components/name/marko-tag.json @@ -0,0 +1,4 @@ +{ + "transformer": "./transformer.js", + "renderer": "./index.marko" +} diff --git a/test/components-browser/fixtures/tag-params/components/name/transformer.js b/test/components-browser/fixtures/tag-params/components/name/transformer.js new file mode 100644 index 0000000000..a44d4ca472 --- /dev/null +++ b/test/components-browser/fixtures/tag-params/components/name/transformer.js @@ -0,0 +1,8 @@ +module.exports = function(el, context) { + const builder = context.builder; + if (el.argument) { + el.params = builder.parseJavaScriptParams(el.argument); + el.params.forEach(param => el.addNestedVariable(param)); + delete el.argument; + } +}; diff --git a/test/components-browser/fixtures/tag-params/index.marko b/test/components-browser/fixtures/tag-params/index.marko new file mode 100644 index 0000000000..d8851cdd30 --- /dev/null +++ b/test/components-browser/fixtures/tag-params/index.marko @@ -0,0 +1,5 @@ +class {} + + + Hello, ${name}! + diff --git a/test/components-browser/fixtures/tag-params/test.js b/test/components-browser/fixtures/tag-params/test.js new file mode 100644 index 0000000000..f8e4550d7a --- /dev/null +++ b/test/components-browser/fixtures/tag-params/test.js @@ -0,0 +1,7 @@ +var expect = require("chai").expect; + +module.exports = function(helpers) { + var component = helpers.mount(require.resolve("./index"), {}); + expect(component.el.style.left).to.equal("0px"); + expect(component.el.style.marginRight).to.equal("10px"); +}; From cbf39ce18ab201eb07b1c36e95f3bcbb91e50358 Mon Sep 17 00:00:00 2001 From: Michael Rawlings Date: Tue, 3 Jul 2018 14:44:15 -0700 Subject: [PATCH 2/7] update test --- .../fixtures/tag-params/components/name/index.marko | 2 +- test/components-browser/fixtures/tag-params/index.marko | 2 +- test/components-browser/fixtures/tag-params/test.js | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/test/components-browser/fixtures/tag-params/components/name/index.marko b/test/components-browser/fixtures/tag-params/components/name/index.marko index 004467d6dc..9e5e5270c5 100644 --- a/test/components-browser/fixtures/tag-params/components/name/index.marko +++ b/test/components-browser/fixtures/tag-params/components/name/index.marko @@ -10,7 +10,7 @@ class { }
- + <${input} name=state.name/> diff --git a/test/components-browser/fixtures/tag-params/index.marko b/test/components-browser/fixtures/tag-params/index.marko index d8851cdd30..a40b07c7ad 100644 --- a/test/components-browser/fixtures/tag-params/index.marko +++ b/test/components-browser/fixtures/tag-params/index.marko @@ -1,5 +1,5 @@ class {} - + Hello, ${name}! diff --git a/test/components-browser/fixtures/tag-params/test.js b/test/components-browser/fixtures/tag-params/test.js index f8e4550d7a..90b93f2f56 100644 --- a/test/components-browser/fixtures/tag-params/test.js +++ b/test/components-browser/fixtures/tag-params/test.js @@ -2,6 +2,9 @@ var expect = require("chai").expect; module.exports = function(helpers) { var component = helpers.mount(require.resolve("./index"), {}); - expect(component.el.style.left).to.equal("0px"); - expect(component.el.style.marginRight).to.equal("10px"); + expect(helpers.targetEl.innerHTML).to.contain("Hello, Anna!"); + var nameComponent = component.getComponent("name"); + nameComponent.changeName(); + nameComponent.update(); + expect(helpers.targetEl.innerHTML).to.contain("Hello, Vickie!"); }; From ed26d7ce3513c04e41b2c7a3acf51c3818b3d2ff Mon Sep 17 00:00:00 2001 From: Michael Rawlings Date: Tue, 3 Jul 2018 14:51:26 -0700 Subject: [PATCH 3/7] pass escodegened code directly through --- .../taglib/TransformHelper/handleRootNodes.js | 2 +- test/compiler/fixtures-html/class-tag/expected.js | 5 +++-- .../class-method-empty-return/expected.js | 6 +++--- .../fixtures-html/component-inline-class/expected.js | 8 +++++--- .../fixtures-html/key-colon-attr/expected.js | 5 +++-- .../fixtures-html/key-suffix/expected.js | 5 +++-- .../fixtures-html/key/expected.js | 5 +++-- .../fixtures-html/nodejs-8-async-await/expected.js | 10 +++++----- 8 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/components/taglib/TransformHelper/handleRootNodes.js b/src/components/taglib/TransformHelper/handleRootNodes.js index a7281eecdf..b70d51d519 100644 --- a/src/components/taglib/TransformHelper/handleRootNodes.js +++ b/src/components/taglib/TransformHelper/handleRootNodes.js @@ -142,7 +142,7 @@ function handleClassDeclaration(classEl, transformHelper) { let object = classToObject(expression, classEl, transformHelper); let componentVar = transformHelper.context.addStaticVar( "marko_component", - escodegen.generate(object) + transformHelper.builder.code(escodegen.generate(object)) ); let moduleInfo = { diff --git a/test/compiler/fixtures-html/class-tag/expected.js b/test/compiler/fixtures-html/class-tag/expected.js index b4dd712997..fb5ed85367 100644 --- a/test/compiler/fixtures-html/class-tag/expected.js +++ b/test/compiler/fixtures-html/class-tag/expected.js @@ -2,8 +2,9 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - onCreate: function() {} - }, + onCreate: function () { + } + }, marko_componentType = "/marko-test$1.0.0/compiler/fixtures-html/class-tag/template.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/class-method-empty-return/expected.js b/test/components-compilation/fixtures-html/class-method-empty-return/expected.js index 45e0e2333a..bcd06bd110 100644 --- a/test/components-compilation/fixtures-html/class-method-empty-return/expected.js +++ b/test/components-compilation/fixtures-html/class-method-empty-return/expected.js @@ -2,10 +2,10 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - test: function(e) { - return; + test: function (e) { + return; } - }, + }, marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/class-method-empty-return/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/component-inline-class/expected.js b/test/components-compilation/fixtures-html/component-inline-class/expected.js index 7656cbcf55..69bf276894 100644 --- a/test/components-compilation/fixtures-html/component-inline-class/expected.js +++ b/test/components-compilation/fixtures-html/component-inline-class/expected.js @@ -2,9 +2,11 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - foo: function() {}, - bar: function() {} - }, + foo: function () { + }, + bar: function () { + } + }, marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/component-inline-class/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/key-colon-attr/expected.js b/test/components-compilation/fixtures-html/key-colon-attr/expected.js index 03c54beba3..8f86fcf18e 100644 --- a/test/components-compilation/fixtures-html/key-colon-attr/expected.js +++ b/test/components-compilation/fixtures-html/key-colon-attr/expected.js @@ -2,8 +2,9 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - onMount: function() {} - }, + onMount: function () { + } + }, marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/key-colon-attr/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/key-suffix/expected.js b/test/components-compilation/fixtures-html/key-suffix/expected.js index 0ea2e44cd4..090df23765 100644 --- a/test/components-compilation/fixtures-html/key-suffix/expected.js +++ b/test/components-compilation/fixtures-html/key-suffix/expected.js @@ -2,8 +2,9 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - onMount: function() {} - }, + onMount: function () { + } + }, marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/key-suffix/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/key/expected.js b/test/components-compilation/fixtures-html/key/expected.js index 4a7cd9e168..6e1f1d94e3 100644 --- a/test/components-compilation/fixtures-html/key/expected.js +++ b/test/components-compilation/fixtures-html/key/expected.js @@ -2,8 +2,9 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - onMount: function() {} - }, + onMount: function () { + } + }, marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/key/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/nodejs-8-async-await/expected.js b/test/components-compilation/fixtures-html/nodejs-8-async-await/expected.js index 67ee787df6..e9e265b4c0 100644 --- a/test/components-compilation/fixtures-html/nodejs-8-async-await/expected.js +++ b/test/components-compilation/fixtures-html/nodejs-8-async-await/expected.js @@ -1,11 +1,11 @@ "use strict"; var marko_template = module.exports = require("marko/src/html").t(__filename), - marko_component = ({ - test: async function () { - await Promise.resolve(); - } -}), + marko_component = { + test: async function () { + await Promise.resolve(); + } + }, marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/nodejs-8-async-await/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, From 3148ed455dcae0364e1af0871a5a52da5efd5309 Mon Sep 17 00:00:00 2001 From: Michael Rawlings Date: Wed, 4 Jul 2018 11:23:43 -0700 Subject: [PATCH 4/7] it works --- src/compiler/Parser.js | 9 ++++++++- src/compiler/ast/CustomTag.js | 6 +++++- src/compiler/taglib-loader/loadTagFromProps.js | 4 ++++ src/compiler/util/enableTagParams.js | 16 ++++++++++++++++ .../components/name/index.marko | 17 +++++++++++++++++ .../components/name/marko-tag.json | 3 +++ .../fixtures/tag-params-nested-tags/index.marko | 7 +++++++ .../fixtures/tag-params-nested-tags/test.js | 10 ++++++++++ .../components/name/code-generator.js | 5 ----- .../tag-params/components/name/marko-tag.json | 3 +-- .../tag-params/components/name/transformer.js | 8 -------- 11 files changed, 71 insertions(+), 17 deletions(-) create mode 100644 src/compiler/util/enableTagParams.js create mode 100644 test/components-browser/fixtures/tag-params-nested-tags/components/name/index.marko create mode 100644 test/components-browser/fixtures/tag-params-nested-tags/components/name/marko-tag.json create mode 100644 test/components-browser/fixtures/tag-params-nested-tags/index.marko create mode 100644 test/components-browser/fixtures/tag-params-nested-tags/test.js delete mode 100644 test/components-browser/fixtures/tag-params/components/name/code-generator.js delete mode 100644 test/components-browser/fixtures/tag-params/components/name/transformer.js diff --git a/src/compiler/Parser.js b/src/compiler/Parser.js index 1f0431251f..1a55e813b1 100644 --- a/src/compiler/Parser.js +++ b/src/compiler/Parser.js @@ -1,6 +1,7 @@ "use strict"; var ok = require("assert").ok; var replacePlaceholderEscapeFuncs = require("./util/replacePlaceholderEscapeFuncs"); +var enableTagParams = require("./util/enableTagParams"); var extend = require("raptor-util/extend"); var COMPILER_ATTRIBUTE_HANDLERS = { @@ -400,7 +401,13 @@ class Parser { } this.prevTextNode = null; - this.stack.pop(); + var { node } = this.stack.pop(); + var tagDef = node.tagDef; + if (tagDef && tagDef.featureFlags) { + if (tagDef.featureFlags.includes("params")) { + enableTagParams(node, this.context.builder); + } + } } handleComment(comment) { diff --git a/src/compiler/ast/CustomTag.js b/src/compiler/ast/CustomTag.js index 9046cc705a..ca215bdf60 100644 --- a/src/compiler/ast/CustomTag.js +++ b/src/compiler/ast/CustomTag.js @@ -814,8 +814,12 @@ class CustomTag extends HtmlElement { if ( checkIfNestedTagCanBeAddedDirectlyToInput(this, parentCustomTag) ) { + let params = getNestedVariables(this, this.tagDef, codegen); let renderBody = hasBody - ? builder.renderBodyFunction(body) + ? builder.renderBodyFunction( + body, + [builder.identifier("out")].concat(params) + ) : null; let additionalAttrs = renderBody ? { renderBody } : null; let inputProps = this.buildInputProps(codegen, additionalAttrs); diff --git a/src/compiler/taglib-loader/loadTagFromProps.js b/src/compiler/taglib-loader/loadTagFromProps.js index 339fcfec6c..2f5867678f 100644 --- a/src/compiler/taglib-loader/loadTagFromProps.js +++ b/src/compiler/taglib-loader/loadTagFromProps.js @@ -686,6 +686,10 @@ class TagLoader { htmlType(value) { this.tag.htmlType = value; } + + featureFlags(value) { + this.tag.featureFlags = value; + } } function isSupportedProperty(name) { diff --git a/src/compiler/util/enableTagParams.js b/src/compiler/util/enableTagParams.js new file mode 100644 index 0000000000..cf6b969175 --- /dev/null +++ b/src/compiler/util/enableTagParams.js @@ -0,0 +1,16 @@ +module.exports = function enableTagParams(el, builder) { + if (el.argument) { + el.params = builder.parseJavaScriptParams(el.argument); + el.params.forEach(param => el.addNestedVariable(param)); + delete el.argument; + } + el.forEachChild(childNode => { + if (isNestedTag(childNode)) { + enableTagParams(childNode, builder); + } + }); +}; + +function isNestedTag(node) { + return node.tagName && node.tagName[0] === "@"; +} diff --git a/test/components-browser/fixtures/tag-params-nested-tags/components/name/index.marko b/test/components-browser/fixtures/tag-params-nested-tags/components/name/index.marko new file mode 100644 index 0000000000..dc56c95749 --- /dev/null +++ b/test/components-browser/fixtures/tag-params-nested-tags/components/name/index.marko @@ -0,0 +1,17 @@ +class { + onCreate() { + this.state = { + name:'Anna' + } + } + changeName() { + this.state.name = 'Vickie'; + } +} + +
+ <${input.first} name=state.name/> + +
\ No newline at end of file diff --git a/test/components-browser/fixtures/tag-params-nested-tags/components/name/marko-tag.json b/test/components-browser/fixtures/tag-params-nested-tags/components/name/marko-tag.json new file mode 100644 index 0000000000..194e0dfa40 --- /dev/null +++ b/test/components-browser/fixtures/tag-params-nested-tags/components/name/marko-tag.json @@ -0,0 +1,3 @@ +{ + "featureFlags": ["params"] +} diff --git a/test/components-browser/fixtures/tag-params-nested-tags/index.marko b/test/components-browser/fixtures/tag-params-nested-tags/index.marko new file mode 100644 index 0000000000..c6c886f625 --- /dev/null +++ b/test/components-browser/fixtures/tag-params-nested-tags/index.marko @@ -0,0 +1,7 @@ +class {} + + + <@first({ name })> + Hello, ${name}! + + diff --git a/test/components-browser/fixtures/tag-params-nested-tags/test.js b/test/components-browser/fixtures/tag-params-nested-tags/test.js new file mode 100644 index 0000000000..90b93f2f56 --- /dev/null +++ b/test/components-browser/fixtures/tag-params-nested-tags/test.js @@ -0,0 +1,10 @@ +var expect = require("chai").expect; + +module.exports = function(helpers) { + var component = helpers.mount(require.resolve("./index"), {}); + expect(helpers.targetEl.innerHTML).to.contain("Hello, Anna!"); + var nameComponent = component.getComponent("name"); + nameComponent.changeName(); + nameComponent.update(); + expect(helpers.targetEl.innerHTML).to.contain("Hello, Vickie!"); +}; diff --git a/test/components-browser/fixtures/tag-params/components/name/code-generator.js b/test/components-browser/fixtures/tag-params/components/name/code-generator.js deleted file mode 100644 index 1f72250db6..0000000000 --- a/test/components-browser/fixtures/tag-params/components/name/code-generator.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = function(el) { - if (el.params) { - el.params.forEach(param => el.addNestedVariable(param)); - } -}; diff --git a/test/components-browser/fixtures/tag-params/components/name/marko-tag.json b/test/components-browser/fixtures/tag-params/components/name/marko-tag.json index 0884dfdb61..194e0dfa40 100644 --- a/test/components-browser/fixtures/tag-params/components/name/marko-tag.json +++ b/test/components-browser/fixtures/tag-params/components/name/marko-tag.json @@ -1,4 +1,3 @@ { - "transformer": "./transformer.js", - "renderer": "./index.marko" + "featureFlags": ["params"] } diff --git a/test/components-browser/fixtures/tag-params/components/name/transformer.js b/test/components-browser/fixtures/tag-params/components/name/transformer.js deleted file mode 100644 index a44d4ca472..0000000000 --- a/test/components-browser/fixtures/tag-params/components/name/transformer.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = function(el, context) { - const builder = context.builder; - if (el.argument) { - el.params = builder.parseJavaScriptParams(el.argument); - el.params.forEach(param => el.addNestedVariable(param)); - delete el.argument; - } -}; From d5d377f4299732b3502136a136d72c128b34ee1a Mon Sep 17 00:00:00 2001 From: Michael Rawlings Date: Thu, 5 Jul 2018 08:16:06 -0700 Subject: [PATCH 5/7] undo changes to parseJavaScript, handleRootNodes, and compiler tests. make parseJavaScriptParams work by using esprima directly --- src/compiler/util/parseJavaScript.js | 22 ++++++------------- src/compiler/util/parseJavaScriptParams.js | 10 +++++++-- .../taglib/TransformHelper/handleRootNodes.js | 2 +- .../fixtures-html/class-tag/expected.js | 5 ++--- .../class-method-empty-return/expected.js | 6 ++--- .../component-inline-class/expected.js | 8 +++---- .../fixtures-html/key-colon-attr/expected.js | 5 ++--- .../fixtures-html/key-suffix/expected.js | 5 ++--- .../fixtures-html/key/expected.js | 5 ++--- .../nodejs-8-async-await/expected.js | 10 ++++----- 10 files changed, 35 insertions(+), 43 deletions(-) diff --git a/src/compiler/util/parseJavaScript.js b/src/compiler/util/parseJavaScript.js index 50fc507be8..11806dd138 100644 --- a/src/compiler/util/parseJavaScript.js +++ b/src/compiler/util/parseJavaScript.js @@ -8,19 +8,6 @@ function parseExpression(src, builder, isExpression) { ok(builder, '"builder" is required'); function convert(node) { - if (Array.isArray(node)) { - return node.map(convert); - } - let markoNode = getMarkoNode(node); - if (!markoNode) { - markoNode = builder.expression( - src.slice(node.range[0], node.range[1]) - ); - } - return markoNode; - } - - function getMarkoNode(node) { if (Array.isArray(node)) { let nodes = node; for (let i = 0; i < nodes.length; i++) { @@ -311,7 +298,7 @@ function parseExpression(src, builder, isExpression) { if (isExpression) { src = "(" + src + ")"; } - jsAST = esprima.parseScript(src, { range: true }); + jsAST = esprima.parseScript(src); } catch (e) { if (e.index == null) { // Doesn't look like an Esprima parse error... just rethrow the exception @@ -337,7 +324,12 @@ function parseExpression(src, builder, isExpression) { throw wrappedError; } - return convert(jsAST); + var converted = convert(jsAST); + if (converted == null) { + converted = builder.expression(src); + } + + return converted; } module.exports = parseExpression; diff --git a/src/compiler/util/parseJavaScriptParams.js b/src/compiler/util/parseJavaScriptParams.js index d18ec906a3..7e1fdac0b3 100644 --- a/src/compiler/util/parseJavaScriptParams.js +++ b/src/compiler/util/parseJavaScriptParams.js @@ -1,13 +1,19 @@ "use strict"; var ok = require("assert").ok; +var esprima = require("esprima"); function parseJavaScriptParams(params, builder) { ok(typeof params === "string", '"params" should be a string'); ok(builder, '"builder" is required'); - var parsed = builder.parseExpression("function(" + params + "){}"); - return parsed.params; + var src = "(" + params + ") => {}"; + var jsAST = esprima.parseScript(src, { range: true }); + var paramNodes = jsAST.body[0].expression.params; + return paramNodes.map(node => { + var nodeSrc = src.slice(node.range[0], node.range[1]); + return builder.parseExpression(nodeSrc); + }); } module.exports = parseJavaScriptParams; diff --git a/src/components/taglib/TransformHelper/handleRootNodes.js b/src/components/taglib/TransformHelper/handleRootNodes.js index b70d51d519..a7281eecdf 100644 --- a/src/components/taglib/TransformHelper/handleRootNodes.js +++ b/src/components/taglib/TransformHelper/handleRootNodes.js @@ -142,7 +142,7 @@ function handleClassDeclaration(classEl, transformHelper) { let object = classToObject(expression, classEl, transformHelper); let componentVar = transformHelper.context.addStaticVar( "marko_component", - transformHelper.builder.code(escodegen.generate(object)) + escodegen.generate(object) ); let moduleInfo = { diff --git a/test/compiler/fixtures-html/class-tag/expected.js b/test/compiler/fixtures-html/class-tag/expected.js index fb5ed85367..b4dd712997 100644 --- a/test/compiler/fixtures-html/class-tag/expected.js +++ b/test/compiler/fixtures-html/class-tag/expected.js @@ -2,9 +2,8 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - onCreate: function () { - } - }, + onCreate: function() {} + }, marko_componentType = "/marko-test$1.0.0/compiler/fixtures-html/class-tag/template.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/class-method-empty-return/expected.js b/test/components-compilation/fixtures-html/class-method-empty-return/expected.js index bcd06bd110..45e0e2333a 100644 --- a/test/components-compilation/fixtures-html/class-method-empty-return/expected.js +++ b/test/components-compilation/fixtures-html/class-method-empty-return/expected.js @@ -2,10 +2,10 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - test: function (e) { - return; + test: function(e) { + return; } - }, + }, marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/class-method-empty-return/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/component-inline-class/expected.js b/test/components-compilation/fixtures-html/component-inline-class/expected.js index 69bf276894..7656cbcf55 100644 --- a/test/components-compilation/fixtures-html/component-inline-class/expected.js +++ b/test/components-compilation/fixtures-html/component-inline-class/expected.js @@ -2,11 +2,9 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - foo: function () { - }, - bar: function () { - } - }, + foo: function() {}, + bar: function() {} + }, marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/component-inline-class/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/key-colon-attr/expected.js b/test/components-compilation/fixtures-html/key-colon-attr/expected.js index 8f86fcf18e..03c54beba3 100644 --- a/test/components-compilation/fixtures-html/key-colon-attr/expected.js +++ b/test/components-compilation/fixtures-html/key-colon-attr/expected.js @@ -2,9 +2,8 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - onMount: function () { - } - }, + onMount: function() {} + }, marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/key-colon-attr/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/key-suffix/expected.js b/test/components-compilation/fixtures-html/key-suffix/expected.js index 090df23765..0ea2e44cd4 100644 --- a/test/components-compilation/fixtures-html/key-suffix/expected.js +++ b/test/components-compilation/fixtures-html/key-suffix/expected.js @@ -2,9 +2,8 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - onMount: function () { - } - }, + onMount: function() {} + }, marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/key-suffix/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/key/expected.js b/test/components-compilation/fixtures-html/key/expected.js index 6e1f1d94e3..4a7cd9e168 100644 --- a/test/components-compilation/fixtures-html/key/expected.js +++ b/test/components-compilation/fixtures-html/key/expected.js @@ -2,9 +2,8 @@ var marko_template = module.exports = require("marko/src/html").t(__filename), marko_component = { - onMount: function () { - } - }, + onMount: function() {} + }, marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/key/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, diff --git a/test/components-compilation/fixtures-html/nodejs-8-async-await/expected.js b/test/components-compilation/fixtures-html/nodejs-8-async-await/expected.js index e9e265b4c0..67ee787df6 100644 --- a/test/components-compilation/fixtures-html/nodejs-8-async-await/expected.js +++ b/test/components-compilation/fixtures-html/nodejs-8-async-await/expected.js @@ -1,11 +1,11 @@ "use strict"; var marko_template = module.exports = require("marko/src/html").t(__filename), - marko_component = { - test: async function () { - await Promise.resolve(); - } - }, + marko_component = ({ + test: async function () { + await Promise.resolve(); + } +}), marko_componentType = "/marko-test$1.0.0/components-compilation/fixtures-html/nodejs-8-async-await/index.marko", components_helpers = require("marko/src/components/helpers"), marko_renderer = components_helpers.r, From 21ed744f642af72cf924bd8d85bb9661545a2df5 Mon Sep 17 00:00:00 2001 From: Michael Rawlings Date: Thu, 5 Jul 2018 08:43:54 -0700 Subject: [PATCH 6/7] actually remove the commented out code --- src/compiler/ast/FunctionDeclaration.js | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/compiler/ast/FunctionDeclaration.js b/src/compiler/ast/FunctionDeclaration.js index 37e24f37a7..27e8bf64da 100644 --- a/src/compiler/ast/FunctionDeclaration.js +++ b/src/compiler/ast/FunctionDeclaration.js @@ -45,23 +45,8 @@ class FunctionDeclaration extends Node { if (i !== 0) { writer.write(", "); } - var param = params[i]; - if (typeof param === "string") { - writer.write(param); - } else { - /* - if (param.type !== "Identifier") { - throw new Error( - "Illegal param " + - JSON.stringify(param) + - " for FunctionDeclaration: " + - JSON.stringify(this) - ); - } - */ - writer.write(param); - } + writer.write(params[i]); } } From 037d2f59ccf16fec65e1832f141e3c8bfb122771 Mon Sep 17 00:00:00 2001 From: Michael Rawlings Date: Tue, 10 Jul 2018 10:40:43 -0700 Subject: [PATCH 7/7] fix reparsing error --- src/compiler/util/parseJavaScriptParams.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/util/parseJavaScriptParams.js b/src/compiler/util/parseJavaScriptParams.js index 7e1fdac0b3..5fb3129050 100644 --- a/src/compiler/util/parseJavaScriptParams.js +++ b/src/compiler/util/parseJavaScriptParams.js @@ -12,7 +12,7 @@ function parseJavaScriptParams(params, builder) { var paramNodes = jsAST.body[0].expression.params; return paramNodes.map(node => { var nodeSrc = src.slice(node.range[0], node.range[1]); - return builder.parseExpression(nodeSrc); + return builder.expression(nodeSrc); }); }