• Stars
    star
    444
  • Rank 98,300 (Top 2 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created almost 8 years ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

The ESLint custom parser for `.vue` files.

vue-eslint-parser

npm version Downloads/month Build Status Coverage Status

The ESLint custom parser for .vue files.

โคด๏ธ Motivation

This parser allows us to lint the <template> of .vue files. We can make mistakes easily on <template> if we use complex directives and expressions in the template. This parser and the rules of eslint-plugin-vue would catch some of the mistakes.

๐Ÿ’ฟ Installation

npm install --save-dev eslint vue-eslint-parser
  • Requires Node.js ^14.17.0, 16.0.0 or later.
  • Requires ESLint 6.0.0 or later.

๐Ÿ“– Usage

  1. Write parser option into your .eslintrc.* file.
  2. Use glob patterns or --ext .vue CLI option.
{
    "extends": "eslint:recommended",
    "parser": "vue-eslint-parser"
}
$ eslint "src/**/*.{js,vue}"
# or
$ eslint src --ext .vue

๐Ÿ”ง Options

parserOptions has the same properties as what espree, the default parser of ESLint, is supporting. For example:

{
    "parser": "vue-eslint-parser",
    "parserOptions": {
        "sourceType": "module",
        "ecmaVersion": 2018,
        "ecmaFeatures": {
            "globalReturn": false,
            "impliedStrict": false,
            "jsx": false
        }
    }
}

parserOptions.parser

You can use parserOptions.parser property to specify a custom parser to parse <script> tags. Other properties than parser would be given to the specified parser. For example:

{
    "parser": "vue-eslint-parser",
    "parserOptions": {
        "parser": "@babel/eslint-parser",
        "sourceType": "module"
    }
}
{
    "parser": "vue-eslint-parser",
    "parserOptions": {
        "parser": "@typescript-eslint/parser",
        "sourceType": "module"
    }
}

You can also specify an object and change the parser separately for <script lang="...">.

{
    "parser": "vue-eslint-parser",
    "parserOptions": {
        "parser": {
             // Script parser for `<script>`
            "js": "espree",

             // Script parser for `<script lang="ts">`
            "ts": "@typescript-eslint/parser",

             // Script parser for vue directives (e.g. `v-if=` or `:attribute=`)
             // and vue interpolations (e.g. `{{variable}}`).
             // If not specified, the parser determined by `<script lang ="...">` is used.
            "<template>": "espree",
        }
    }
}

When using JavaScript configuration (.eslintrc.js), you can also give the parser object directly.

const tsParser = require("@typescript-eslint/parser")
const espree = require("espree")

module.exports = {
    parser: "vue-eslint-parser",
    parserOptions: {
        // Single parser
        parser: tsParser,
        // Multiple parser
        parser: {
            js: espree,
            ts: tsParser,
        }
    },
}

If the parserOptions.parser is false, the vue-eslint-parser skips parsing <script> tags completely. This is useful for people who use the language ESLint community doesn't provide custom parser implementation.

parserOptions.vueFeatures

You can use parserOptions.vueFeatures property to specify how to parse related to Vue features. For example:

{
    "parser": "vue-eslint-parser",
    "parserOptions": {
        "vueFeatures": {
            "filter": true,
            "interpolationAsNonHTML": true,
            "styleCSSVariableInjection": true,
            "customMacros": []
        }
    }
}

parserOptions.vueFeatures.filter

You can use parserOptions.vueFeatures.filter property to specify whether to parse the Vue2 filter. If you specify false, the parser does not parse | as a filter. For example:

{
    "parser": "vue-eslint-parser",
    "parserOptions": {
        "vueFeatures": {
            "filter": false
        }
    }
}

If you specify false, it can be parsed in the same way as Vue 3. The following template parses as a bitwise operation.

<template>
  <div>{{ a | b }}</div>
</template>

However, the following template that are valid in Vue 2 cannot be parsed.

<template>
  <div>{{ a | valid:filter }}</div>
</template>

parserOptions.vueFeatures.interpolationAsNonHTML

You can use parserOptions.vueFeatures.interpolationAsNonHTML property to specify whether to parse the interpolation as HTML. If you specify true, the parser handles the interpolation as non-HTML (However, you can use HTML escaping in the interpolation). Default is true. For example:

{
    "parser": "vue-eslint-parser",
    "parserOptions": {
        "vueFeatures": {
            "interpolationAsNonHTML": true
        }
    }
}

If you specify true, it can be parsed in the same way as Vue 3. The following template can be parsed well.

<template>
  <div>{{a<b}}</div>
</template>

But, it cannot be parsed with Vue 2.

parserOptions.vueFeatures.styleCSSVariableInjection

If set to true, to parse expressions in v-bind CSS functions inside <style> tags. v-bind() is parsed into the VExpressionContainer AST node and held in the VElement of <style>. Default is true.

See also to here.

parserOptions.vueFeatures.customMacros

Specifies an array of names of custom macros other than Vue standard macros.
For example, if you have a custom macro defineFoo() and you want it processed by the parser, specify ["defineFoo"].

Note that this option only works in <script setup>.

parserOptions.templateTokenizer

This is an experimental feature. It may be changed or deleted without notice in the minor version.

You can use parserOptions.templateTokenizer property to specify custom tokenizers to parse <template lang="..."> tags.

For example to enable parsing of pug templates:

{
    "parser": "vue-eslint-parser",
    "parserOptions": {
        "templateTokenizer": {
             // template tokenizer for `<template lang="pug">`
            "pug": "vue-eslint-parser-template-tokenizer-pug",
        }
    }
}

This option is only intended for plugin developers. Be careful when using this option directly, as it may change behaviour of rules you might have enabled.
If you just want pug support, use eslint-plugin-vue-pug instead, which uses this option internally.

See implementing-custom-template-tokenizers.md for information on creating your own template tokenizer.

๐ŸŽ‡ Usage for custom rules / plugins

  • This parser provides parserServices to traverse <template>.
    • defineTemplateBodyVisitor(templateVisitor, scriptVisitor, options) ... returns ESLint visitor to traverse <template>.
    • getTemplateBodyTokenStore() ... returns ESLint TokenStore to get the tokens of <template>.
    • getDocumentFragment() ... returns the root VDocumentFragment.
    • defineCustomBlocksVisitor(context, customParser, rule, scriptVisitor) ... returns ESLint visitor that parses and traverses the contents of the custom block.
    • defineDocumentVisitor(documentVisitor, options) ... returns ESLint visitor to traverses the document.
  • ast.md is <template> AST specification.
  • mustache-interpolation-spacing.js is an example.

defineTemplateBodyVisitor(templateBodyVisitor, scriptVisitor, options)

Arguments

  • templateBodyVisitor ... Event handlers for <template>.
  • scriptVisitor ... Event handlers for <script> or scripts. (optional)
  • options ... Options. (optional)
    • templateBodyTriggerSelector ... Script AST node selector that triggers the templateBodyVisitor. Default is "Program:exit". (optional)
import { AST } from "vue-eslint-parser"

export function create(context) {
    return context.parserServices.defineTemplateBodyVisitor(
        // Event handlers for <template>.
        {
            VElement(node: AST.VElement): void {
                //...
            }
        },
        // Event handlers for <script> or scripts. (optional)
        {
            Program(node: AST.ESLintProgram): void {
                //...
            }
        },
        // Options. (optional)
        {
            templateBodyTriggerSelector: "Program:exit"
        }
    )
}

โš ๏ธ Known Limitations

Some rules make warnings due to the outside of <script> tags. Please disable those rules for .vue files as necessary.

๐Ÿ“ฐ Changelog

๐Ÿป Contributing

Welcome contributing!

Please use GitHub's Issues/PRs.

If you want to write code, please execute npm install && npm run setup after you cloned this repository. The npm install command installs dependencies. The npm run setup command initializes ESLint as git submodules for tests.

Development Tools

  • npm test runs tests and measures coverage.
  • npm run build compiles TypeScript source code to index.js, index.js.map, and index.d.ts.
  • npm run coverage shows the coverage result of npm test command with the default browser.
  • npm run clean removes the temporary files which are created by npm test and npm run build.
  • npm run lint runs ESLint.
  • npm run setup setups submodules to develop.
  • npm run update-fixtures updates files in test/fixtures/ast directory based on test/fixtures/ast/*/source.vue files.
  • npm run watch runs build, update-fixtures, and tests with --watch option.

More Repositories

1

vue

This is the repo for Vue 2. For Vue 3, go to https://github.com/vuejs/core
TypeScript
207,650
star
2

awesome-vue

๐ŸŽ‰ A curated list of awesome things related to Vue.js
71,970
star
3

core

๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript
46,527
star
4

vue-cli

๐Ÿ› ๏ธ webpack-based tooling for Vue.js Development
JavaScript
29,761
star
5

vuex

๐Ÿ—ƒ๏ธ Centralized State Management for Vue.js.
JavaScript
28,416
star
6

devtools-v6

โš™๏ธ Browser devtools extension for debugging Vue.js applications.
TypeScript
24,600
star
7

vuepress

๐Ÿ“ Minimalistic Vue-powered static site generator
JavaScript
22,558
star
8

vue-router

๐Ÿšฆ The official router for Vue 2
JavaScript
18,993
star
9

pinia

๐Ÿ Intuitive, type safe, light and flexible Store for Vue using the composition api with DevTools support
TypeScript
13,016
star
10

vitepress

Vite & Vue powered static site generator.
TypeScript
12,445
star
11

vue-hackernews-2.0

HackerNews clone built with Vue 2.0, vue-router & vuex, with server-side rendering
JavaScript
10,957
star
12

petite-vue

6kb subset of Vue optimized for progressive enhancement
TypeScript
9,026
star
13

apollo

๐Ÿš€ Apollo/GraphQL integration for VueJS
TypeScript
6,013
star
14

language-tools

โšก High-performance Vue language tooling based-on Volar.js
TypeScript
5,830
star
15

vue-class-component

ES / TypeScript decorator for class-style Vue components.
TypeScript
5,806
star
16

vetur

Vue tooling for VS Code.
TypeScript
5,739
star
17

v2.vuejs.org

๐Ÿ“„ Documentation for Vue 2
JavaScript
5,036
star
18

vue-loader

๐Ÿ“ฆ Webpack loader for Vue.js components
TypeScript
4,986
star
19

rfcs

RFCs for substantial changes / feature additions to Vue core
4,862
star
20

eslint-plugin-vue

Official ESLint plugin for Vue.js
JavaScript
4,458
star
21

composition-api

Composition API plugin for Vue 2
TypeScript
4,193
star
22

router

๐Ÿšฆ The official router for Vue.js
TypeScript
3,914
star
23

vuefire

๐Ÿ”ฅ Firebase bindings for Vue.js
TypeScript
3,857
star
24

create-vue

๐Ÿ› ๏ธ The recommended way to start a Vite-powered Vue project
Vue
3,667
star
25

vue-test-utils

Component Test Utils for Vue 2
JavaScript
3,566
star
26

vue-rx

๐Ÿ‘๏ธ RxJS integration for Vue.js.
JavaScript
3,349
star
27

docs

๐Ÿ“„ Documentation for Vue 3
Vue
2,933
star
28

vue-touch

Hammer.js wrapper for Vue.js
JavaScript
2,723
star
29

vuex-router-sync

Effortlessly keep vue-router and vuex store in sync.
JavaScript
2,515
star
30

vue-hackernews

HackerNews clone with Vue.js
Vue
2,510
star
31

vue-vapor

Vue Vapor is a variant of Vue that offers rendering without the Virtual DOM.
TypeScript
1,909
star
32

v2.cn.vuejs.org

๐Ÿ‡จ๐Ÿ‡ณ Chinese translation for v2.vuejs.org
JavaScript
1,865
star
33

babel-plugin-transform-vue-jsx

babel plugin for vue 2.0 jsx
JavaScript
1,846
star
34

babel-plugin-jsx

JSX for Vue 3
TypeScript
1,713
star
35

vue-syntax-highlight

๐Ÿ’ก Sublime Text syntax highlighting for single-file Vue components
1,485
star
36

jsx-vue2

monorepo for Babel / Vue JSX related packages
JavaScript
1,468
star
37

devtools-next

The next iteration of Vue DevTools
TypeScript
1,336
star
38

ui

๐Ÿ’ป UI components for official Vue organization apps
Vue
1,329
star
39

vue-docs-zh-cn

่ฏฅ้กน็›ฎๅทฒไธๅ†็ปดๆŠค๏ผŒๆœ‰ๅŠณ้€š่ฟ‡ Vue ๅฎ˜็ฝ‘ๆŸฅ้˜…ๆœ€ๆ–ฐ็š„ๆ–‡ๆกฃ
1,324
star
40

vueify

Browserify transform for single-file Vue components
JavaScript
1,168
star
41

vue-web-component-wrapper

(Vue 2 only) Wrap a Vue component as a web component / custom element.
JavaScript
1,047
star
42

test-utils

Vue Test Utils for Vue 3
TypeScript
1,038
star
43

docs-next-zh-cn

๐Ÿ‡จ๐Ÿ‡ณ Chinese translation for v3.vuejs.org
Vue
951
star
44

repl

Vue SFC REPL as a Vue 3 component
TypeScript
925
star
45

roadmap

๐Ÿ—บ๏ธ Roadmap for the Vue.js project (archive)
846
star
46

rollup-plugin-vue

Roll .vue files
TypeScript
843
star
47

vue-jest

Jest Vue transformer
JavaScript
748
star
48

vue-migration-helper

CLI tool to aid in migration from Vue 1.x to 2.0
JavaScript
594
star
49

vue-dev-server

A POC dev server that allows you to import `*.vue` files via native ES modules imports.
TypeScript
573
star
50

vue2-ssr-docs

Vue.js Server-Side Rendering Guide (for Vue 2)
563
star
51

vue-hot-reload-api

๐ŸŒถ๏ธ Hot reload API for Vue components
JavaScript
466
star
52

vue-animated-list

A Vue.js plugin for easily animating `v-for` rendered lists.
JavaScript
462
star
53

vue-next-webpack-preview

JavaScript
424
star
54

vue-async-data

Async data loading plugin
JavaScript
417
star
55

vue-component-compiler

Compile a single file Vue component into a CommonJS module.
TypeScript
343
star
56

vue-cli-plugin-vue-next

A Vue CLI plugin for trying out vue-next (experimental)
JavaScript
339
star
57

blog

๐Ÿ“ The official Vue.js blog
Vue
331
star
58

eslint-config-vue

JavaScript
327
star
59

component-compiler-utils

Lower level utilities for compiling Vue single file components
TypeScript
321
star
60

tsconfig

Base tsconfig for Vue 3 projects.
301
star
61

vue-test-utils-jest-example

Example project using Jest + vue-test-utils together
JavaScript
296
star
62

vue-template-explorer

Vue template compilation explorer
Vue
267
star
63

vue-codemod

Vue.js codemod scripts
TypeScript
261
star
64

events

Source code for the new Vue.js Events page
Vue
250
star
65

jp.vuejs.org

๐Ÿ‡ฏ๐Ÿ‡ต Japanese translation for vuejs.org
JavaScript
244
star
66

theme

VitePress theme for vuejs.org.
Vue
236
star
67

v3-migration-guide

Vue 2 -> Vue 3 migration guide
JavaScript
218
star
68

vue-element

register a custom element with Vue.js.
JavaScript
209
star
69

vue-curated

๐Ÿ–ผ๏ธ The curated Vue packages list
178
star
70

Discussion

Vue.js discussion
167
star
71

vuex-observable

Consume Vuex actions as Observables using RxJS 5
JavaScript
155
star
72

vue-issue-helper

Vue
145
star
73

composition-api-converter

Automatically migrate components to the Function API
JavaScript
145
star
74

art

๐ŸŽจ Artworks
127
star
75

babel-preset-vue-app

Babel preset for Vue app.
JavaScript
124
star
76

eslint-config-typescript

eslint-config-typescript for vue projects
JavaScript
115
star
77

vue-router-demos

Live demos for vue-router
Vue
107
star
78

eslint-plugin-vue-libs

Eslint plugin for Vue internal development
JavaScript
106
star
79

laravel-elixir-vue-2

Laravel Elixir Vue 2.0 support plugin
JavaScript
105
star
80

vue-test-utils-mocha-webpack-example

Example project using mocha-webpack and vue-test-utils
JavaScript
104
star
81

composition-api-rfc

Vuepress render for the Composition API RFC
JavaScript
104
star
82

ecosystem-ci

Vue Ecosystem CI
TypeScript
92
star
83

babel-preset-vue

Babel preset for transforming Vue JSX.
JavaScript
88
star
84

vue-test-utils-getting-started

Demo project for `vue-test-utils`
JavaScript
81
star
85

vue-webpack-meteor-example

Example using Vue with Meteor, while leveraging the normal Webpack + NPM workflow for your front-end.
Vue
78
star
86

eslint-config-airbnb

ESLint Shareable Configs for Airbnb JavaScript Style Guide in Vue.js Projects
JavaScript
71
star
87

vue-requests

Need a Vue.js module or looking for ideas?
69
star
88

news.vuejs.org

Vue.js News Portal
Vue
67
star
89

vue-curated-client

Official curation list client
Vue
65
star
90

eslint-config-prettier

eslint-config-prettier for vue-cli
JavaScript
65
star
91

vue-test-utils-typescript-example

Example project using TypeScript, Jest + vue-test-utils together
Vue
61
star
92

vue-template-es2015-compiler

Support a subset of handy ES2015 features in Vue 2.0 templates.
JavaScript
61
star
93

create-vue-templates

Snapshots of the generated templates of `npm create vue@latest`
Vue
44
star
94

create-eslint-config

Utility to setup ESLint in Vue.js projects.
JavaScript
43
star
95

eslint-config-standard

ESLint Shareable Configs for JavaScript Standard Style in Vue.js Projects
JavaScript
40
star
96

vue-ssr-html-stream

Transform stream to simplify Vue SSR streaming
HTML
39
star
97

it.vuejs.org

Italian translation for vuejs.org ๐Ÿ‡ฎ๐Ÿ‡น
JavaScript
35
star
98

systemjs-plugin-vue

SystemJS plugin for Vue single file components
JavaScript
34
star
99

test-utils-docs

Docs for vue-test-utils-next
JavaScript
33
star
100

vue-curated-server

JavaScript
31
star