123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- # vue-eslint-parser
- [](https://www.npmjs.com/package/vue-eslint-parser)
- [](http://www.npmtrends.com/vue-eslint-parser)
- [](https://github.com/vuejs/vue-eslint-parser/actions)
- [](https://codecov.io/gh/vuejs/vue-eslint-parser)
- [](https://david-dm.org/vuejs/vue-eslint-parser)
- 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](https://github.com/vuejs/eslint-plugin-vue) would catch some of the mistakes.
- ## 💿 Installation
- ```bash
- $ npm install --save-dev eslint vue-eslint-parser
- ```
- - Requires Node.js 6.5.0 or later.
- - Requires ESLint 5.0.0 or later.
- - Requires `babel-eslint` 8.1.1 or later if you want it. (optional)
- - Requires `@typescript-eslint/parser` 1.0.0 or later if you want it. (optional)
- ## 📖 Usage
- 1. Write `parser` option into your `.eslintrc.*` file.
- 2. Use glob patterns or `--ext .vue` CLI option.
- ```json
- {
- "extends": "eslint:recommended",
- "parser": "vue-eslint-parser"
- }
- ```
- ```console
- $ eslint "src/**/*.{js,vue}"
- # or
- $ eslint src --ext .vue
- ```
- ## 🔧 Options
- `parserOptions` has the same properties as what [espree](https://github.com/eslint/espree#usage), the default parser of ESLint, is supporting.
- For example:
- ```json
- {
- "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:
- ```json
- {
- "parser": "vue-eslint-parser",
- "parserOptions": {
- "parser": "babel-eslint",
- "sourceType": "module",
- "allowImportExportEverywhere": false
- }
- }
- ```
- ```json
- {
- "parser": "vue-eslint-parser",
- "parserOptions": {
- "parser": "@typescript-eslint/parser"
- }
- }
- ```
- You can also specify an object and change the parser separately for `<script lang="...">`.
- ```jsonc
- {
- "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",
- }
- }
- }
- ```
- 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:
- ```json
- {
- "parser": "vue-eslint-parser",
- "parserOptions": {
- "vueFeatures": {
- "filter": true,
- "interpolationAsNonHTML": false,
- "styleCSSVariableInjection": true,
- }
- }
- }
- ```
- ### 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:
- ```json
- {
- "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.
- ```vue
- <template>
- <div>{{ a | b }}</div>
- </template>
- ```
- However, the following template that are valid in Vue 2 cannot be parsed.
- ```vue
- <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).
- For example:
- ```json
- {
- "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.
- ```vue
- <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](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0043-sfc-style-variables.md).
- ## 🎇 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](./docs/ast.md) is `<template>` AST specification.
- - [mustache-interpolation-spacing.js](https://github.com/vuejs/eslint-plugin-vue/blob/b434ff99d37f35570fa351681e43ba2cf5746db3/lib/rules/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)
- ```ts
- 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.
- - [eol-last](http://eslint.org/docs/rules/eol-last)
- - [linebreak-style](http://eslint.org/docs/rules/linebreak-style)
- - [max-len](http://eslint.org/docs/rules/max-len)
- - [max-lines](http://eslint.org/docs/rules/max-lines)
- - [no-trailing-spaces](http://eslint.org/docs/rules/no-trailing-spaces)
- - [unicode-bom](http://eslint.org/docs/rules/unicode-bom)
- - Other rules which are using the source code text instead of AST might be confused as well.
- ## 📰 Changelog
- - [GitHub Releases](https://github.com/vuejs/vue-eslint-parser/releases)
- ## 🍻 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.
|