Repository: vuejs/eslint-plugin-vue
Pull request #1301 (2020-09-17 00:52:47)

Update documents
This PR will updates the documentation in preparation for the v7 release.



Patch:
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 94800468..cc2e88ff 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -3,6 +3,13 @@ name: Bug report
 about: Create a report to help us improve
 ---
 
+<!--
+  ❗Please don't ignore this template.❗
+
+  If you ignore it, we're just going to respond asking you to fill it out, which wastes everyone's time.
+  The more relevant information you can include, the faster we can find the issue and fix it without asking you for more info.
+-->
+
 <!--
   Before posting the issue, please confirm that the problem you're getting
   is not related with your code editor configuration.
@@ -11,7 +18,9 @@ about: Create a report to help us improve
 
 **Checklist**
 
-- [ ] I checked the [FAQ](https://eslint.vuejs.org/user-guide/#faq).
+- [ ] I have tried restarting my IDE and the issue persists.
+- [ ] I have read the [FAQ](https://eslint.vuejs.org/user-guide/#faq) and my problem is not listed.
+<!-- If you do not read the FAQ and open an issue that is listed in the FAQ, we may silently close the issue. -->
 
 **Tell us about your environment**
 
@@ -22,7 +31,7 @@ about: Create a report to help us improve
 
 **Please show your full configuration:**
 <!-- Paste content of your .eslintrc file -->
-```json
+```json5
 
 ```
 
diff --git a/README.md b/README.md
index 52fb216e..c34728c4 100644
--- a/README.md
+++ b/README.md
@@ -11,14 +11,6 @@
 
 See [the official website](https://eslint.vuejs.org).
 
-> :exclamation: Attention - this is documentation for version `7.x` :exclamation:
->
-> This branch contains `eslint-plugin-vue@next` which is a pre-released `7.0`, but it's not the default version that you get with `npm install eslint-plugin-vue`. In order to install this you need to specify either `"eslint-plugin-vue": "next"` in `package.json` or do `npm install eslint-plugin-vue@next`.
->
-> Please try it and report any issues that you might have encountered.
->
-> If you want to check previous releases [go here](https://github.com/vuejs/eslint-plugin-vue/releases).
-
 ## :anchor: Versioning Policy
 
 This plugin is following [Semantic Versioning](https://semver.org/) and [ESLint's Semantic Versioning Policy](https://github.com/eslint/eslint#semantic-versioning-policy).
diff --git a/docs/.vuepress/components/eslint-code-block.vue b/docs/.vuepress/components/eslint-code-block.vue
index 391ae549..46504375 100644
--- a/docs/.vuepress/components/eslint-code-block.vue
+++ b/docs/.vuepress/components/eslint-code-block.vue
@@ -62,6 +62,7 @@ export default {
     config() {
       return {
         globals: {
+          console: false,
           // ES2015 globals
           ArrayBuffer: false,
           DataView: false,
@@ -121,8 +122,13 @@ export default {
 
   async mounted() {
     // Load linter.
-    const [{ default: Linter }, { parseForESLint }] = await Promise.all([
+    const [
+      { default: Linter },
+      { default: noUndefRule },
+      { parseForESLint }
+    ] = await Promise.all([
       import('eslint4b/dist/linter'),
+      import('eslint/lib/rules/no-undef'),
       import('espree').then(() => import('vue-eslint-parser'))
     ])
 
@@ -131,6 +137,7 @@ export default {
     for (const ruleId of Object.keys(rules)) {
       linter.defineRule(`vue/${ruleId}`, rules[ruleId])
     }
+    linter.defineRule('no-undef', noUndefRule)
 
     linter.defineParser('vue-eslint-parser', { parseForESLint })
   }
diff --git a/docs/.vuepress/theme/index.js b/docs/.vuepress/theme/index.js
deleted file mode 100644
index b91b8a57..00000000
--- a/docs/.vuepress/theme/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  extend: '@vuepress/theme-default'
-}
diff --git a/docs/.vuepress/theme/layouts/Layout.vue b/docs/.vuepress/theme/layouts/Layout.vue
deleted file mode 100644
index 43b5ad68..00000000
--- a/docs/.vuepress/theme/layouts/Layout.vue
+++ /dev/null
@@ -1,77 +0,0 @@
-<template>
-  <BaseLayout v-bind="$attrs" v-on="$listeners">
-    <slot name="sidebar-top" slot="sidebar-top" />
-    <slot name="sidebar-bottom" slot="sidebar-bottom" />
-    <template slot="page-top">
-      <div class="theme-default-content beta-doc-description">
-        <div class="warning custom-block">
-          <p class="custom-block-title">Note</p>
-          <p>
-            This is a documentation for version <code>{{ docVersion }}</code
-            >.<template v-if="hasNotYetBeenReleased">
-              Also, this documentation may contain content that has not yet been
-              released.</template
-            ><br />
-            To check version <code>6.2.2</code>
-            <a :href="v6DocLink">go here</a>. To check previous releases
-            <a href="https://github.com/vuejs/eslint-plugin-vue/releases"
-              >go here</a
-            >.
-          </p>
-        </div>
-      </div>
-      <slot name="page-top" />
-    </template>
-    <slot name="page-bottom" slot="page-bottom" />
-  </BaseLayout>
-</template>
-
-<script>
-/**
- * Layout definition to navigate to older versions of the document.
- */
-import BaseLayout from '@vuepress/theme-default/layouts/Layout.vue'
-import semver from 'semver'
-const version = semver.parse(require('../../../../package.json').version)
-export default {
-  name: 'MyLayout',
-  components: {
-    BaseLayout
-  },
-  computed: {
-    docVersion() {
-      if (version.major < 7) {
-        return '7.x'
-      }
-      return version.raw
-    },
-    hasNotYetBeenReleased() {
-      if (version.major < 7) {
-        return true
-      }
-      return false
-    },
-    v6DocLink() {
-      if (this.$page.path.endsWith('.html')) {
-        return `https://github.com/vuejs/eslint-plugin-vue/blob/v6.2.2/docs${this.$page.path.replace(
-          /\.html$/,
-          ''
-        )}.md`
-      }
-      return `https://github.com/vuejs/eslint-plugin-vue/blob/v6.2.2/docs${this.$page.path}README.md`
-    }
-  }
-}
-</script>
-
-<style scoped>
-.beta-doc-description {
-  padding-bottom: 0;
-}
-* ::v-deep .theme-default-content ~ .theme-default-content {
-  padding-top: 0;
-}
-* ::v-deep .theme-default-content:not(.custom) h1 {
-  margin-top: -3.1rem;
-}
-</style>
diff --git a/docs/README.md b/docs/README.md
index 8bb74561..fe739cc2 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -14,6 +14,10 @@ This plugin allows us to check the `<template>` and `<script>` of `.vue` files w
 
 ESLint editor integrations are useful to check your code in real-time.
 
+:::warning Status of Vue.js 3.x supports
+This plugin supports the basic syntax of Vue.js 3.0, but the Vue.js 3.0 experimental features `<script setup>` and `<style vars>` are not yet supported. Follow [#1248](https://github.com/vuejs/eslint-plugin-vue/issues/1248) for more details.
+:::
+
 ## :traffic_light: Versioning policy
 
 This plugin is following [Semantic Versioning](https://semver.org/) and [ESLint's Semantic Versioning Policy](https://github.com/eslint/eslint#semantic-versioning-policy).
diff --git a/docs/rules/README.md b/docs/rules/README.md
index 9798e777..1ffb102f 100644
--- a/docs/rules/README.md
+++ b/docs/rules/README.md
@@ -24,6 +24,7 @@ Enforce all the rules in this category, as well as all higher priority rules, wi
 | Rule ID | Description |    |
 |:--------|:------------|:---|
 | [vue/comment-directive](./comment-directive.md) | support comment-directives in `<template>` |  |
+| [vue/experimental-script-setup-vars](./experimental-script-setup-vars.md) | prevent variables defined in `<script setup>` to be marked as undefined |  |
 | [vue/jsx-uses-vars](./jsx-uses-vars.md) | prevent variables used in JSX to be marked as unused |  |
 
 ## Priority A: Essential (Error Prevention) <badge text="for Vue.js 3.x" vertical="middle">for Vue.js 3.x</badge>
@@ -50,6 +51,7 @@ Enforce all the rules in this category, as well as all higher priority rules, wi
 | [vue/no-deprecated-functional-template](./no-deprecated-functional-template.md) | disallow using deprecated the `functional` template (in Vue.js 3.0.0+) |  |
 | [vue/no-deprecated-html-element-is](./no-deprecated-html-element-is.md) | disallow using deprecated the `is` attribute on HTML elements (in Vue.js 3.0.0+) |  |
 | [vue/no-deprecated-inline-template](./no-deprecated-inline-template.md) | disallow using deprecated `inline-template` attribute (in Vue.js 3.0.0+) |  |
+| [vue/no-deprecated-props-default-this](./no-deprecated-props-default-this.md) | disallow props default function `this` access |  |
 | [vue/no-deprecated-scope-attribute](./no-deprecated-scope-attribute.md) | disallow deprecated `scope` attribute (in Vue.js 2.5.0+) | :wrench: |
 | [vue/no-deprecated-slot-attribute](./no-deprecated-slot-attribute.md) | disallow deprecated `slot` attribute (in Vue.js 2.6.0+) | :wrench: |
 | [vue/no-deprecated-slot-scope-attribute](./no-deprecated-slot-scope-attribute.md) | disallow deprecated `slot-scope` attribute (in Vue.js 2.6.0+) | :wrench: |
diff --git a/docs/rules/attributes-order.md b/docs/rules/attributes-order.md
index c6391ffa..ea8c4ae9 100644
--- a/docs/rules/attributes-order.md
+++ b/docs/rules/attributes-order.md
@@ -12,7 +12,7 @@ description: enforce order of attributes
 
 ## :book: Rule Details
 
-This rule aims to enforce ordering of component attributes. The default order is specified in the [Vue styleguide](https://v3.vuejs.org/style-guide/#element-attribute-order-recommended) and is:
+This rule aims to enforce ordering of component attributes. The default order is specified in the [Vue.js Style Guide](https://v3.vuejs.org/style-guide/#element-attribute-order-recommended) and is:
 
 - `DEFINITION`
   e.g. 'is', 'v-is'
diff --git a/docs/rules/experimental-script-setup-vars.md b/docs/rules/experimental-script-setup-vars.md
new file mode 100644
index 00000000..c4f76899
--- /dev/null
+++ b/docs/rules/experimental-script-setup-vars.md
@@ -0,0 +1,42 @@
+---
+pageClass: rule-details
+sidebarDepth: 0
+title: vue/experimental-script-setup-vars
+description: prevent variables defined in `<script setup>` to be marked as undefined
+---
+# vue/experimental-script-setup-vars
+> prevent variables defined in `<script setup>` to be marked as undefined
+
+- :gear: This rule is included in all of `"plugin:vue/base"`, `"plugin:vue/essential"`, `"plugin:vue/vue3-essential"`, `"plugin:vue/strongly-recommended"`, `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/recommended"` and `"plugin:vue/vue3-recommended"`.
+
+:::warning
+This rule is an experimental rule. It may be removed without notice.
+:::
+
+This rule will find variables defined in `<script setup="args">` and mark them as defined variables.
+
+This rule only has an effect when the `no-undef` rule is enabled.
+
+## :book: Rule Details
+
+Without this rule this code triggers warning:
+
+<eslint-code-block :rules="{'no-undef': ['error'], 'vue/experimental-script-setup-vars': ['error']}">
+
+```vue
+<script setup="props, { emit }">
+import { watchEffect } from 'vue'
+
+watchEffect(() => console.log(props.msg))
+emit('foo')
+</script>
+```
+
+</eslint-code-block>
+
+After turning on, `props` and `emit` are being marked as defined and `no-undef` rule doesn't report an issue.
+
+## :mag: Implementation
+
+- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/experimental-script-setup-vars.js)
+- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/experimental-script-setup-vars.js)
diff --git a/docs/rules/match-component-file-name.md b/docs/rules/match-component-file-name.md
index 1ae1989f..7e454a8a 100644
--- a/docs/rules/match-component-file-name.md
+++ b/docs/rules/match-component-file-name.md
@@ -306,7 +306,7 @@ export default {
 
 ## :books: Further Reading
 
- - [Style guide - Single-file component filename casing](https://v3.vuejs.org/style-guide/#single-file-component-filename-casing-strongly-recommended)
+- [Style guide - Single-file component filename casing](https://v3.vuejs.org/style-guide/#single-file-component-filename-casing-strongly-recommended)
 
 ## :mag: Implementation
 
diff --git a/docs/rules/no-deprecated-data-object-declaration.md b/docs/rules/no-deprecated-data-object-declaration.md
index dfc84989..4724226d 100644
--- a/docs/rules/no-deprecated-data-object-declaration.md
+++ b/docs/rules/no-deprecated-data-object-declaration.md
@@ -15,6 +15,8 @@ description: disallow using deprecated object declaration on data (in Vue.js 3.0
 This rule reports use of deprecated object declaration on `data` property (in Vue.js 3.0.0+).
 The different from `vue/no-shared-component-data` is the root instance being also disallowed.
 
+See [Migration Guide - Data Option](https://v3.vuejs.org/guide/migration/data-option.html) for more details.
+
 <eslint-code-block fix :rules="{'vue/no-deprecated-data-object-declaration': ['error']}" language="javascript" filename="example.js">
 
 ```js
@@ -75,6 +77,7 @@ Nothing.
 
 ## :books: Further Reading
 
+- [Migration Guide - Data Option](https://v3.vuejs.org/guide/migration/data-option.html)
 - [Vue RFCs - 0019-remove-data-object-declaration](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0019-remove-data-object-declaration.md)
 
 ## :mag: Implementation
diff --git a/docs/rules/no-deprecated-dollar-scopedslots-api.md b/docs/rules/no-deprecated-dollar-scopedslots-api.md
index 63b4e70e..c497acb8 100644
--- a/docs/rules/no-deprecated-dollar-scopedslots-api.md
+++ b/docs/rules/no-deprecated-dollar-scopedslots-api.md
@@ -14,6 +14,8 @@ description: disallow using deprecated `$scopedSlots` (in Vue.js 3.0.0+)
 
 This rule reports use of deprecated `$scopedSlots`. (in Vue.js 3.0.0+).
 
+See [Migration Guide - Slots Unification](https://v3.vuejs.org/guide/migration/slots-unification.html) for more details.
+
 <eslint-code-block fix :rules="{'vue/no-deprecated-dollar-scopedslots-api': ['error']}">
 
 ```vue
@@ -39,6 +41,7 @@ Nothing.
 
 ## :books: Further Reading
 
+- [Migration Guide - Slots Unification](https://v3.vuejs.org/guide/migration/slots-unification.html)
 - [Vue RFCs - 0006-slots-unification](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0006-slots-unification.md)
 
 ## :mag: Implementation
diff --git a/docs/rules/no-deprecated-events-api.md b/docs/rules/no-deprecated-events-api.md
index a73d8840..1d268b74 100644
--- a/docs/rules/no-deprecated-events-api.md
+++ b/docs/rules/no-deprecated-events-api.md
@@ -13,6 +13,8 @@ description: disallow using deprecated events api (in Vue.js 3.0.0+)
 
 This rule reports use of deprecated `$on`, `$off` `$once` api. (in Vue.js 3.0.0+).
 
+See [Migration Guide - Events API](https://v3.vuejs.org/guide/migration/events-api.html) for more details.
+
 <eslint-code-block :rules="{'vue/no-deprecated-events-api': ['error']}">
 
 ```vue
@@ -57,6 +59,7 @@ Nothing.
 
 ## :books: Further Reading
 
+- [Migration Guide - Events API](https://v3.vuejs.org/guide/migration/events-api.html)
 - [Vue RFCs - 0020-events-api-change](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0020-events-api-change.md)
 
 ## :mag: Implementation
diff --git a/docs/rules/no-deprecated-filter.md b/docs/rules/no-deprecated-filter.md
index cba1380f..13a1aa9d 100644
--- a/docs/rules/no-deprecated-filter.md
+++ b/docs/rules/no-deprecated-filter.md
@@ -11,7 +11,9 @@ description: disallow using deprecated filters syntax (in Vue.js 3.0.0+)
 
 ## :book: Rule Details
 
-This rule reports deprecated `filters` syntax (removed in Vue.js v3.0.0+)
+This rule reports deprecated `filters` syntax (removed in Vue.js v3.0.0+).
+
+See [Migration Guide - Filters](https://v3.vuejs.org/guide/migration/filters.html) for more details.
 
 <eslint-code-block :rules="{'vue/no-deprecated-filter': ['error']}">
 
@@ -43,6 +45,7 @@ Nothing.
 
 ## :books: Further Reading
 
+- [Migration Guide - Filters](https://v3.vuejs.org/guide/migration/filters.html)
 - [Vue RFCs - 0015-remove-filters](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0015-remove-filters.md)
 
 ## :mag: Implementation
diff --git a/docs/rules/no-deprecated-functional-template.md b/docs/rules/no-deprecated-functional-template.md
index a7e288f7..bfd259b7 100644
--- a/docs/rules/no-deprecated-functional-template.md
+++ b/docs/rules/no-deprecated-functional-template.md
@@ -11,7 +11,9 @@ description: disallow using deprecated the `functional` template (in Vue.js 3.0.
 
 ## :book: Rule Details
 
-This rule reports deprecated the `functional` template (in Vue.js 3.0.0+)
+This rule reports deprecated the `functional` template (in Vue.js 3.0.0+).
+
+See [Migration Guide - Functional Components](https://v3.vuejs.org/guide/migration/functional-components.html) for more details.
 
 <eslint-code-block :rules="{'vue/no-deprecated-functional-template': ['error']}">
 
@@ -30,6 +32,7 @@ Nothing.
 
 ## :books: Further Reading
 
+- [Migration Guide - Functional Components](https://v3.vuejs.org/guide/migration/functional-components.html)
 - [Vue RFCs - 0007-functional-async-api-change](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0007-functional-async-api-change.md)
 - [Guide - Functional Components](https://vuejs.org/v2/guide/render-function.html#Functional-Components)
 
diff --git a/docs/rules/no-deprecated-html-element-is.md b/docs/rules/no-deprecated-html-element-is.md
index 800072b9..406715fb 100644
--- a/docs/rules/no-deprecated-html-element-is.md
+++ b/docs/rules/no-deprecated-html-element-is.md
@@ -11,7 +11,9 @@ description: disallow using deprecated the `is` attribute on HTML elements (in V
 
 ## :book: Rule Details
 
-This rule reports deprecated the `is` attribute on HTML elements (removed in Vue.js v3.0.0+)
+This rule reports deprecated the `is` attribute on HTML elements (removed in Vue.js v3.0.0+).
+
+See [Migration Guide - Custom Elements Interop](https://v3.vuejs.org/guide/migration/custom-elements-interop.html#customized-built-in-elements) for more details.
 
 <eslint-code-block :rules="{'vue/no-deprecated-html-element-is': ['error']}">
 
@@ -35,6 +37,7 @@ Nothing.
 
 ## :books: Further Reading
 
+- [Migration Guide - Custom Elements Interop](https://v3.vuejs.org/guide/migration/custom-elements-interop.html#customized-built-in-elements)
 - [Vue RFCs - 0027-custom-elements-interop](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0027-custom-elements-interop.md)
 
 ## :mag: Implementation
diff --git a/docs/rules/no-deprecated-inline-template.md b/docs/rules/no-deprecated-inline-template.md
index 74f8c485..eca07d44 100644
--- a/docs/rules/no-deprecated-inline-template.md
+++ b/docs/rules/no-deprecated-inline-template.md
@@ -11,7 +11,9 @@ description: disallow using deprecated `inline-template` attribute (in Vue.js 3.
 
 ## :book: Rule Details
 
-This rule reports deprecated `inline-template` attributes (removed in Vue.js v3.0.0+)
+This rule reports deprecated `inline-template` attributes (removed in Vue.js v3.0.0+).
+
+See [Migration Guide - Inline Template Attribute](https://v3.vuejs.org/guide/migration/inline-template-attribute.html) for more details.
 
 <eslint-code-block :rules="{'vue/no-deprecated-inline-template': ['error']}">
 
@@ -38,6 +40,7 @@ Nothing.
 
 ## :books: Further Reading
 
+- [Migration Guide - Inline Template Attribute](https://v3.vuejs.org/guide/migration/inline-template-attribute.html)
 - [Vue RFCs - 0016-remove-inline-templates](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0016-remove-inline-templates.md)
 
 ## :mag: Implementation
diff --git a/docs/rules/no-deprecated-props-default-this.md b/docs/rules/no-deprecated-props-default-this.md
new file mode 100644
index 00000000..51ae7101
--- /dev/null
+++ b/docs/rules/no-deprecated-props-default-this.md
@@ -0,0 +1,70 @@
+---
+pageClass: rule-details
+sidebarDepth: 0
+title: vue/no-deprecated-props-default-this
+description: disallow props default function `this` access
+---
+# vue/no-deprecated-props-default-this
+> disallow props default function `this` access
+
+- :gear: This rule is included in all of `"plugin:vue/vue3-essential"`, `"plugin:vue/vue3-strongly-recommended"` and `"plugin:vue/vue3-recommended"`.
+
+## :book: Rule Details
+
+This rule reports the use of `this` within the props default value factory functions.
+In Vue.js 3.0.0+, props default value factory functions no longer have access to `this`.
+
+See [Migration Guide - Props Default Function `this` Access](https://v3.vuejs.org/guide/migration/props-default-this.html) for more details.
+
+<eslint-code-block :rules="{'vue/no-deprecated-props-default-this': ['error']}">
+
+```vue
+<script>
+export default {
+  props: {
+    a: String,
+    b: {
+      default () {
+        /* ✗ BAD */
+        return this.a
+      }
+    }
+  }
+}
+</script>
+```
+
+</eslint-code-block>
+
+<eslint-code-block :rules="{'vue/no-deprecated-props-default-this': ['error']}">
+
+```vue
+<script>
+export default {
+  props: {
+    a: String,
+    b: {
+      default (props) {
+        /* ✓ GOOD */
+        return props.a
+      }
+    }
+  }
+}
+</script>
+```
+
+</eslint-code-block>
+
+## :wrench: Options
+
+Nothing.
+
+## :books: Further Reading
+
+- [Migration Guide - Props Default Function `this` Access](https://v3.vuejs.org/guide/migration/props-default-this.html)
+
+## :mag: Implementation
+
+- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/no-deprecated-props-default-this.js)
+- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/no-deprecated-props-default-this.js)
diff --git a/docs/rules/no-deprecated-v-bind-sync.md b/docs/rules/no-deprecated-v-bind-sync.md
index e27f2804..41fa3d99 100644
--- a/docs/rules/no-deprecated-v-bind-sync.md
+++ b/docs/rules/no-deprecated-v-bind-sync.md
@@ -12,7 +12,9 @@ description: disallow use of deprecated `.sync` modifier on `v-bind` directive (
 
 ## :book: Rule Details
 
-This rule reports use of deprecated `.sync` modifier on `v-bind` directive (in Vue.js 3.0.0+)
+This rule reports use of deprecated `.sync` modifier on `v-bind` directive (in Vue.js 3.0.0+).
+
+See [Migration Guide - `v-model`](https://v3.vuejs.org/guide/migration/v-model.html) for more details.
 
 <eslint-code-block fix :rules="{'vue/no-deprecated-v-bind-sync': ['error']}">
 
@@ -45,6 +47,7 @@ Nothing.
 
 ## :books: Further Reading
 
+- [Migration Guide - `v-model`](https://v3.vuejs.org/guide/migration/v-model.html)
 - [Vue RFCs - 0005-replace-v-bind-sync-with-v-model-argument](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0005-replace-v-bind-sync-with-v-model-argument.md)
 
 ## :mag: Implementation
diff --git a/docs/rules/no-deprecated-v-on-number-modifiers.md b/docs/rules/no-deprecated-v-on-number-modifiers.md
index c0937aef..2d7ece06 100644
--- a/docs/rules/no-deprecated-v-on-number-modifiers.md
+++ b/docs/rules/no-deprecated-v-on-number-modifiers.md
@@ -12,7 +12,9 @@ description: disallow using deprecated number (keycode) modifiers (in Vue.js 3.0
 
 ## :book: Rule Details
 
-This rule reports use of deprecated `KeyboardEvent.keyCode` modifier on `v-on` directive (in Vue.js 3.0.0+)
+This rule reports use of deprecated `KeyboardEvent.keyCode` modifier on `v-on` directive (in Vue.js 3.0.0+).
+
+See [Migration Guide - KeyCode Modifiers](https://v3.vuejs.org/guide/migration/keycode-modifiers.html) for more details.
 
 <eslint-code-block fix :rules="{'vue/no-deprecated-v-on-number-modifiers': ['error']}">
 
@@ -44,6 +46,7 @@ Nothing.
 
 ## :books: Further Reading
 
+- [Migration Guide - KeyCode Modifiers](https://v3.vuejs.org/guide/migration/keycode-modifiers.html)
 - [Vue RFCs - 0014-drop-keycode-support](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0014-drop-keycode-support.md)
 
 ## :mag: Implementation
diff --git a/docs/rules/no-deprecated-vue-config-keycodes.md b/docs/rules/no-deprecated-vue-config-keycodes.md
index 18df590d..1b394feb 100644
--- a/docs/rules/no-deprecated-vue-config-keycodes.md
+++ b/docs/rules/no-deprecated-vue-config-keycodes.md
@@ -11,7 +11,9 @@ description: disallow using deprecated `Vue.config.keyCodes` (in Vue.js 3.0.0+)
 
 ## :book: Rule Details
 
-This rule reports use of deprecated `Vue.config.keyCodes` (in Vue.js 3.0.0+)
+This rule reports use of deprecated `Vue.config.keyCodes` (in Vue.js 3.0.0+).
+
+See [Migration Guide - KeyCode Modifiers](https://v3.vuejs.org/guide/migration/keycode-modifiers.html) for more details.
 
 <eslint-code-block filename="a.js" language="javascript" :rules="{'vue/no-deprecated-vue-config-keycodes': ['error']}">
 
@@ -36,9 +38,11 @@ Nothing.
 
 ## :books: Further Reading
 
+- [Migration Guide - KeyCode Modifiers]
 - [Vue RFCs - 0014-drop-keycode-support]
 - [API - Global Config - keyCodes]
 
+[Migration Guide - KeyCode Modifiers]: https://v3.vuejs.org/guide/migration/keycode-modifiers.html
 [Vue RFCs - 0014-drop-keycode-support]: https://github.com/vuejs/rfcs/blob/master/active-rfcs/0014-drop-keycode-support.md
 [API - Global Config - keyCodes]: https://vuejs.org/v2/api/#keyCodes
 
diff --git a/docs/rules/no-potential-component-option-typo.md b/docs/rules/no-potential-component-option-typo.md
index a3a9a6e7..2233361e 100644
--- a/docs/rules/no-potential-component-option-typo.md
+++ b/docs/rules/no-potential-component-option-typo.md
@@ -53,7 +53,7 @@ export default {
 
 </eslint-code-block>
 
-> we use editdistance to compare two string similarity, threshold is an option to control upper bound of editdistance to report
+> we use edit distance to compare two string similarity, threshold is an option to control upper bound of edit distance to report
 
 **Here is the another example about config option `threshold`**
 
@@ -75,15 +75,15 @@ export default {
   props: {
 
   },
-  /* ✓ GOOD, due to threshold is 5 */
-  method: {
+  /* ✗ BAD, due to threshold is 5 */
+  mehtod: {
 
   },
   /* ✓ GOOD, due to threshold is 5 */
   data: {
 
   },
-  /* ✗ BAD, due to we don't choose vue-router preset or add a custom option */
+  /* ✓ GOOD, due to we don't choose vue-router preset or add a custom option */
   beforeRouteEnteR() {
 
   }
@@ -97,7 +97,7 @@ export default {
 
 ```json
 {
-  "vue/no-unsed-vars": ["error", {
+  "vue/no-potential-component-option-typo": ["error", {
     "presets": ["vue"],
     "custom": [],
     "threshold": 1
@@ -111,11 +111,11 @@ export default {
 
 ## :rocket: Suggestion
 
-- We provide all the possible component option that editdistance between your vue component option and configuration options is greater than 0 and lessEqual than threshold
+- We provide all the possible component option that edit distance between your vue component option and configuration options is greater than 0 and less equal than threshold
 
 ## :books: Further Reading
 
-- [Edit_distance](https://en.wikipedia.org/wiki/Edit_distance)
+- [Edit distance](https://en.wikipedia.org/wiki/Edit_distance)
 
 ## :mag: Implementation
 
diff --git a/docs/rules/no-shared-component-data.md b/docs/rules/no-shared-component-data.md
index a869b800..2b0fb706 100644
--- a/docs/rules/no-shared-component-data.md
+++ b/docs/rules/no-shared-component-data.md
@@ -68,7 +68,6 @@ Nothing.
 
 ## :books: Further Reading
 
-
 - [Style guide (for v2) - Component data](https://vuejs.org/v2/style-guide/#Component-data-essential)
 - [API - data](https://v3.vuejs.org/api/options-data.html#data-2)
 - [API (for v2) - data](https://v3.vuejs.org/api/options-data.html#data-2)
diff --git a/docs/rules/no-v-for-template-key-on-child.md b/docs/rules/no-v-for-template-key-on-child.md
index 982ddd5e..bd56e481 100644
--- a/docs/rules/no-v-for-template-key-on-child.md
+++ b/docs/rules/no-v-for-template-key-on-child.md
@@ -15,6 +15,8 @@ This rule reports the key of the `<template v-for>` placed on the child elements
 
 In Vue.js 3.x, with the support for fragments, the `<template v-for>` key can be placed on the `<template>` tag.  
 
+See [Migration Guide - `key` attribute > With `<template v-for>`](https://v3.vuejs.org/guide/migration/key-attribute.html#with-template-v-for) for more details.
+
 ::: warning Note
 Do not use with the [vue/no-v-for-template-key] rule for Vue.js 2.x.  
 This rule conflicts with the [vue/no-v-for-template-key] rule.
@@ -48,6 +50,10 @@ Nothing.
 
 [vue/no-v-for-template-key]: ./no-v-for-template-key.md
 
+## :books: Further Reading
+
+- [Migration Guide - `key` attribute > With `<template v-for>`](https://v3.vuejs.org/guide/migration/key-attribute.html#with-template-v-for)
+
 ## :mag: Implementation
 
 - [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/no-v-for-template-key-on-child.js)
diff --git a/docs/user-guide/README.md b/docs/user-guide/README.md
index 82e8393a..552a1bdf 100644
--- a/docs/user-guide/README.md
+++ b/docs/user-guide/README.md
@@ -3,23 +3,28 @@
 ## :cd: Installation
 
 Via `vue-cli` (**Recommended**):
+
 ```bash
 vue add @vue/cli-plugin-eslint
 ```
 
 Via [npm](https://www.npmjs.com/):
+
 ```bash
-npm install --save-dev eslint eslint-plugin-vue@next
+npm install --save-dev eslint eslint-plugin-vue
 ```
 
 Via [yarn](https://yarnpkg.com/):
+
 ```bash
-yarn add -D eslint eslint-plugin-vue@next
+yarn add -D eslint eslint-plugin-vue
 ```
 
 ::: tip Requirements
+
 - ESLint v6.2.0 and above
 - Node.js v8.10.0 and above
+
 :::
 
 ## :book: Usage
@@ -35,7 +40,8 @@ module.exports = {
   extends: [
     // add more generic rulesets here, such as:
     // 'eslint:recommended',
-    'plugin:vue/vue3-recommended'
+    'plugin:vue/vue3-recommended',
+    // 'plugin:vue/recommended' // Use this if you are using Vue.js 2.x.
   ],
   rules: {
     // override/add rules settings here, such as:
@@ -46,13 +52,32 @@ module.exports = {
 
 See [the rule list](../rules/README.md) to get the `extends` &amp; `rules` that this plugin provides.
 
+#### Bundle Configurations
+
+This plugin provides some predefined configs.
+You can use the following configs by adding them to `extends`.
+
+- `"plugin:vue/base"` ... Settings and rules to enable correct ESLint parsing.
+- Configurations for using Vue.js 3.x.
+  - `"plugin:vue/vue3-essential"` ... `base`, plus rules to prevent errors or unintended behavior.
+  - `"plugin:vue/vue3-strongly-recommended"` ... Above, plus rules to considerably improve code readability and/or dev experience.
+  - `"plugin:vue/vue3-recommended"` ... Above, plus rules to enforce subjective community defaults to ensure consistency.
+- Configurations for using Vue.js 2.x.
+  - `"plugin:vue/essential"` ... `base`, plus rules to prevent errors or unintended behavior.
+  - `"plugin:vue/strongly-recommended"` ... Above, plus rules to considerably improve code readability and/or dev experience.
+  - `"plugin:vue/recommended"` ... Above, plus rules to enforce subjective community defaults to ensure consistency
+
 :::warning Reporting rules
-By default all rules from **base** and **essential** categories report ESLint errors. Other rules - because they're not covering potential bugs in the application - report warnings. What does it mean? By default - nothing, but if you want - you can set up a treshold and break the build after a certain amount of warnings, instead of any. More information [here](https://eslint.org/docs/user-guide/command-line-interface#handling-warnings).
+By default all rules from **base** and **essential** categories report ESLint errors. Other rules - because they're not covering potential bugs in the application - report warnings. What does it mean? By default - nothing, but if you want - you can set up a threshold and break the build after a certain amount of warnings, instead of any. More information [here](https://eslint.org/docs/user-guide/command-line-interface#handling-warnings).
+:::
+
+:::warning Status of Vue.js 3.x supports
+This plugin supports the basic syntax of Vue.js 3.0, but the Vue.js 3.0 experimental features `<script setup>` and `<style vars>` are not yet supported. Follow [#1248](https://github.com/vuejs/eslint-plugin-vue/issues/1248) for more details.
 :::
 
 ### Running ESLint from the command line
 
-If you want to run `eslint` from the command line, make sure you include the `.vue` extension using [the `--ext` option](https://eslint.org/docs/user-guide/configuring#specifying-file-extensions-to-lint) or a glob pattern, because ESLint targets only `.js` files by default.
+If you want to run `eslint` from the command line, make sure you include the `.vue` extension using [the `--ext` option](https://eslint.org/docs/user-guide/configuring#specifying-target-files-to-lint) or a glob pattern, because ESLint targets only `.js` files by default.
 
 Examples:
 
@@ -220,7 +245,7 @@ See also: "[How to use a custom parser?](#how-to-use-a-custom-parser)" section.
   - CLI targets only `.js` files by default. You have to specify additional extensions with the `--ext` option or glob patterns. E.g. `eslint "src/**/*.{js,vue}"` or `eslint src --ext .vue`. If you use `@vue/cli-plugin-eslint` and the `vue-cli-service lint` command - you don't have to worry about it.
   - If you are having issues with configuring editor, please read [editor integrations](#editor-integrations)
 
-### Conflict with [Prettier].
+### Conflict with [Prettier]
 
 If the [Prettier] conflicts with the shareable config provided by this plugin, use [eslint-config-prettier] to resolve it.
 
@@ -266,7 +291,7 @@ module.exports = {
 [prettier]: https://prettier.io/
 [eslint-config-prettier]: https://github.com/prettier/eslint-config-prettier
 
-### Using JSX.
+### Using JSX
 
 If you are using JSX, you need to enable JSX in your ESLint configuration.
 
diff --git a/lib/configs/base.js b/lib/configs/base.js
index 2521a623..eb129643 100644
--- a/lib/configs/base.js
+++ b/lib/configs/base.js
@@ -16,6 +16,7 @@ module.exports = {
   plugins: ['vue'],
   rules: {
     'vue/comment-directive': 'error',
+    'vue/experimental-script-setup-vars': 'error',
     'vue/jsx-uses-vars': 'error'
   }
 }
diff --git a/lib/configs/vue3-essential.js b/lib/configs/vue3-essential.js
index 7d715c18..d1e2d176 100644
--- a/lib/configs/vue3-essential.js
+++ b/lib/configs/vue3-essential.js
@@ -18,6 +18,7 @@ module.exports = {
     'vue/no-deprecated-functional-template': 'error',
     'vue/no-deprecated-html-element-is': 'error',
     'vue/no-deprecated-inline-template': 'error',
+    'vue/no-deprecated-props-default-this': 'error',
     'vue/no-deprecated-scope-attribute': 'error',
     'vue/no-deprecated-slot-attribute': 'error',
     'vue/no-deprecated-slot-scope-attribute': 'error',
diff --git a/lib/index.js b/lib/index.js
index 556fadeb..eb6a4291 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -25,6 +25,7 @@ module.exports = {
     'dot-location': require('./rules/dot-location'),
     'dot-notation': require('./rules/dot-notation'),
     eqeqeq: require('./rules/eqeqeq'),
+    'experimental-script-setup-vars': require('./rules/experimental-script-setup-vars'),
     'func-call-spacing': require('./rules/func-call-spacing'),
     'html-closing-bracket-newline': require('./rules/html-closing-bracket-newline'),
     'html-closing-bracket-spacing': require('./rules/html-closing-bracket-spacing'),
@@ -59,6 +60,7 @@ module.exports = {
     'no-deprecated-functional-template': require('./rules/no-deprecated-functional-template'),
     'no-deprecated-html-element-is': require('./rules/no-deprecated-html-element-is'),
     'no-deprecated-inline-template': require('./rules/no-deprecated-inline-template'),
+    'no-deprecated-props-default-this': require('./rules/no-deprecated-props-default-this'),
     'no-deprecated-scope-attribute': require('./rules/no-deprecated-scope-attribute'),
     'no-deprecated-slot-attribute': require('./rules/no-deprecated-slot-attribute'),
     'no-deprecated-slot-scope-attribute': require('./rules/no-deprecated-slot-scope-attribute'),
diff --git a/lib/rules/experimental-script-setup-vars.js b/lib/rules/experimental-script-setup-vars.js
new file mode 100644
index 00000000..b209376d
--- /dev/null
+++ b/lib/rules/experimental-script-setup-vars.js
@@ -0,0 +1,228 @@
+/**
+ * @fileoverview prevent variables defined in `<script setup>` to be marked as undefined
+ * @author Yosuke Ota
+ */
+'use strict'
+
+const Module = require('module')
+const path = require('path')
+const utils = require('../utils')
+const AST = require('vue-eslint-parser').AST
+
+const ecmaVersion = 2020
+
+// ------------------------------------------------------------------------------
+// Rule Definition
+// ------------------------------------------------------------------------------
+
+module.exports = {
+  meta: {
+    type: 'problem',
+    docs: {
+      description:
+        'prevent variables defined in `<script setup>` to be marked as undefined', // eslint-disable-line consistent-docs-description
+      categories: ['base'],
+      url: 'https://eslint.vuejs.org/rules/experimental-script-setup-vars.html'
+    },
+    schema: []
+  },
+  /**
+   * @param {RuleContext} context - The rule context.
+   * @returns {RuleListener} AST event handlers.
+   */
+  create(context) {
+    const documentFragment =
+      context.parserServices.getDocumentFragment &&
+      context.parserServices.getDocumentFragment()
+    if (!documentFragment) {
+      return {}
+    }
+    const sourceCode = context.getSourceCode()
+    const scriptElement = documentFragment.children
+      .filter(utils.isVElement)
+      .find(
+        (element) =>
+          element.name === 'script' &&
+          element.range[0] <= sourceCode.ast.range[0] &&
+          sourceCode.ast.range[1] <= element.range[1]
+      )
+    if (!scriptElement) {
+      return {}
+    }
+    const setupAttr = utils.getAttribute(scriptElement, 'setup')
+    if (!setupAttr || !setupAttr.value) {
+      return {}
+    }
+    const value = setupAttr.value.value
+
+    let eslintScope
+    try {
+      eslintScope = getESLintModule('eslint-scope', () =>
+        // @ts-ignore
+        require('eslint-scope')
+      )
+    } catch (_e) {
+      context.report({
+        node: setupAttr,
+        message: 'Can not be resolved eslint-scope.'
+      })
+      return {}
+    }
+    let espree
+    try {
+      espree = getESLintModule('espree', () =>
+        // @ts-ignore
+        require('espree')
+      )
+    } catch (_e) {
+      context.report({
+        node: setupAttr,
+        message: 'Can not be resolved espree.'
+      })
+      return {}
+    }
+
+    const globalScope = sourceCode.scopeManager.scopes[0]
+
+    /** @type {string[]} */
+    let vars
+    try {
+      vars = parseSetup(value, espree, eslintScope)
+    } catch (_e) {
+      context.report({
+        node: setupAttr.value,
+        message: 'Parsing error.'
+      })
+      return {}
+    }
+
+    // Define configured global variables.
+    for (const id of vars) {
+      const tempVariable = globalScope.set.get(id)
+
+      /** @type {Variable} */
+      let variable
+      if (!tempVariable) {
+        variable = new eslintScope.Variable(id, globalScope)
+
+        globalScope.variables.push(variable)
+        globalScope.set.set(id, variable)
+      } else {
+        variable = tempVariable
+      }
+
+      variable.eslintImplicitGlobalSetting = 'readonly'
+      variable.eslintExplicitGlobal = undefined
+      variable.eslintExplicitGlobalComments = undefined
+      variable.writeable = false
+    }
+
+    /*
+     * "through" contains all references which definitions cannot be found.
+     * Since we augment the global scope using configuration, we need to update
+     * references and remove the ones that were added by configuration.
+     */
+    globalScope.through = globalScope.through.filter((reference) => {
+      const name = reference.identifier.name
+      const variable = globalScope.set.get(name)
+
+      if (variable) {
+        /*
+         * Links the variable and the reference.
+         * And this reference is removed from `Scope#through`.
+         */
+        reference.resolved = variable
+        variable.references.push(reference)
+
+        return false
+      }
+
+      return true
+    })
+
+    return {}
+  }
+}
+
+/**
+ * @param {string} code
+ * @param {any} espree
+ * @param {any} eslintScope
+ * @returns {string[]}
+ */
+function parseSetup(code, espree, eslintScope) {
+  /** @type {Program} */
+  const ast = espree.parse(`(${code})=>{}`, { ecmaVersion })
+  const result = eslintScope.analyze(ast, {
+    ignoreEval: true,
+    nodejsScope: false,
+    ecmaVersion,
+    sourceType: 'script',
+    fallback: AST.getFallbackKeys
+  })
+
+  const variables = /** @type {Variable[]} */ (result.globalScope.childScopes[0]
+    .variables)
+
+  return variables.map((v) => v.name)
+}
+
+const createRequire =
+  // Added in v12.2.0
+  Module.createRequire ||
+  // Added in v10.12.0, but deprecated in v12.2.0.
+  Module.createRequireFromPath ||
+  // Polyfill - This is not executed on the tests on node@>=10.
+  /**
+   * @param {string} filename
+   */
+  function (filename) {
+    const mod = new Module(filename)
+
+    mod.filename = filename
+    // @ts-ignore
+    mod.paths = Module._nodeModulePaths(path.dirname(filename))
+    // @ts-ignore
+    mod._compile('module.exports = require;', filename)
+    return mod.exports
+  }
+
+/** @type { { 'espree'?: any, 'eslint-scope'?: any } } */
+const modulesCache = {}
+
+/**
+ * @param {string} p
+ */
+function isLinterPath(p) {
+  return (
+    // ESLint 6 and above
+    p.includes(`eslint${path.sep}lib${path.sep}linter${path.sep}linter.js`) ||
+    // ESLint 5
+    p.includes(`eslint${path.sep}lib${path.sep}linter.js`)
+  )
+}
+
+/**
+ * Load module from the loaded ESLint.
+ * If the loaded ESLint was not found, just returns `fallback()`.
+ * @param {'espree' | 'eslint-scope'} name
+ * @param { () => any } fallback
+ */
+function getESLintModule(name, fallback) {
+  if (!modulesCache[name]) {
+    // Lookup the loaded eslint
+    const linterPath = Object.keys(require.cache).find(isLinterPath)
+    if (linterPath) {
+      try {
+        modulesCache[name] = createRequire(linterPath)(name)
+      } catch (_e) {
+        // ignore
+      }
+    }
+    if (!modulesCache[name]) {
+      modulesCache[name] = fallback()
+    }
+  }
+
+  return modulesCache[name]
+}
diff --git a/lib/rules/no-deprecated-props-default-this.js b/lib/rules/no-deprecated-props-default-this.js
new file mode 100644
index 00000000..926476c1
--- /dev/null
+++ b/lib/rules/no-deprecated-props-default-this.js
@@ -0,0 +1,107 @@
+/**
+ * @author Yosuke Ota
+ * See LICENSE file in root directory for full license.
+ */
+'use strict'
+
+// ------------------------------------------------------------------------------
+// Requirements
+// ------------------------------------------------------------------------------
+
+const utils = require('../utils')
+
+// ------------------------------------------------------------------------------
+// Rule Definition
+// ------------------------------------------------------------------------------
+
+module.exports = {
+  meta: {
+    type: 'problem',
+    docs: {
+      description: 'disallow props default function `this` access',
+      categories: ['vue3-essential'],
+      url:
+        'https://eslint.vuejs.org/rules/no-deprecated-props-default-this.html'
+    },
+    fixable: null,
+    schema: [],
+    messages: {
+      deprecated:
+        'Props default value factory functions no longer have access to `this`.'
+    }
+  },
+  /** @param {RuleContext} context */
+  create(context) {
+    /**
+     * @typedef {object} ScopeStack
+     * @property {ScopeStack | null} upper
+     * @property {FunctionExpression | FunctionDeclaration} node
+     * @property {boolean} propDefault
+     */
+    /** @type {Set<FunctionExpression>} */
+    const propsDefault = new Set()
+    /** @type {ScopeStack | null} */
+    let scopeStack = null
+
+    /**
+     * @param {FunctionExpression | FunctionDeclaration | ArrowFunctionExpression} node
+     */
+    function onFunctionEnter(node) {
+      if (node.type === 'ArrowFunctionExpression') {
+        return
+      }
+      if (scopeStack) {
+        scopeStack = {
+          upper: scopeStack,
+          node,
+          propDefault: false
+        }
+      } else if (node.type === 'FunctionExpression' && propsDefault.has(node)) {
+        scopeStack = {
+          upper: scopeStack,
+          node,
+          propDefault: true
+        }
+      }
+    }
+
+    /**
+     * @param {FunctionExpression | FunctionDeclaration | ArrowFunctionExpression} node
+     */
+    function onFunctionExit(node) {
+      if (scopeStack && scopeStack.node === node) {
+        scopeStack = scopeStack.upper
+      }
+    }
+    return utils.defineVueVisitor(context, {
+      onVueObjectEnter(node) {
+        for (const prop of utils.getComponentProps(node)) {
+          if (prop.type !== 'object') {
+            continue
+          }
+          if (prop.value.type !== 'ObjectExpression') {
+            continue
+          }
+          const def = utils.findProperty(prop.value, 'default')
+          if (!def) {
+            continue
+          }
+          if (def.value.type !== 'FunctionExpression') {
+            continue
+          }
+          propsDefault.add(def.value)
+        }
+      },
+      ':function': onFunctionEnter,
+      ':function:exit': onFunctionExit,
+      ThisExpression(node) {
+        if (scopeStack && scopeStack.propDefault) {
+          context.report({
+            node,
+            messageId: 'deprecated'
+          })
+        }
+      }
+    })
+  }
+}
diff --git a/package.json b/package.json
index 01832170..c47c90e7 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "eslint-plugin-vue",
-  "version": "7.0.0-beta.3",
+  "version": "7.0.0-beta.4",
   "description": "Official ESLint plugin for Vue.js",
   "main": "lib/index.js",
   "scripts": {
@@ -80,8 +80,5 @@
     "typescript": "^3.9.5",
     "vue-eslint-editor": "^1.1.0",
     "vuepress": "^1.4.1"
-  },
-  "publishConfig": {
-    "tag": "next"
   }
 }
diff --git a/typings/eslint/index.d.ts b/typings/eslint/index.d.ts
index 653abebd..1d793d24 100644
--- a/typings/eslint/index.d.ts
+++ b/typings/eslint/index.d.ts
@@ -49,6 +49,11 @@ export namespace Scope {
     identifiers: VAST.Identifier[]
     references: Reference[]
     defs: Definition[]
+
+    writeable?: boolean | undefined
+    eslintExplicitGlobal?: boolean | undefined
+    eslintExplicitGlobalComments?: Comment[] | undefined
+    eslintImplicitGlobalSetting?: 'readonly' | 'writable' | undefined
   }
   interface Reference {
     identifier: VAST.Identifier


Test patch:
diff --git a/tests/lib/rules/experimental-script-setup-vars.js b/tests/lib/rules/experimental-script-setup-vars.js
new file mode 100644
index 00000000..089019c7
--- /dev/null
+++ b/tests/lib/rules/experimental-script-setup-vars.js
@@ -0,0 +1,58 @@
+/**
+ * @author Yosuke Ota
+ */
+'use strict'
+
+const { RuleTester } = require('eslint')
+const rule = require('../../../lib/rules/experimental-script-setup-vars')
+
+const tester = new RuleTester({
+  parser: require.resolve('vue-eslint-parser'),
+  parserOptions: { ecmaVersion: 2020, sourceType: 'module' }
+})
+
+tester.run('experimental-script-setup-vars', rule, {
+  valid: [
+    `
+    <script setup="props, { emit }">
+    import { watchEffect } from 'vue'
+
+    watchEffect(() => console.log(props.msg))
+    emit('foo')
+    </script>`,
+    `
+    <script setup>
+    export let count = 1
+    </script>`,
+    `
+    <script>
+    import { watchEffect } from 'vue'
+
+    export default {
+      setup (props, { emit }) {
+        watchEffect(() => console.log(props.msg))
+        emit('foo')
+        return {}
+      }
+    }
+    </script>`,
+    `
+    <template>
+      <div />
+    </template>`
+  ],
+  invalid: [
+    {
+      code: `
+      <script setup="a - b">
+      </script>
+      `,
+      errors: [
+        {
+          message: 'Parsing error.',
+          line: 2
+        }
+      ]
+    }
+  ]
+})
diff --git a/tests/lib/rules/no-deprecated-props-default-this.js b/tests/lib/rules/no-deprecated-props-default-this.js
new file mode 100644
index 00000000..0993e817
--- /dev/null
+++ b/tests/lib/rules/no-deprecated-props-default-this.js
@@ -0,0 +1,187 @@
+/**
+ * @author Yosuke Ota
+ * See LICENSE file in root directory for full license.
+ */
+'use strict'
+
+// ------------------------------------------------------------------------------
+// Requirements
+// ------------------------------------------------------------------------------
+
+const rule = require('../../../lib/rules/no-deprecated-props-default-this')
+const RuleTester = require('eslint').RuleTester
+
+// ------------------------------------------------------------------------------
+// Tests
+// ------------------------------------------------------------------------------
+
+const ruleTester = new RuleTester({
+  parser: require.resolve('vue-eslint-parser'),
+  parserOptions: { ecmaVersion: 2020, sourceType: 'module' }
+})
+
+ruleTester.run('no-deprecated-props-default-this', rule, {
+  valid: [
+    {
+      filename: 'test.vue',
+      code: `
+        <template><div /></template>
+        <script>
+        export default {
+          props: {
+            a: String,
+            b: {
+              default (props) {
+                return props.a
+              }
+            }
+          }
+        }
+        </script>
+      `
+    },
+    {
+      filename: 'test.vue',
+      code: `
+        <template><div /></template>
+        <script>
+        export default {
+          props: {
+            a: String,
+            b: {
+              default: () => {
+                return this.a
+              }
+            }
+          }
+        }
+        </script>
+      `
+    },
+    {
+      filename: 'test.vue',
+      code: `
+        <template><div /></template>
+        <script>
+        export default {
+          props: {
+            a: String,
+            b: {
+              default () {
+                return function () {
+                  return this.a
+                }
+              }
+            }
+          }
+        }
+        </script>
+      `,
+      errors: [{}, {}]
+    },
+    {
+      filename: 'test.vue',
+      code: `
+        <template><div /></template>
+        <script>
+        const Foo = {
+          props: {
+            a: String,
+            b: {
+              default () {
+                return this.a
+              }
+            }
+          }
+        }
+        </script>
+      `
+    }
+  ],
+
+  invalid: [
+    {
+      filename: 'test.vue',
+      code: `
+        <template><div /></template>
+        <script>
+        export default {
+          props: {
+            a: String,
+            b: {
+              default () {
+                return this.a
+              }
+            }
+          }
+        }
+        </script>
+      `,
+      errors: [
+        {
+          message:
+            'Props default value factory functions no longer have access to `this`.',
+          line: 9,
+          column: 24,
+          endLine: 9,
+          endColumn: 28
+        }
+      ]
+    },
+    {
+      filename: 'test.vue',
+      code: `
+        <template><div /></template>
+        <script>
+        export default {
+          props: {
+            a: String,
+            b: {
+              default () {
+                return () => this.a
+              }
+            }
+          }
+        }
+        </script>
+      `,
+      errors: [
+        {
+          message:
+            'Props default value factory functions no longer have access to `this`.',
+          line: 9,
+          column: 30,
+          endLine: 9,
+          endColumn: 34
+        }
+      ]
+    },
+    {
+      filename: 'test.vue',
+      code: `
+        <template><div /></template>
+        <script>
+        export default {
+          props: {
+            a: String,
+            b: {
+              default () {
+                return this.a
+              }
+            },
+            c: {
+              default () {
+                return this.a
+              }
+            }
+          }
+        }
+        </script>
+      `,
+      errors: [
+        'Props default value factory functions no longer have access to `this`.',
+        'Props default value factory functions no longer have access to `this`.'
+      ]
+    }
+  ]
+})
diff --git a/tests/lib/script-setup.js b/tests/lib/script-setup.js
new file mode 100644
index 00000000..ad7409dc
--- /dev/null
+++ b/tests/lib/script-setup.js
@@ -0,0 +1,49 @@
+/**
+ * @author Yosuke Ota <https://github.com/ota-meshi>
+ * See LICENSE file in root directory for full license.
+ */
+'use strict'
+
+const Linter = require('eslint').Linter
+const parser = require('vue-eslint-parser')
+const assert = require('assert')
+const experimentalScriptSetupVars = require('../../lib/rules/experimental-script-setup-vars')
+
+const baseConfig = {
+  parser: 'vue-eslint-parser',
+  parserOptions: {
+    ecmaVersion: 2020,
+    sourceType: 'module'
+  }
+}
+
+describe('script-setup test cases', () => {
+  const linter = new Linter()
+  linter.defineParser('vue-eslint-parser', parser)
+  linter.defineRule(
+    'vue/experimental-script-setup-vars',
+    experimentalScriptSetupVars
+  )
+
+  describe('temporary supports.', () => {
+    const config = Object.assign({}, baseConfig, {
+      globals: { console: false },
+      rules: {
+        'vue/experimental-script-setup-vars': 'error',
+        'no-undef': 'error'
+      }
+    })
+
+    it('should not be marked.', () => {
+      const code = `
+      <script setup="props, { emit }">
+      import { watchEffect } from 'vue'
+
+      watchEffect(() => console.log(props.msg))
+      emit('foo')
+      </script>`
+      const messages = linter.verify(code, config, 'test.vue')
+      assert.deepStrictEqual(messages, [])
+    })
+  })
+})