test/unit/features/directives/for.spec.ts TYPESCRIPT 886 lines View on github.com → Search inside
1import Vue from 'vue'2import { hasSymbol } from 'core/util/env'34describe('Directive v-for', () => {5  it('should render array of primitive values', done => {6    const vm = new Vue({7      template: `8        <div>9          <span v-for="item in list">{{item}}</span>10        </div>11      `,12      data: {13        list: ['a', 'b', 'c']14      }15    }).$mount()16    expect(vm.$el.innerHTML).toBe('<span>a</span><span>b</span><span>c</span>')17    Vue.set(vm.list, 0, 'd')18    waitForUpdate(() => {19      expect(vm.$el.innerHTML).toBe(20        '<span>d</span><span>b</span><span>c</span>'21      )22      vm.list.push('d')23    })24      .then(() => {25        expect(vm.$el.innerHTML).toBe(26          '<span>d</span><span>b</span><span>c</span><span>d</span>'27        )28        vm.list.splice(1, 2)29      })30      .then(() => {31        expect(vm.$el.innerHTML).toBe('<span>d</span><span>d</span>')32        vm.list = ['x', 'y']33      })34      .then(() => {35        expect(vm.$el.innerHTML).toBe('<span>x</span><span>y</span>')36      })37      .then(done)38  })3940  it('should render array of primitive values with index', done => {41    const vm = new Vue({42      template: `43        <div>44          <span v-for="(item, i) in list">{{i}}-{{item}}</span>45        </div>46      `,47      data: {48        list: ['a', 'b', 'c']49      }50    }).$mount()51    expect(vm.$el.innerHTML).toBe(52      '<span>0-a</span><span>1-b</span><span>2-c</span>'53    )54    Vue.set(vm.list, 0, 'd')55    waitForUpdate(() => {56      expect(vm.$el.innerHTML).toBe(57        '<span>0-d</span><span>1-b</span><span>2-c</span>'58      )59      vm.list.push('d')60    })61      .then(() => {62        expect(vm.$el.innerHTML).toBe(63          '<span>0-d</span><span>1-b</span><span>2-c</span><span>3-d</span>'64        )65        vm.list.splice(1, 2)66      })67      .then(() => {68        expect(vm.$el.innerHTML).toBe('<span>0-d</span><span>1-d</span>')69        vm.list = ['x', 'y']70      })71      .then(() => {72        expect(vm.$el.innerHTML).toBe('<span>0-x</span><span>1-y</span>')73      })74      .then(done)75  })7677  it('should render array of object values', done => {78    const vm = new Vue({79      template: `80        <div>81          <span v-for="item in list">{{item.value}}</span>82        </div>83      `,84      data: {85        list: [{ value: 'a' }, { value: 'b' }, { value: 'c' }]86      }87    }).$mount()88    expect(vm.$el.innerHTML).toBe('<span>a</span><span>b</span><span>c</span>')89    Vue.set(vm.list, 0, { value: 'd' })90    waitForUpdate(() => {91      expect(vm.$el.innerHTML).toBe(92        '<span>d</span><span>b</span><span>c</span>'93      )94      vm.list[0].value = 'e'95    })96      .then(() => {97        expect(vm.$el.innerHTML).toBe(98          '<span>e</span><span>b</span><span>c</span>'99        )100        vm.list.push({})101      })102      .then(() => {103        expect(vm.$el.innerHTML).toBe(104          '<span>e</span><span>b</span><span>c</span><span></span>'105        )106        vm.list.splice(1, 2)107      })108      .then(() => {109        expect(vm.$el.innerHTML).toBe('<span>e</span><span></span>')110        vm.list = [{ value: 'x' }, { value: 'y' }]111      })112      .then(() => {113        expect(vm.$el.innerHTML).toBe('<span>x</span><span>y</span>')114      })115      .then(done)116  })117118  it('should render array of object values with index', done => {119    const vm = new Vue({120      template: `121        <div>122          <span v-for="(item, i) in list">{{i}}-{{item.value}}</span>123        </div>124      `,125      data: {126        list: [{ value: 'a' }, { value: 'b' }, { value: 'c' }]127      }128    }).$mount()129    expect(vm.$el.innerHTML).toBe(130      '<span>0-a</span><span>1-b</span><span>2-c</span>'131    )132    Vue.set(vm.list, 0, { value: 'd' })133    waitForUpdate(() => {134      expect(vm.$el.innerHTML).toBe(135        '<span>0-d</span><span>1-b</span><span>2-c</span>'136      )137      vm.list[0].value = 'e'138    })139      .then(() => {140        expect(vm.$el.innerHTML).toBe(141          '<span>0-e</span><span>1-b</span><span>2-c</span>'142        )143        vm.list.push({})144      })145      .then(() => {146        expect(vm.$el.innerHTML).toBe(147          '<span>0-e</span><span>1-b</span><span>2-c</span><span>3-</span>'148        )149        vm.list.splice(1, 2)150      })151      .then(() => {152        expect(vm.$el.innerHTML).toBe('<span>0-e</span><span>1-</span>')153        vm.list = [{ value: 'x' }, { value: 'y' }]154      })155      .then(() => {156        expect(vm.$el.innerHTML).toBe('<span>0-x</span><span>1-y</span>')157      })158      .then(done)159  })160161  if (hasSymbol) {162    it('should render native iterables (Map)', () => {163      const vm = new Vue({164        template: `<div><span v-for="[key, val] in list">{{key}},{{val}}</span></div>`,165        data: {166          list: new Map([167            [1, 'foo'],168            [2, 'bar']169          ])170        }171      }).$mount()172      expect(vm.$el.innerHTML).toBe(`<span>1,foo</span><span>2,bar</span>`)173    })174175    it('should render native iterables (Set)', () => {176      const vm = new Vue({177        template: `<div><span v-for="val in list">{{val}}</span></div>`,178        data: {179          list: new Set([1, 2, 3])180        }181      }).$mount()182      expect(vm.$el.innerHTML).toBe(183        `<span>1</span><span>2</span><span>3</span>`184      )185    })186187    it('should render iterable of primitive values', done => {188      const iterable = {189        models: ['a', 'b', 'c'],190        index: 0,191        [Symbol.iterator]() {192          const iterator = {193            index: 0,194            models: this.models,195            next() {196              if (this.index < this.models.length) {197                return { value: this.models[this.index++] }198              } else {199                return { done: true }200              }201            }202          }203          return iterator204        }205      }206      const vm = new Vue({207        template: `208          <div>209            <span v-for="item in list">{{item}}</span>210          </div>211        `,212        data: {213          list: iterable214        }215      }).$mount()216      expect(vm.$el.innerHTML).toBe(217        '<span>a</span><span>b</span><span>c</span>'218      )219      Vue.set(vm.list.models, 0, 'd')220      waitForUpdate(() => {221        expect(vm.$el.innerHTML).toBe(222          '<span>d</span><span>b</span><span>c</span>'223        )224        vm.list.models.push('d')225      })226        .then(() => {227          expect(vm.$el.innerHTML).toBe(228            '<span>d</span><span>b</span><span>c</span><span>d</span>'229          )230          vm.list.models.splice(1, 2)231        })232        .then(() => {233          expect(vm.$el.innerHTML).toBe('<span>d</span><span>d</span>')234          vm.list.models = ['x', 'y']235        })236        .then(() => {237          expect(vm.$el.innerHTML).toBe('<span>x</span><span>y</span>')238        })239        .then(done)240    })241242    it('should render iterable of primitive values with index', done => {243      const iterable = {244        models: ['a', 'b', 'c'],245        index: 0,246        [Symbol.iterator]() {247          const iterator = {248            index: 0,249            models: this.models,250            next() {251              if (this.index < this.models.length) {252                return { value: this.models[this.index++] }253              } else {254                return { done: true }255              }256            }257          }258          return iterator259        }260      }261262      const vm = new Vue({263        template: `264          <div>265            <span v-for="(item, i) in list">{{i}}-{{item}}</span>266          </div>267        `,268        data: {269          list: iterable270        }271      }).$mount()272      expect(vm.$el.innerHTML).toBe(273        '<span>0-a</span><span>1-b</span><span>2-c</span>'274      )275      Vue.set(vm.list.models, 0, 'd')276      waitForUpdate(() => {277        expect(vm.$el.innerHTML).toBe(278          '<span>0-d</span><span>1-b</span><span>2-c</span>'279        )280        vm.list.models.push('d')281      })282        .then(() => {283          expect(vm.$el.innerHTML).toBe(284            '<span>0-d</span><span>1-b</span><span>2-c</span><span>3-d</span>'285          )286          vm.list.models.splice(1, 2)287        })288        .then(() => {289          expect(vm.$el.innerHTML).toBe('<span>0-d</span><span>1-d</span>')290          vm.list.models = ['x', 'y']291        })292        .then(() => {293          expect(vm.$el.innerHTML).toBe('<span>0-x</span><span>1-y</span>')294        })295        .then(done)296    })297298    it('should render iterable of object values', done => {299      const iterable = {300        models: [{ value: 'a' }, { value: 'b' }, { value: 'c' }],301        index: 0,302        [Symbol.iterator]() {303          const iterator = {304            index: 0,305            models: this.models,306            next() {307              if (this.index < this.models.length) {308                return { value: this.models[this.index++] }309              } else {310                return { done: true }311              }312            }313          }314          return iterator315        }316      }317318      const vm = new Vue({319        template: `320          <div>321            <span v-for="item in list">{{item.value}}</span>322          </div>323        `,324        data: {325          list: iterable326        }327      }).$mount()328      expect(vm.$el.innerHTML).toBe(329        '<span>a</span><span>b</span><span>c</span>'330      )331      Vue.set(vm.list.models, 0, { value: 'd' })332      waitForUpdate(() => {333        expect(vm.$el.innerHTML).toBe(334          '<span>d</span><span>b</span><span>c</span>'335        )336        vm.list.models[0].value = 'e'337      })338        .then(() => {339          expect(vm.$el.innerHTML).toBe(340            '<span>e</span><span>b</span><span>c</span>'341          )342          vm.list.models.push({})343        })344        .then(() => {345          expect(vm.$el.innerHTML).toBe(346            '<span>e</span><span>b</span><span>c</span><span></span>'347          )348          vm.list.models.splice(1, 2)349        })350        .then(() => {351          expect(vm.$el.innerHTML).toBe('<span>e</span><span></span>')352          vm.list.models = [{ value: 'x' }, { value: 'y' }]353        })354        .then(() => {355          expect(vm.$el.innerHTML).toBe('<span>x</span><span>y</span>')356        })357        .then(done)358    })359360    it('should render iterable of object values with index', done => {361      const iterable = {362        models: [{ value: 'a' }, { value: 'b' }, { value: 'c' }],363        index: 0,364        [Symbol.iterator]() {365          const iterator = {366            index: 0,367            models: this.models,368            next() {369              if (this.index < this.models.length) {370                return { value: this.models[this.index++] }371              } else {372                return { done: true }373              }374            }375          }376          return iterator377        }378      }379380      const vm = new Vue({381        template: `382          <div>383            <span v-for="(item, i) in list">{{i}}-{{item.value}}</span>384          </div>385        `,386        data: {387          list: iterable388        }389      }).$mount()390      expect(vm.$el.innerHTML).toBe(391        '<span>0-a</span><span>1-b</span><span>2-c</span>'392      )393      Vue.set(vm.list.models, 0, { value: 'd' })394      waitForUpdate(() => {395        expect(vm.$el.innerHTML).toBe(396          '<span>0-d</span><span>1-b</span><span>2-c</span>'397        )398        vm.list.models[0].value = 'e'399      })400        .then(() => {401          expect(vm.$el.innerHTML).toBe(402            '<span>0-e</span><span>1-b</span><span>2-c</span>'403          )404          vm.list.models.push({})405        })406        .then(() => {407          expect(vm.$el.innerHTML).toBe(408            '<span>0-e</span><span>1-b</span><span>2-c</span><span>3-</span>'409          )410          vm.list.models.splice(1, 2)411        })412        .then(() => {413          expect(vm.$el.innerHTML).toBe('<span>0-e</span><span>1-</span>')414          vm.list.models = [{ value: 'x' }, { value: 'y' }]415        })416        .then(() => {417          expect(vm.$el.innerHTML).toBe('<span>0-x</span><span>1-y</span>')418        })419        .then(done)420    })421  }422423  it('should render an Object', done => {424    const vm = new Vue({425      template: `426        <div>427          <span v-for="val in obj">{{val}}</span>428        </div>429      `,430      data: {431        obj: { a: 0, b: 1, c: 2 }432      }433    }).$mount()434    expect(vm.$el.innerHTML).toBe('<span>0</span><span>1</span><span>2</span>')435    vm.obj.a = 3436    waitForUpdate(() => {437      expect(vm.$el.innerHTML).toBe(438        '<span>3</span><span>1</span><span>2</span>'439      )440      Vue.set(vm.obj, 'd', 4)441    })442      .then(() => {443        expect(vm.$el.innerHTML).toBe(444          '<span>3</span><span>1</span><span>2</span><span>4</span>'445        )446        Vue.delete(vm.obj, 'a')447      })448      .then(() => {449        expect(vm.$el.innerHTML).toBe(450          '<span>1</span><span>2</span><span>4</span>'451        )452      })453      .then(done)454  })455456  it('should render an Object with key', done => {457    const vm = new Vue({458      template: `459        <div>460          <span v-for="(val, key) in obj">{{val}}-{{key}}</span>461        </div>462      `,463      data: {464        obj: { a: 0, b: 1, c: 2 }465      }466    }).$mount()467    expect(vm.$el.innerHTML).toBe(468      '<span>0-a</span><span>1-b</span><span>2-c</span>'469    )470    vm.obj.a = 3471    waitForUpdate(() => {472      expect(vm.$el.innerHTML).toBe(473        '<span>3-a</span><span>1-b</span><span>2-c</span>'474      )475      Vue.set(vm.obj, 'd', 4)476    })477      .then(() => {478        expect(vm.$el.innerHTML).toBe(479          '<span>3-a</span><span>1-b</span><span>2-c</span><span>4-d</span>'480        )481        Vue.delete(vm.obj, 'a')482      })483      .then(() => {484        expect(vm.$el.innerHTML).toBe(485          '<span>1-b</span><span>2-c</span><span>4-d</span>'486        )487      })488      .then(done)489  })490491  it('should render an Object with key and index', done => {492    const vm = new Vue({493      template: `494        <div>495          <span v-for="(val, key, i) in obj">{{val}}-{{key}}-{{i}}</span>496        </div>497      `,498      data: {499        obj: { a: 0, b: 1, c: 2 }500      }501    }).$mount()502    expect(vm.$el.innerHTML).toBe(503      '<span>0-a-0</span><span>1-b-1</span><span>2-c-2</span>'504    )505    vm.obj.a = 3506    waitForUpdate(() => {507      expect(vm.$el.innerHTML).toBe(508        '<span>3-a-0</span><span>1-b-1</span><span>2-c-2</span>'509      )510      Vue.set(vm.obj, 'd', 4)511    })512      .then(() => {513        expect(vm.$el.innerHTML).toBe(514          '<span>3-a-0</span><span>1-b-1</span><span>2-c-2</span><span>4-d-3</span>'515        )516        Vue.delete(vm.obj, 'a')517      })518      .then(() => {519        expect(vm.$el.innerHTML).toBe(520          '<span>1-b-0</span><span>2-c-1</span><span>4-d-2</span>'521        )522      })523      .then(done)524  })525526  it('should render each key of data', done => {527    const vm = new Vue({528      template: `529        <div>530          <span v-for="(val, key) in $data">{{val}}-{{key}}</span>531        </div>532      `,533      data: { a: 0, b: 1, c: 2 }534    }).$mount()535    expect(vm.$el.innerHTML).toBe(536      '<span>0-a</span><span>1-b</span><span>2-c</span>'537    )538    vm.a = 3539    waitForUpdate(() => {540      expect(vm.$el.innerHTML).toBe(541        '<span>3-a</span><span>1-b</span><span>2-c</span>'542      )543    }).then(done)544  })545546  it('check priorities: v-if before v-for', function () {547    const vm = new Vue({548      data: {549        items: [1, 2, 3]550      },551      template:552        '<div><div v-if="item < 3" v-for="item in items">{{item}}</div></div>'553    }).$mount()554    expect(vm.$el.textContent).toBe('12')555  })556557  it('check priorities: v-if after v-for', function () {558    const vm = new Vue({559      data: {560        items: [1, 2, 3]561      },562      template:563        '<div><div v-for="item in items" v-if="item < 3">{{item}}</div></div>'564    }).$mount()565    expect(vm.$el.textContent).toBe('12')566  })567568  it('range v-for', () => {569    const vm = new Vue({570      template: '<div><div v-for="n in 3">{{n}}</div></div>'571    }).$mount()572    expect(vm.$el.textContent).toBe('123')573  })574575  it('without key', done => {576    const vm = new Vue({577      data: {578        items: [579          { id: 1, msg: 'a' },580          { id: 2, msg: 'b' },581          { id: 3, msg: 'c' }582        ]583      },584      template: '<div><div v-for="item in items">{{ item.msg }}</div></div>'585    }).$mount()586    expect(vm.$el.textContent).toBe('abc')587    const first = vm.$el.children[0]588    vm.items.reverse()589    waitForUpdate(() => {590      expect(vm.$el.textContent).toBe('cba')591      // assert reusing DOM element in place592      expect(vm.$el.children[0]).toBe(first)593    }).then(done)594  })595596  it('with key', done => {597    const vm = new Vue({598      data: {599        items: [600          { id: 1, msg: 'a' },601          { id: 2, msg: 'b' },602          { id: 3, msg: 'c' }603        ]604      },605      template:606        '<div><div v-for="item in items" :key="item.id">{{ item.msg }}</div></div>'607    }).$mount()608    expect(vm.$el.textContent).toBe('abc')609    const first = vm.$el.children[0]610    vm.items.reverse()611    waitForUpdate(() => {612      expect(vm.$el.textContent).toBe('cba')613      // assert moving DOM element614      expect(vm.$el.children[0]).not.toBe(first)615      expect(vm.$el.children[2]).toBe(first)616    }).then(done)617  })618619  it('nested loops', () => {620    const vm = new Vue({621      data: {622        items: [623          { items: [{ a: 1 }, { a: 2 }], a: 1 },624          { items: [{ a: 3 }, { a: 4 }], a: 2 }625        ]626      },627      template:628        '<div>' +629        '<div v-for="(item, i) in items">' +630        '<p v-for="(subItem, j) in item.items">{{j}} {{subItem.a}} {{i}} {{item.a}}</p>' +631        '</div>' +632        '</div>'633    }).$mount()634    expect(vm.$el.innerHTML).toBe(635      '<div><p>0 1 0 1</p><p>1 2 0 1</p></div>' +636        '<div><p>0 3 1 2</p><p>1 4 1 2</p></div>'637    )638  })639640  it('template v-for', done => {641    const vm = new Vue({642      data: {643        list: [{ a: 1 }, { a: 2 }, { a: 3 }]644      },645      template:646        '<div>' +647        '<template v-for="item in list">' +648        '<p>{{item.a}}</p>' +649        '<p>{{item.a + 1}}</p>' +650        '</template>' +651        '</div>'652    }).$mount()653    assertMarkup()654    vm.list.reverse()655    waitForUpdate(() => {656      assertMarkup()657      vm.list.splice(1, 1)658    })659      .then(() => {660        assertMarkup()661        vm.list.splice(1, 0, { a: 2 })662      })663      .then(done)664665    function assertMarkup() {666      const markup = vm.list667        .map(function (item) {668          return '<p>' + item.a + '</p><p>' + (item.a + 1) + '</p>'669        })670        .join('')671      expect(vm.$el.innerHTML).toBe(markup)672    }673  })674675  it('component v-for', done => {676    const vm = new Vue({677      data: {678        list: [{ a: 1 }, { a: 2 }, { a: 3 }]679      },680      template:681        '<div>' +682        '<test v-for="item in list" :msg="item.a" :key="item.a">' +683        '<span>{{item.a}}</span>' +684        '</test>' +685        '</div>',686      components: {687        test: {688          props: ['msg'],689          template: '<p>{{msg}}<slot></slot></p>'690        }691      }692    }).$mount()693    assertMarkup()694    vm.list.reverse()695    waitForUpdate(() => {696      assertMarkup()697      vm.list.splice(1, 1)698    })699      .then(() => {700        assertMarkup()701        vm.list.splice(1, 0, { a: 2 })702      })703      .then(done)704705    function assertMarkup() {706      const markup = vm.list707        .map(function (item) {708          return `<p>${item.a}<span>${item.a}</span></p>`709        })710        .join('')711      expect(vm.$el.innerHTML).toBe(markup)712    }713  })714715  it('dynamic component v-for', done => {716    const vm = new Vue({717      data: {718        list: [{ type: 'one' }, { type: 'two' }]719      },720      template:721        '<div>' +722        '<component v-for="item in list" :key="item.type" :is="item.type"></component>' +723        '</div>',724      components: {725        one: {726          template: '<p>One!</p>'727        },728        two: {729          template: '<div>Two!</div>'730        }731      }732    }).$mount()733    expect(vm.$el.innerHTML).toContain('<p>One!</p><div>Two!</div>')734    vm.list.reverse()735    waitForUpdate(() => {736      expect(vm.$el.innerHTML).toContain('<div>Two!</div><p>One!</p>')737    }).then(done)738  })739740  it('should warn component v-for without keys', () => {741    new Vue({742      template: `<div><test v-for="i in 3"></test></div>`,743      components: {744        test: {745          render() {}746        }747      }748    }).$mount()749    expect(750      `<test v-for="i in 3">: component lists rendered with v-for should have explicit keys`751    ).toHaveBeenTipped()752  })753754  it('multi nested array reactivity', done => {755    const vm = new Vue({756      data: {757        list: [[['foo']]]758      },759      template: `760        <div>761          <div v-for="i in list">762            <div v-for="j in i">763              <div v-for="k in j">764                {{ k }}765              </div>766            </div>767          </div>768        </div>769      `770    }).$mount()771    expect(vm.$el.textContent).toMatch(/\s+foo\s+/)772    vm.list[0][0].push('bar')773    waitForUpdate(() => {774      expect(vm.$el.textContent).toMatch(/\s+foo\s+bar\s+/)775    }).then(done)776  })777778  it('should work with strings', done => {779    const vm = new Vue({780      data: {781        text: 'foo'782      },783      template: `784        <div>785          <span v-for="letter in text">{{ letter }}.</span>786        </div>787      `788    }).$mount()789    expect(vm.$el.textContent).toMatch('f.o.o.')790    vm.text += 'bar'791    waitForUpdate(() => {792      expect(vm.$el.textContent).toMatch('f.o.o.b.a.r.')793    }).then(done)794  })795796  // #7792797  it('should work with multiline expressions', () => {798    const vm = new Vue({799      data: {800        a: [1],801        b: [2]802      },803      template: `804        <div>805          <span v-for="n in (806            a.concat(807              b808            )809          )">{{ n }}</span>810        </div>811      `812    }).$mount()813    expect(vm.$el.textContent).toBe('12')814  })815816  // #9181817  it('components with v-for and empty list', done => {818    const vm = new Vue({819      template:820        '<div attr>' +821        '<foo v-for="item in list" :key="item">{{ item }}</foo>' +822        '</div>',823      data: {824        list: undefined825      },826      components: {827        foo: {828          template: '<div><slot></slot></div>'829        }830      }831    }).$mount()832    expect(vm.$el.innerHTML).toBe('')833    vm.list = [1, 2, 3]834    waitForUpdate(() => {835      expect(vm.$el.innerHTML).toBe('<div>1</div><div>2</div><div>3</div>')836    }).then(done)837  })838839  it('elements with v-for and empty list', done => {840    const vm = new Vue({841      template:842        '<div attr>' + '<div v-for="item in list">{{ item }}</div>' + '</div>',843      data: {844        list: undefined845      }846    }).$mount()847    expect(vm.$el.innerHTML).toBe('')848    vm.list = [1, 2, 3]849    waitForUpdate(() => {850      expect(vm.$el.innerHTML).toBe('<div>1</div><div>2</div><div>3</div>')851    }).then(done)852  })853854  const supportsDestructuring = (() => {855    try {856      new Function('var { foo } = bar')857      return true858    } catch (e) {}859  })()860861  if (supportsDestructuring) {862    it('should support destructuring syntax in alias position (object)', () => {863      const vm = new Vue({864        data: { list: [{ foo: 'hi', bar: 'ho' }] },865        template:866          '<div><div v-for="({ foo, bar }, i) in list">{{ foo }} {{ bar }} {{ i }}</div></div>'867      }).$mount()868      expect(vm.$el.textContent).toBe('hi ho 0')869    })870871    it('should support destructuring syntax in alias position (array)', () => {872      const vm = new Vue({873        data: {874          list: [875            [1, 2],876            [3, 4]877          ]878        },879        template:880          '<div><div v-for="([ foo, bar ], i) in list">{{ foo }} {{ bar }} {{ i }}</div></div>'881      }).$mount()882      expect(vm.$el.textContent).toBe('1 2 03 4 1')883    })884  }885})

Findings

✓ No findings reported for this file.

Get this view in your editor

Same data, no extra tab — call code_get_file + code_get_findings over MCP from Claude/Cursor/Copilot.