veged / xjst

Extensible JavaScript Transformations

Home Page:http://veged.github.com/xjst/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

The template engine doesn't compile template with negative number without dev mode

vovieque opened this issue · comments

The template engine doesn't compile the next template without dev mode:

attrs()({
    tabindex: -1
}),
Error: Only literal or function is allowed in template's body at 674:9
    attrs()({
         ^
    at Compiler.assert (/home/rakchaev/job/makeup/bem/node_modules/enb-bemxjst/node_modules/bem-xjst/node_modules/xjst/lib/xjst/compiler/base.js:180:9)
    at Compiler.transformTemplates (/home/rakchaev/job/makeup/bem/node_modules/enb-bemxjst/node_modules/bem-xjst/node_modules/xjst/lib/xjst/compiler/base.js:648:8)
    at Array.map (native)
    at Compiler.translate (/home/rakchaev/job/makeup/bem/node_modules/enb-bemxjst/node_modules/bem-xjst/node_modules/xjst/lib/xjst/compiler/base.js:201:41)
    at Object.translate (/home/rakchaev/job/makeup/bem/node_modules/enb-bemxjst/node_modules/bem-xjst/node_modules/xjst/lib/xjst/api.js:16:40)
    at Compiler.translate (/home/rakchaev/job/makeup/bem/node_modules/enb-bemxjst/node_modules/bem-xjst/lib/bemhtml/compiler.js:121:35)
    at Compiler.generate (/home/rakchaev/job/makeup/bem/node_modules/enb-bemxjst/node_modules/bem-xjst/lib/bemhtml/compiler.js:707:14)
    at Object.generate (/home/rakchaev/job/makeup/bem/node_modules/enb-bemxjst/node_modules/bem-xjst/lib/bemhtml/api.js:16:40)
    at require.declare.process (/home/rakchaev/job/makeup/bem/node_modules/enb-bemxjst/techs/bem-xjst.js:7:28)
    at /home/rakchaev/job/makeup/bem/node_modules/enb-bemxjst/node_modules/sibling/lib/runner.js:22:48

This template body doesn't pass condition utils.isLiteral.
Because negative number is detected as UnaryExpression:

{ type: 'ObjectExpression',
  properties: 
   [ { type: 'Property',
       key: 
        { type: 'Identifier',
          name: 'tabindex',
          loc: { start: [Object], end: [Object] } },
       value: 
        { type: 'UnaryExpression',
          operator: '-',
          argument: { type: 'Literal', value: 1, raw: '1', loc: [Object] },
          prefix: true,
          loc: { start: [Object], end: [Object] } },
       kind: 'init',
       loc: 
        { start: { line: 675, column: 2 },
          end: { line: 675, column: 14 } } } ],
  loc: 
   { start: { line: 674, column: 9 },
     end: { line: 676, column: 2 } } }

But positive number is detected as Literal:

{ type: 'ObjectExpression',
  properties: 
   [ { type: 'Property',
       key: 
        { type: 'Identifier',
          name: 'tabindex',
          loc: { start: [Object], end: [Object] } },
       value: 
        { type: 'Literal',
          value: 1,
          raw: '1',
          loc: { start: [Object], end: [Object] } },
       kind: 'init',
       loc: 
        { start: { line: 675, column: 2 },
          end: { line: 675, column: 13 } } } ],
  loc: 
   { start: { line: 674, column: 9 },
     end: { line: 676, column: 2 } } }

We can use strings for attributes.
But for js and content modes number can be useful.

block('rating').js()({
    rating: -5.5
})
content()({
    block: 'rating',
    rating: -5.5
})

Will look into it very soon.