Vue 2 to 3 migration working group

<!-- Please complete the template below as best as you can. Make sure to check if this issue has already been raised by someone else first to avoid duplication. 

For each section below, please add screenshots or links or anything that may help visual learners understand the problem better, even if this takes you an extra minute or two this is a great help to some folks.

https://www.learning-styles-online.com/style/visual-spatial/

-->

### Problem
- [Vue3 breaking changes](https://v3-migration.vuejs.org/breaking-changes/)
- [Output of ESLint Vue3-essentials run](https://gitlab.com/gitlab-org/customers-gitlab-com/-/merge_requests/6878) 

### Proposal

<!-- Consult with `@gitlab-com/business-technology/enterprise-apps/zuora-architects` on the ~"Enterprise Applications" team if Zuora business logic is involved. -->

### Result

### Next steps (if any)

### How will we measure success?

### Implementation Options
- Investigate [Vue CodeMod](https://github.com/vuejs/vue-codemod)
- Investigate other codemod frameworks (ex: https://github.com/facebook/jscodeshift)

### @Vue/Compat Changes
Lets us maintain compatibility between Vue2 and Vue3. Example [GitLab epic](https://gitlab.com/groups/gitlab-org/-/epics/9013).
- [ ] Allow option for Jest tests to run with compat 
  - [Gitlab UI MR](https://gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/3087/diffs#881d5d47bdc17ef8facebef59b68b5fc099a0293_2_10) , [issue](https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1984)
  - Can be introduced before test fixes so that infrastructure is in place when ready to swap over

### Test Improvements (from https://gitlab.com/groups/gitlab-org/-/epics/5102#plan)

* [x] [Upgrade @vue/test-utils to 1.x version](https://gitlab.com/groups/gitlab-org/-/epics/4255)
  * **Why?** Our current version is more than one year old. It has multiple annoying bugs fixed in current version. Additionally new version contains significant deprecations (which leads to higher quality tests) and important runtime validations (for example, operating on destroyed wrappers will throw warnings)
  * **How?** Fix failing tests and VTU itself
* [x] [Act on each kind of deprecations in @vue/test-utils 1.x](https://gitlab.com/groups/gitlab-org/-/epics/3856)
  * **Why?** Each deprecation is road blocker for upgrade to Vue3. Most of deprecations are bad code smells
  * **How?** See relevant epic for details. Some of deprecations are just "find & replace" things, some (like usage of `methods` and `setMethods`) requires significant specs refactoring
* [ ] Cleanup codebase based on new VTU features (epic TBD)
  * **Why?** Improve and simplify our test suite. Get rid of that `nextTick`!
  * **How?** Search and destroy. Some of these things could be done with codemod
  - [ ] Remove excessive `nextTick` calls. `trigger`, `setProps`, etc. now return `nextTick` inside, so they could be just awaited
  - [ ] Remove useless stubs. VTU now renders all slots by default, so some stubs could be removed
* [ ] Remove `localVue` usage - [Issue](https://gitlab.com/gitlab-org/customers-gitlab-com/-/issues/6058)
  * **Why?** `localVue` is one of the most confusing feature in `@vue/test-utils` and [we do not need it at all](https://gitlab.com/gitlab-org/gitlab/-/issues/220482)
  * **How?** 95% of this action could be done via code mod + [we have MR pending with fix](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47729)
* [x] [Convert remaining tests from our legacy `mountComponent` / `mountComponentWithStore` helpers to `@vue/test-utils`](https://gitlab.com/groups/gitlab-org/-/epics/5110)
  * **Why?** `@vue/test-utils` is official supported way of testing components
  * **How?** Rewrite each test manually :cry: 
* [ ] [Clean unnecessary 'Vue.extend' uses in Jest tests](https://gitlab.com/groups/gitlab-org/-/epics/2418)
  * **Why?** It is simply not needed and adds additional complexity and slowness to our test suite
  * **How?** Most of these could be removed with codemod
* [x] Unify our `nextTick` usage
  * **Why?** See [RFC](https://gitlab.com/gitlab-org/frontend/rfcs/-/issues/47) for rationale
  * **How?** Most of these could be done with codemod
* [ ] Switch to `async` / `await`
  * **Why?** See excellent [RFC by @rkuba](https://gitlab.com/gitlab-org/frontend/rfcs/-/issues/45) for details 
  * **How?** Some of these could be implemented with codemod
* [ ] [Remove direct modification of Vue instances](https://gitlab.com/groups/gitlab-org/-/epics/5105)
  * **Why?** Modifying internal instance state makes test fragile and leaks implementation details to the test
  * **How?** Each case should be approached individually :cry: 
* [ ] [Remove spying on Vue components methods](https://gitlab.com/groups/gitlab-org/-/epics/5106)
  * **Why?** Modifying internal instance behavior decreases test value and leaks implementation details to the test
  * **How?** Each case should be approached individually :cry:
* [ ] Implement eslint rules to prevent most annoying issues
  * **Why?** Everything what could be automated should be automated
  * [ ] https://gitlab.com/gitlab-org/frontend/eslint-plugin/-/issues/12
  * [x] [mountHelper](https://gitlab.com/gitlab-org/frontend/eslint-plugin/-/issues/9)
* [ ] Update docs to reflect recent changes
* [x] [Simplify our tests with `enableAutoDestroy`](https://gitlab.com/groups/gitlab-org/-/epics/8915)
  * **Why?** teardown of wrappers happens in each test we use. We could automate it with new VTU feature
  * **How?** [GitLab implementation](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/100389/diffs#2ac2280da424b755cb0a2f4e999a182bd6fed132_15_16)
  * [ESLint rule](https://gitlab.com/gitlab-org/frontend/eslint-plugin/-/merge_requests/99/diffs) was introduced in GL
* [ ] Get rid of old callback style tests, replace it with promise-based
* [ ] [Get rid of `setData` calls and `data()` as mount option in Vue testing suite](https://gitlab.com/groups/gitlab-org/-/epics/7330)

Story points: 2.0