diff --git a/src/parse/read/expression.js b/src/parse/read/expression.js index 110b6af4ef..7aa34b9bdc 100644 --- a/src/parse/read/expression.js +++ b/src/parse/read/expression.js @@ -1,10 +1,28 @@ import { parseExpressionAt } from 'acorn'; +const literals = new Map([ + [ 'true', true ], + [ 'false', false ], + [ 'null', null ] +]); + export default function readExpression ( parser ) { const start = parser.index; const name = parser.readUntil( /\s*}}/ ); if ( name && /^[a-z]+$/.test( name ) ) { + const end = start + name.length; + + if ( literals.has( name ) ) { + return { + type: 'Literal', + start, + end, + value: literals.get( name ), + raw: name + }; + } + return { type: 'Identifier', start, diff --git a/test/generator/samples/attribute-prefer-expression/_config.js b/test/generator/samples/attribute-prefer-expression/_config.js new file mode 100644 index 0000000000..ef88c5afa5 --- /dev/null +++ b/test/generator/samples/attribute-prefer-expression/_config.js @@ -0,0 +1,19 @@ +export default { + 'skip-ssr': true, + + data: { + foo: false + }, + + test ( assert, component, target ) { + const inputs = target.querySelectorAll( 'input' ); + + assert.ok( inputs[0].checked ); + assert.ok( !inputs[1].checked ); + + component.set( { foo: true } ); + + assert.ok( !inputs[0].checked ); + assert.ok( inputs[1].checked ); + } +}; diff --git a/test/generator/samples/attribute-prefer-expression/main.html b/test/generator/samples/attribute-prefer-expression/main.html new file mode 100644 index 0000000000..c69a83993d --- /dev/null +++ b/test/generator/samples/attribute-prefer-expression/main.html @@ -0,0 +1,2 @@ + +