const compiler = require('../lib')
function assertCodegen (template, templateCode, renderCode = 'with(this){}', options = {}) {
const res = compiler.compile(template, {
resourcePath: 'test.wxml',
mp: Object.assign({
minified: true,
isTest: true,
platform: 'mp-weixin'
}, options)
})
expect(res.template).toBe(templateCode)
if (typeof renderCode === 'function') {
renderCode(res)
} else {
expect(res.render).toBe(renderCode)
}
}
describe('mp:compiler-mp-weixin', () => {
it('generate class', () => {
assertCodegen(
'hello world',
'hello world'
)
})
it('generate scoped slot', () => {
assertCodegen(
'{{ bar.foo }}',
'',
function (res) {
expect(res.generic[0]).toBe('test-foo-default')
}
)
assertCodegen(
'{{ bar.foo }}',
'',
function (res) {
expect(res.generic[0]).toBe('test-foo-default')
}
)
assertCodegen(
'日期',
'',
function (res) {
expect(res.generic[0]).toBe('test-uni-clientdb-default')
const wxmlKey = Object.keys(res.files)[0]
expect(res.files[wxmlKey]).toBe(
'日期'
)
}
)
})
it('generate string express with escape quote', () => {
assertCodegen(
'',
'',
'with(this){var a0=text+"\'";$mp.data=Object.assign({},{$root:{a0:a0}})}'
)
assertCodegen(
/* eslint-disable no-template-curly-in-string */
'',
'',
/* eslint-disable no-template-curly-in-string */
'with(this){var a0=`${text}\'`;$mp.data=Object.assign({},{$root:{a0:a0}})}'
)
assertCodegen(
'{{text+\'\\\'\'}}',
'{{$root.t0}}',
'with(this){var t0=text+"\'";$mp.data=Object.assign({},{$root:{t0:t0}})}'
)
assertCodegen(
/* eslint-disable no-template-curly-in-string */
'{{`${text}\'`}}',
'{{$root.t0}}',
/* eslint-disable no-template-curly-in-string */
'with(this){var t0=`${text}\'`;$mp.data=Object.assign({},{$root:{t0:t0}})}'
)
assertCodegen(
/* eslint-disable no-template-curly-in-string */
'{{`${text}"`}}',
'{{text+\'"\'}}'
)
assertCodegen(
'{{text+"\\""}}',
'{{$root.t0}}',
'with(this){var t0=text+"\\"";$mp.data=Object.assign({},{$root:{t0:t0}})}'
)
})
it('generate named scoped slot', () => {
assertCodegen(
'{{ bar.foo }}',
'',
function (res) {
expect(res.generic[0]).toBe('test-foo-foo')
}
)
assertCodegen(
'{{ bar.foo }}',
'',
function (res) {
expect(res.generic[0]).toBe('test-foo-foo')
}
)
})
it('generate scoped slot with multiline v-if', () => {
assertCodegen(
'{{ bar.foo }}',
'',
function (res) {
expect(res.generic[0]).toBe('test-foo-default')
}
)
assertCodegen(
'{{ bar.foo }}',
'',
function (res) {
expect(res.generic[0]).toBe('test-foo-foo')
}
)
})
it('generate scoped slot with scopedSlotsCompiler: auto', () => {
assertCodegen(
'{{item}}',
'',
'with(this){}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'{{item}}{{title}}',
'{{$root.m1[\'item\']+title}}',
'with(this){var m0=$hasSSP("551070e6-1");var m1=m0?$getSSP("551070e6-1","default"):null;$mp.data=Object.assign({},{$root:{m0:m0,m1:m1}})}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'{{item}}',
'',
'with(this){}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'{{getValue(item)}}',
'{{$root.m1}}',
'with(this){var m0=$hasSSP("551070e6-1");var m1=m0?getValue($getSSP("551070e6-1","default")["item"]):null;$mp.data=Object.assign({},{$root:{m0:m0,m1:m1}})}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'{{getValue(item.text)}}',
'{{$root.m1}}',
'with(this){var m0=$hasSSP("551070e6-1");var m1=m0?getValue($getSSP("551070e6-1","default").text):null;$mp.data=Object.assign({},{$root:{m0:m0,m1:m1}})}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();if($scope.data.scopedSlotsCompiler==="augmented"){$setSSP("default",{"item":item})}$callSSP()}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();var l0=__map(list,function(item,index){var $orig=__get_orig(item);if($scope.data.scopedSlotsCompiler==="augmented"){$setSSP("default",{"item":$orig})}return{$orig:$orig}});$mp.data=Object.assign({},{$root:{l0:l0}});$callSSP()}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();var l0=__map(list,function(item,index){var $orig=__get_orig(item);if($scope.data.scopedSlotsCompiler==="augmented"){$setSSP("default",{"item":$orig,"test":test})}return{$orig:$orig}});$mp.data=Object.assign({},{$root:{l0:l0}});$callSSP()}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();var m0=test();var l0=__map(list,function(item,index){var $orig=__get_orig(item);if($scope.data.scopedSlotsCompiler==="augmented"){$setSSP("default",{"item":$orig,"test":m0})}return{$orig:$orig}});$mp.data=Object.assign({},{$root:{m0:m0,l0:l0}});$callSSP()}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();var m0=test();var l0=__map(list,function(item,index){var $orig=__get_orig(item);if($scope.data.scopedSlotsCompiler==="augmented"){$setSSP("default",{"item":$orig,"test":m0+$orig})}return{$orig:$orig}});$mp.data=Object.assign({},{$root:{m0:m0,l0:l0}});$callSSP()}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();var m0=getValue(item);$mp.data=Object.assign({},{$root:{m0:m0}});if($scope.data.scopedSlotsCompiler==="augmented"){$setSSP("default",{"item":m0})}$callSSP()}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();if($scope.data.scopedSlotsCompiler==="augmented"){$setSSP("default",object)}$callSSP()}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'{{item}}',
'{{$root.m1[\'item\']}}',
'with(this){var m0=$hasSSP("551070e6-1");var m1=m0?$getSSP("551070e6-1",name):null;$mp.data=Object.assign({},{$root:{m0:m0,m1:m1}})}',
{
scopedSlotsCompiler: 'auto'
}
)
})
it('generate scoped slot with scopedSlotsCompiler: augmented', () => {
assertCodegen(
'{{getValue(item)}}',
'{{$root.m1}}',
'with(this){var m0=$hasSSP("551070e6-1");var m1=m0?getValue($getSSP("551070e6-1","default")["item"]):null;$mp.data=Object.assign({},{$root:{m0:m0,m1:m1}})}',
{
scopedSlotsCompiler: 'augmented'
}
)
assertCodegen(
'{{item}}',
'{{$root.m1[\'item\']}}',
'with(this){var m0=$hasSSP("551070e6-1");var m1=m0?$getSSP("551070e6-1","default"):null;$mp.data=Object.assign({},{$root:{m0:m0,m1:m1}})}',
{
scopedSlotsCompiler: 'augmented'
}
)
assertCodegen(
'{{getValue(item.text)}}',
'{{$root.m1}}',
'with(this){var m0=$hasSSP("551070e6-1");var m1=m0?getValue($getSSP("551070e6-1","default").text):null;$mp.data=Object.assign({},{$root:{m0:m0,m1:m1}})}',
{
scopedSlotsCompiler: 'augmented'
}
)
assertCodegen(
'{{getValue(item)}}',
'{{$root.m1}}',
'with(this){var m0=$hasSSP("551070e6-2");var m1=m0?getValue($getSSP("551070e6-2","default")["item"]):null;$mp.data=Object.assign({},{$root:{m0:m0,m1:m1}})}',
{
scopedSlotsCompiler: 'augmented'
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();{$setSSP("default",{"item":item})}$callSSP()}',
{
scopedSlotsCompiler: 'augmented'
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();{$setSSP("default",{"item":getValue(item)})}$callSSP()}',
{
scopedSlotsCompiler: 'augmented'
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();{$setSSP("default",object)}$callSSP()}',
{
scopedSlotsCompiler: 'augmented'
}
)
assertCodegen(
'{{item}}{{item}}',
'{{$root.m1[\'item\']}}{{$root.m3[\'item\']}}',
'with(this){var m0=$hasSSP("551070e6-1");var m1=m0?$getSSP("551070e6-1","default"):null;var m2=$hasSSP("551070e6-2");var m3=m2?$getSSP("551070e6-2","default"):null;$mp.data=Object.assign({},{$root:{m0:m0,m1:m1,m2:m2,m3:m3}})}',
{
scopedSlotsCompiler: 'augmented'
}
)
assertCodegen(
'{{item}}',
'{{item2.m1[\'item\']}}',
'with(this){var l1=test?__map(array1,function(item1,index1){var $orig=__get_orig(item1);var m0=$hasSSP("551070e6-1");var l0=m0?__map(array,function(item2,index2){var $orig=__get_orig(item2);var m1=$getSSP("551070e6-1","name");return{$orig:$orig,m1:m1}}):null;return{$orig:$orig,m0:m0,l0:l0}}):null;$mp.data=Object.assign({},{$root:{l1:l1}})}',
{
scopedSlotsCompiler: 'augmented'
}
)
})
it('generate scoped slot with slotMultipleInstance', () => {
assertCodegen(
'{{item}}',
'{{_item[\'item\']}}',
'with(this){var m0=$hasSSP("551070e6-1");var l0=m0?$getSSP("551070e6-1","default",true):null;$mp.data=Object.assign({},{$root:{m0:m0,l0:l0}})}',
{
scopedSlotsCompiler: 'augmented',
slotMultipleInstance: true
}
)
assertCodegen(
'{{item}}',
'{{_item}}',
'with(this){var m0=$hasSSP("551070e6-1");var l0=m0?$getSSP("551070e6-1","default",true):null;$mp.data=Object.assign({},{$root:{m0:m0,l0:l0}})}',
{
scopedSlotsCompiler: 'augmented',
slotMultipleInstance: true
}
)
assertCodegen(
'{{item.text}}',
'{{_item.text}}',
'with(this){var m0=$hasSSP("551070e6-1");var l0=m0?$getSSP("551070e6-1","default",true):null;$mp.data=Object.assign({},{$root:{m0:m0,l0:l0}})}',
{
scopedSlotsCompiler: 'augmented',
slotMultipleInstance: true
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();var m0=$setSSP("default",{"item":item});$mp.data=Object.assign({},{$root:{m0:m0}});$callSSP()}',
{
scopedSlotsCompiler: 'augmented',
slotMultipleInstance: true
}
)
assertCodegen(
'',
'',
'with(this){$initSSP();var m0=$setSSP("default",item);$mp.data=Object.assign({},{$root:{m0:m0}});$callSSP()}',
{
scopedSlotsCompiler: 'augmented',
slotMultipleInstance: true
}
)
})
it('generate scoped slot', () => {
assertCodegen(
'',
'',
function (res) {
expect(res.componentGenerics['scoped-slots-default']).toBe(true)
}
)
assertCodegen( // TODO vue-id
'{{ user.lastName }}',
'',
function (res) {
expect(res.componentGenerics['scoped-slots-default']).toBe(true)
}
)
assertCodegen(
'{{ user.lastName }}',
'',
function (res) {
expect(res.componentGenerics['scoped-slots-header']).toBe(true)
}
)
})
it('generate page-meta', () => {
assertCodegen( // TODO vue-id
'',
''
)
})
it('generate v-slot', () => {
assertCodegen(
`
{{label}}
{{label}}
{{label}}
{{label}}
`,
''
)
})
it('generate ObjectExpression', () => {
assertCodegen(
'{{item}}',
'{{item}}'
)
assertCodegen(
'',
''
)
assertCodegen('',
'')
assertCodegen('',
'',
'with(this){var a0={"x":0};$mp.data=Object.assign({},{$root:{a0:a0}})}')
assertCodegen(
'', '',
'with(this){var a0={x:{x:0}};$mp.data=Object.assign({},{$root:{a0:a0}})}'
)
})
it('generate v-show directive', () => {
assertCodegen(
'hello world',
'hello world'
)
})
it('template with array length', () => {
assertCodegen(
'{{array.length}}',
'{{$root.g0}}',
'with(this){var g0=array.length;$mp.data=Object.assign({},{$root:{g0:g0}})}'
)
assertCodegen(
'{{array[\'length\']}}',
'{{$root.g0}}',
'with(this){var g0=array["length"];$mp.data=Object.assign({},{$root:{g0:g0}})}'
)
assertCodegen(
'',
'',
'with(this){var g0=array.length;$mp.data=Object.assign({},{$root:{g0:g0}})}'
)
assertCodegen(
'',
'',
'with(this){var g0=array.test&&test(array.test.test).length===0;$mp.data=Object.assign({},{$root:{g0:g0}})}'
)
assertCodegen(
'hello world',
'hello world',
'with(this){var g0=array.length;$mp.data=Object.assign({},{$root:{g0:g0}})}'
)
assertCodegen(
'hello world',
'hello world',
'with(this){var g0=array.length;$mp.data=Object.assign({},{$root:{g0:g0}})}'
)
assertCodegen(
'hello',
'hello',
'with(this){var g0=array.length;$mp.data=Object.assign({},{$root:{g0:g0}})}'
)
assertCodegen(
'hello',
'hello',
'with(this){var g0=array&&array.length;$mp.data=Object.assign({},{$root:{g0:g0}})}'
)
assertCodegen(
'hello',
'hello',
'with(this){var g0=test1&&!test2&&array&&array.length;$mp.data=Object.assign({},{$root:{g0:g0}})}'
)
assertCodegen(
'hello',
'hello',
'with(this){var g0=array.length;$mp.data=Object.assign({},{$root:{g0:g0}})}'
)
assertCodegen(
'{{getValue(item)}}',
'{{item.m0}}',
'with(this){var l0=__map(list,function(item,index){var $orig=__get_orig(item);var g0=item.length;var m0=g0?getValue(item):null;return{$orig:$orig,g0:g0,m0:m0}});$mp.data=Object.assign({},{$root:{l0:l0}})}'
)
assertCodegen(
'{{test(item.list)}}',
'{{item.m0}}',
'with(this){var l0=__map(list,function(item,index){var $orig=__get_orig(item);var g0=Object.values(item.list).length;var m0=g0?test(item.list):null;return{$orig:$orig,g0:g0,m0:m0}});$mp.data=Object.assign({},{$root:{l0:l0}})}'
)
assertCodegen(
'{{item.length}}',
'{{$root.g0}}',
'with(this){var m0=$hasSSP("551070e6-1");var g0=m0?$getSSP("551070e6-1","default")["item"].length:null;$mp.data=Object.assign({},{$root:{m0:m0,g0:g0}})}',
{
scopedSlotsCompiler: 'auto'
}
)
assertCodegen(
'{{item.length}}',
'',
undefined,
{
scopedSlotsCompiler: 'legacy'
}
)
})
it('skyline gesture', () => {
assertCodegen(
'',
''
)
})
})