diff --git a/lib/utils/indent-common.js b/lib/utils/indent-common.js
index 893335569..c86460dac 100644
--- a/lib/utils/indent-common.js
+++ b/lib/utils/indent-common.js
@@ -14,7 +14,7 @@ const assert = require('assert')
// Helpers
// ------------------------------------------------------------------------------
-const KNOWN_NODES = new Set(['ArrayExpression', 'ArrayPattern', 'ArrowFunctionExpression', 'AssignmentExpression', 'AssignmentPattern', 'AwaitExpression', 'BinaryExpression', 'BlockStatement', 'BreakStatement', 'CallExpression', 'CatchClause', 'ClassBody', 'ClassDeclaration', 'ClassExpression', 'ConditionalExpression', 'ContinueStatement', 'DebuggerStatement', 'DoWhileStatement', 'EmptyStatement', 'ExperimentalRestProperty', 'ExperimentalSpreadProperty', 'ExportAllDeclaration', 'ExportDefaultDeclaration', 'ExportNamedDeclaration', 'ExportSpecifier', 'ExpressionStatement', 'ForInStatement', 'ForOfStatement', 'ForStatement', 'FunctionDeclaration', 'FunctionExpression', 'Identifier', 'IfStatement', 'ImportDeclaration', 'ImportDefaultSpecifier', 'ImportNamespaceSpecifier', 'ImportSpecifier', 'LabeledStatement', 'Literal', 'LogicalExpression', 'MemberExpression', 'MetaProperty', 'MethodDefinition', 'NewExpression', 'ObjectExpression', 'ObjectPattern', 'Program', 'Property', 'RestElement', 'ReturnStatement', 'SequenceExpression', 'SpreadElement', 'Super', 'SwitchCase', 'SwitchStatement', 'TaggedTemplateExpression', 'TemplateElement', 'TemplateLiteral', 'ThisExpression', 'ThrowStatement', 'TryStatement', 'UnaryExpression', 'UpdateExpression', 'VariableDeclaration', 'VariableDeclarator', 'WhileStatement', 'WithStatement', 'YieldExpression', 'VAttribute', 'VDirectiveKey', 'VDocumentFragment', 'VElement', 'VEndTag', 'VExpressionContainer', 'VForExpression', 'VIdentifier', 'VLiteral', 'VOnExpression', 'VSlotScopeExpression', 'VStartTag', 'VText'])
+const KNOWN_NODES = new Set(['ArrayExpression', 'ArrayPattern', 'ArrowFunctionExpression', 'AssignmentExpression', 'AssignmentPattern', 'AwaitExpression', 'BinaryExpression', 'BlockStatement', 'BreakStatement', 'CallExpression', 'CatchClause', 'ClassBody', 'ClassDeclaration', 'ClassExpression', 'ConditionalExpression', 'ContinueStatement', 'DebuggerStatement', 'DoWhileStatement', 'EmptyStatement', 'ExperimentalRestProperty', 'ExperimentalSpreadProperty', 'ExportAllDeclaration', 'ExportDefaultDeclaration', 'ExportNamedDeclaration', 'ExportSpecifier', 'ExpressionStatement', 'ForInStatement', 'ForOfStatement', 'ForStatement', 'FunctionDeclaration', 'FunctionExpression', 'Identifier', 'IfStatement', 'ImportDeclaration', 'ImportDefaultSpecifier', 'ImportNamespaceSpecifier', 'ImportSpecifier', 'LabeledStatement', 'Literal', 'LogicalExpression', 'MemberExpression', 'MetaProperty', 'MethodDefinition', 'NewExpression', 'ObjectExpression', 'ObjectPattern', 'Program', 'Property', 'RestElement', 'ReturnStatement', 'SequenceExpression', 'SpreadElement', 'Super', 'SwitchCase', 'SwitchStatement', 'TaggedTemplateExpression', 'TemplateElement', 'TemplateLiteral', 'ThisExpression', 'ThrowStatement', 'TryStatement', 'UnaryExpression', 'UpdateExpression', 'VariableDeclaration', 'VariableDeclarator', 'WhileStatement', 'WithStatement', 'YieldExpression', 'VAttribute', 'VDirectiveKey', 'VDocumentFragment', 'VElement', 'VEndTag', 'VExpressionContainer', 'VFilter', 'VFilterSequenceExpression', 'VForExpression', 'VIdentifier', 'VLiteral', 'VOnExpression', 'VSlotScopeExpression', 'VStartTag', 'VText'])
const LT_CHAR = /[\r\n\u2028\u2029]/
const LINES = /[^\r\n\u2028\u2029]+(?:$|\r\n|[\r\n\u2028\u2029])/g
const BLOCK_COMMENT_PREFIX = /^\s*\*/
@@ -205,6 +205,15 @@ function isNotEmptyTextNode (node) {
return !(node.type === 'VText' && node.value.trim() === '')
}
+/**
+ * Check whether the given token is a pipe operator.
+ * @param {Token} token The token to check.
+ * @returns {boolean} `true` if the token is a pipe operator.
+ */
+function isPipeOperator (token) {
+ return token != null && token.type === 'Punctuator' && token.value === '|'
+}
+
/**
* Get the last element.
* @param {Array} xs The array to get the last element.
@@ -915,6 +924,34 @@ module.exports.defineVisitor = function create (context, tokenStore, defaultOpti
}
},
+ VFilter (node) {
+ const idToken = tokenStore.getFirstToken(node)
+ const lastToken = tokenStore.getLastToken(node)
+ if (isRightParen(lastToken)) {
+ const leftParenToken = tokenStore.getTokenAfter(node.callee)
+ setOffset(leftParenToken, 1, idToken)
+ processNodeList(node.arguments, leftParenToken, lastToken, 1)
+ }
+ },
+
+ VFilterSequenceExpression (node) {
+ if (node.filters.length === 0) {
+ return
+ }
+
+ const firstToken = tokenStore.getFirstToken(node)
+ const tokens = []
+
+ for (const filter of node.filters) {
+ tokens.push(
+ tokenStore.getTokenBefore(filter, isPipeOperator),
+ tokenStore.getFirstToken(filter)
+ )
+ }
+
+ setOffset(tokens, 1, firstToken)
+ },
+
VForExpression (node) {
const firstToken = tokenStore.getFirstToken(node)
const lastOfLeft = last(node.left) || firstToken
diff --git a/package.json b/package.json
index 5f93170b7..de9fc9a1a 100644
--- a/package.json
+++ b/package.json
@@ -44,7 +44,7 @@
"eslint": "^5.0.0"
},
"dependencies": {
- "vue-eslint-parser": "^3.2.1"
+ "vue-eslint-parser": "^4.0.2"
},
"devDependencies": {
"@types/node": "^4.2.16",
diff --git a/tests/fixtures/html-indent/v-filter-sequence-expression-01.vue b/tests/fixtures/html-indent/v-filter-sequence-expression-01.vue
new file mode 100644
index 000000000..cd3639e35
--- /dev/null
+++ b/tests/fixtures/html-indent/v-filter-sequence-expression-01.vue
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/tests/fixtures/html-indent/v-filter-sequence-expression-02.vue b/tests/fixtures/html-indent/v-filter-sequence-expression-02.vue
new file mode 100644
index 000000000..ade7ab38b
--- /dev/null
+++ b/tests/fixtures/html-indent/v-filter-sequence-expression-02.vue
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/tests/fixtures/html-indent/v-filter-sequence-expression-03.vue b/tests/fixtures/html-indent/v-filter-sequence-expression-03.vue
new file mode 100644
index 000000000..7f7f3b81b
--- /dev/null
+++ b/tests/fixtures/html-indent/v-filter-sequence-expression-03.vue
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/tests/fixtures/html-indent/v-filter-sequence-expression-04.vue b/tests/fixtures/html-indent/v-filter-sequence-expression-04.vue
new file mode 100644
index 000000000..ac3daadd2
--- /dev/null
+++ b/tests/fixtures/html-indent/v-filter-sequence-expression-04.vue
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/tests/fixtures/html-indent/v-filter-sequence-expression-05.vue b/tests/fixtures/html-indent/v-filter-sequence-expression-05.vue
new file mode 100644
index 000000000..f69483696
--- /dev/null
+++ b/tests/fixtures/html-indent/v-filter-sequence-expression-05.vue
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/tests/lib/rules/no-unused-vars.js b/tests/lib/rules/no-unused-vars.js
index db67041e1..e033d4871 100644
--- a/tests/lib/rules/no-unused-vars.js
+++ b/tests/lib/rules/no-unused-vars.js
@@ -46,6 +46,9 @@ tester.run('no-unused-vars', rule, {
},
{
code: '{{c}}
'
+ },
+ {
+ code: '{{value | f(x)}}
'
}
],
invalid: [
@@ -80,6 +83,10 @@ tester.run('no-unused-vars', rule, {
{
code: '{{item.name}}
',
errors: ["'key' is defined but never used."]
+ },
+ {
+ code: '{{value | x}}
',
+ errors: ["'x' is defined but never used."]
}
]
})