From 7e5f008a78beb7727c8771ead390b0b44604be26 Mon Sep 17 00:00:00 2001 From: Admin Date: Tue, 7 Aug 2018 22:22:36 -0500 Subject: [PATCH 1/4] Adds DebugTag --- src/compile/nodes/DebugTag.ts | 25 ++++++++++++++++ src/compile/nodes/Element.ts | 39 ++++++++++++++++++++++++- src/compile/nodes/shared/mapChildren.ts | 2 ++ src/parse/state/mustache.ts | 14 +++++++++ 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/compile/nodes/DebugTag.ts diff --git a/src/compile/nodes/DebugTag.ts b/src/compile/nodes/DebugTag.ts new file mode 100644 index 0000000000..ac12928e58 --- /dev/null +++ b/src/compile/nodes/DebugTag.ts @@ -0,0 +1,25 @@ +import Node from './shared/Node'; +import Tag from './shared/Tag'; +import Block from '../dom/Block'; +import deindent from '../../utils/deindent'; + +export default class DebugTag extends Tag { + build( + block: Block, + parentNode: string, + parentNodes: string, + ) { + const { dependencies } = this.expression; + + const condition = [...dependencies].map(d => `changed.${d}`).join(' || '); + + const identifiers = [...dependencies].join(', '); + + block.builders.update.addBlock(deindent` + if (${condition}) { + const { ${identifiers} } = ctx; + debugger; + } + `); + } +} \ No newline at end of file diff --git a/src/compile/nodes/Element.ts b/src/compile/nodes/Element.ts index 403b9cce8b..6fcf0c013b 100644 --- a/src/compile/nodes/Element.ts +++ b/src/compile/nodes/Element.ts @@ -21,7 +21,44 @@ import mapChildren from './shared/mapChildren'; import { dimensions } from '../../utils/patterns'; // source: https://gist.github.com/ArjanSchouten/0b8574a6ad7f5065a5e7 -const booleanAttributes = new Set('async autocomplete autofocus autoplay border challenge checked compact contenteditable controls default defer disabled formnovalidate frameborder hidden indeterminate ismap loop multiple muted nohref noresize noshade novalidate nowrap open readonly required reversed scoped scrolling seamless selected sortable spellcheck translate'.split(' ')); +const booleanAttributes = new Set(['async', + 'autocomplete', + 'autofocus', + 'autoplay', + 'border', + 'challenge', + 'checked', + 'compact', + 'contenteditable', + 'controls', + 'default', + 'defer', + 'disabled', + 'formnovalidate', + 'frameborder', + 'hidden', + 'indeterminate', + 'ismap', + 'loop', + 'multiple', + 'muted', + 'nohref', + 'noresize', + 'noshade', + 'novalidate', + 'nowrap', + 'open', + 'readonly', + 'required', + 'reversed', + 'scoped', + 'scrolling', + 'seamless', + 'selected', + 'sortable', + 'spellcheck', + 'translate' +]); export default class Element extends Node { type: 'Element'; diff --git a/src/compile/nodes/shared/mapChildren.ts b/src/compile/nodes/shared/mapChildren.ts index 0a0a111322..9cd238644c 100644 --- a/src/compile/nodes/shared/mapChildren.ts +++ b/src/compile/nodes/shared/mapChildren.ts @@ -7,6 +7,7 @@ import Head from '../Head'; import IfBlock from '../IfBlock'; import MustacheTag from '../MustacheTag'; import RawMustacheTag from '../RawMustacheTag'; +import DebugTag from '../DebugTag'; import Slot from '../Slot'; import Text from '../Text'; import Title from '../Title'; @@ -24,6 +25,7 @@ function getConstructor(type): typeof Node { case 'IfBlock': return IfBlock; case 'MustacheTag': return MustacheTag; case 'RawMustacheTag': return RawMustacheTag; + case 'DebugTag': return DebugTag; case 'Slot': return Slot; case 'Text': return Text; case 'Title': return Title; diff --git a/src/parse/state/mustache.ts b/src/parse/state/mustache.ts index cbac76e6a1..211ca2a349 100644 --- a/src/parse/state/mustache.ts +++ b/src/parse/state/mustache.ts @@ -313,6 +313,20 @@ export default function mustache(parser: Parser) { type: 'RawMustacheTag', expression, }); + } else if (parser.eat('@debug')) { + const expression = readExpression(parser); + + parser.allowWhitespace(); + parser.eat('}', true); + + // console.error(expression); + + parser.current().children.push({ + start, + end: parser.index, + type: 'DebugTag', + expression + }); } else { const expression = readExpression(parser); From 622e7b019085b7ae6a5645c84f1cc860bd5ca802 Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 8 Aug 2018 00:36:52 -0500 Subject: [PATCH 2/4] Adds debug all option to debug tag --- src/compile/nodes/DebugTag.ts | 22 ++++++++++++------- src/parse/state/mustache.ts | 6 ++--- src/validate/html/index.ts | 13 +++++++++++ .../samples/redundant-debug-all/errors.json | 15 +++++++++++++ .../samples/redundant-debug-all/input.html | 12 ++++++++++ 5 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 test/validator/samples/redundant-debug-all/errors.json create mode 100644 test/validator/samples/redundant-debug-all/input.html diff --git a/src/compile/nodes/DebugTag.ts b/src/compile/nodes/DebugTag.ts index ac12928e58..e56eba171f 100644 --- a/src/compile/nodes/DebugTag.ts +++ b/src/compile/nodes/DebugTag.ts @@ -11,15 +11,21 @@ export default class DebugTag extends Tag { ) { const { dependencies } = this.expression; - const condition = [...dependencies].map(d => `changed.${d}`).join(' || '); + // Debug all + if (dependencies.has('_')) { + block.builders.create.addLine('debugger;'); + block.builders.update.addLine('debugger;'); + } else { + const condition = [...dependencies].map(d => `changed.${d}`).join(' || '); - const identifiers = [...dependencies].join(', '); + const identifiers = [...dependencies].join(', '); - block.builders.update.addBlock(deindent` - if (${condition}) { - const { ${identifiers} } = ctx; - debugger; - } - `); + block.builders.update.addBlock(deindent` + if (${condition}) { + const { ${identifiers} } = ctx; + debugger; + } + `); + } } } \ No newline at end of file diff --git a/src/parse/state/mustache.ts b/src/parse/state/mustache.ts index 211ca2a349..f3fb0c530b 100644 --- a/src/parse/state/mustache.ts +++ b/src/parse/state/mustache.ts @@ -315,17 +315,15 @@ export default function mustache(parser: Parser) { }); } else if (parser.eat('@debug')) { const expression = readExpression(parser); - + parser.allowWhitespace(); parser.eat('}', true); - // console.error(expression); - parser.current().children.push({ start, end: parser.index, type: 'DebugTag', - expression + expression, }); } else { const expression = readExpression(parser); diff --git a/src/validate/html/index.ts b/src/validate/html/index.ts index ed4eaf4d38..f4f8827785 100644 --- a/src/validate/html/index.ts +++ b/src/validate/html/index.ts @@ -74,6 +74,19 @@ export default function validateHtml(validator: Validator, html: Node) { }); } + else if (node.type === 'DebugTag') { + // Only allow the `_` expression if it's by itself + // i.e. {@debug _, name } is redundantredundant-debug-all + const names = node.expression.expressions.map(e => e.name); + + if (names.length > 0 && names.includes('_')) { + validator.error(node, { + code: 'redundant-debug-all', + message: `Combining other expressions with '_' is redundant` + }); + } + } + if (validator.options.dev && isEmptyBlock(node)) { validator.warn(node, { code: `empty-block`, diff --git a/test/validator/samples/redundant-debug-all/errors.json b/test/validator/samples/redundant-debug-all/errors.json new file mode 100644 index 0000000000..e7d9d783bd --- /dev/null +++ b/test/validator/samples/redundant-debug-all/errors.json @@ -0,0 +1,15 @@ +[{ + "message": "Combining other expressions with '_' is redundant", + "start": { + "line": 1, + "column": 0, + "character": 0 + }, + "end":{ + "line": 1, + "column": 16, + "character": 16 + }, + "pos": 0, + "code": "redundant-debug-all" +}] \ No newline at end of file diff --git a/test/validator/samples/redundant-debug-all/input.html b/test/validator/samples/redundant-debug-all/input.html new file mode 100644 index 0000000000..fc4f79832e --- /dev/null +++ b/test/validator/samples/redundant-debug-all/input.html @@ -0,0 +1,12 @@ +{@debug _, name} +
Hello {name}!
+ + \ No newline at end of file From 79c023e604039873d15ccde57f918618c006b38c Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 8 Aug 2018 00:41:36 -0500 Subject: [PATCH 3/4] Fixes small issue with Element's booleanAttributes --- src/compile/nodes/Element.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compile/nodes/Element.ts b/src/compile/nodes/Element.ts index 6fcf0c013b..d8c7bb3a7a 100644 --- a/src/compile/nodes/Element.ts +++ b/src/compile/nodes/Element.ts @@ -21,7 +21,8 @@ import mapChildren from './shared/mapChildren'; import { dimensions } from '../../utils/patterns'; // source: https://gist.github.com/ArjanSchouten/0b8574a6ad7f5065a5e7 -const booleanAttributes = new Set(['async', +const booleanAttributes = new Set([ + 'async', 'autocomplete', 'autofocus', 'autoplay', From a3c71af5c5860d4bfcdbfa63256b35a99a21a3e5 Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 8 Aug 2018 18:21:33 -0500 Subject: [PATCH 4/4] Changes {@debug _ } to {@debug} --- src/compile/nodes/DebugTag.ts | 21 +++++++++++++++---- src/parse/state/mustache.ts | 8 ++++++- src/validate/html/index.ts | 13 ------------ .../samples/redundant-debug-all/errors.json | 15 ------------- .../samples/redundant-debug-all/input.html | 12 ----------- 5 files changed, 24 insertions(+), 45 deletions(-) delete mode 100644 test/validator/samples/redundant-debug-all/errors.json delete mode 100644 test/validator/samples/redundant-debug-all/input.html diff --git a/src/compile/nodes/DebugTag.ts b/src/compile/nodes/DebugTag.ts index e56eba171f..7bd2742c4f 100644 --- a/src/compile/nodes/DebugTag.ts +++ b/src/compile/nodes/DebugTag.ts @@ -1,21 +1,34 @@ import Node from './shared/Node'; import Tag from './shared/Tag'; import Block from '../dom/Block'; +import Expression from './shared/Expression'; import deindent from '../../utils/deindent'; -export default class DebugTag extends Tag { +export default class DebugTag extends Node { + expression: Expression; + + constructor(compiler, parent, scope, info) { + super(compiler, parent, scope, info); + if (info.expression !== null) + // Debug when expression nodes change + this.expression = new Expression(compiler, parent, scope, info.expression); + else + // "Debug all" + this.expression = info.expression + } + build( block: Block, parentNode: string, parentNodes: string, ) { - const { dependencies } = this.expression; - // Debug all - if (dependencies.has('_')) { + if (this.expression === null) { block.builders.create.addLine('debugger;'); block.builders.update.addLine('debugger;'); } else { + const { dependencies } = this.expression; + const condition = [...dependencies].map(d => `changed.${d}`).join(' || '); const identifiers = [...dependencies].join(', '); diff --git a/src/parse/state/mustache.ts b/src/parse/state/mustache.ts index f3fb0c530b..8450074c66 100644 --- a/src/parse/state/mustache.ts +++ b/src/parse/state/mustache.ts @@ -314,7 +314,13 @@ export default function mustache(parser: Parser) { expression, }); } else if (parser.eat('@debug')) { - const expression = readExpression(parser); + let expression; + + // Implies {@debug} which indicates "debug all" + if (/\s*}/.test(parser.template[parser.index])) + expression = null; + else + expression = readExpression(parser); parser.allowWhitespace(); parser.eat('}', true); diff --git a/src/validate/html/index.ts b/src/validate/html/index.ts index f4f8827785..ed4eaf4d38 100644 --- a/src/validate/html/index.ts +++ b/src/validate/html/index.ts @@ -74,19 +74,6 @@ export default function validateHtml(validator: Validator, html: Node) { }); } - else if (node.type === 'DebugTag') { - // Only allow the `_` expression if it's by itself - // i.e. {@debug _, name } is redundantredundant-debug-all - const names = node.expression.expressions.map(e => e.name); - - if (names.length > 0 && names.includes('_')) { - validator.error(node, { - code: 'redundant-debug-all', - message: `Combining other expressions with '_' is redundant` - }); - } - } - if (validator.options.dev && isEmptyBlock(node)) { validator.warn(node, { code: `empty-block`, diff --git a/test/validator/samples/redundant-debug-all/errors.json b/test/validator/samples/redundant-debug-all/errors.json deleted file mode 100644 index e7d9d783bd..0000000000 --- a/test/validator/samples/redundant-debug-all/errors.json +++ /dev/null @@ -1,15 +0,0 @@ -[{ - "message": "Combining other expressions with '_' is redundant", - "start": { - "line": 1, - "column": 0, - "character": 0 - }, - "end":{ - "line": 1, - "column": 16, - "character": 16 - }, - "pos": 0, - "code": "redundant-debug-all" -}] \ No newline at end of file diff --git a/test/validator/samples/redundant-debug-all/input.html b/test/validator/samples/redundant-debug-all/input.html deleted file mode 100644 index fc4f79832e..0000000000 --- a/test/validator/samples/redundant-debug-all/input.html +++ /dev/null @@ -1,12 +0,0 @@ -{@debug _, name} -
Hello {name}!
- - \ No newline at end of file