From b815b90b325566560dda7f0f8467544ff58f6b37 Mon Sep 17 00:00:00 2001 From: Toru Nagashima Date: Sat, 2 Dec 2017 19:09:48 +0900 Subject: [PATCH 1/2] Fix: improve range of mustache-interpolation-spacing --- lib/rules/mustache-interpolation-spacing.js | 89 ++++++++++--------- .../rules/mustache-interpolation-spacing.js | 53 ++++------- 2 files changed, 63 insertions(+), 79 deletions(-) diff --git a/lib/rules/mustache-interpolation-spacing.js b/lib/rules/mustache-interpolation-spacing.js index 87d758d9b..9b80d15cc 100644 --- a/lib/rules/mustache-interpolation-spacing.js +++ b/lib/rules/mustache-interpolation-spacing.js @@ -29,36 +29,10 @@ module.exports = { }, create (context) { - const options = context.options[0] - const optSpaces = options !== 'never' - const template = context.parserServices.getTemplateBodyTokenStore && context.parserServices.getTemplateBodyTokenStore() - - // ---------------------------------------------------------------------- - // Helpers - // ---------------------------------------------------------------------- - - function checkTokens (leftToken, rightToken) { - if (leftToken.loc.end.line === rightToken.loc.start.line) { - const spaces = rightToken.loc.start.column - leftToken.loc.end.column - const noSpacesFound = spaces === 0 - - if (optSpaces === noSpacesFound) { - context.report({ - node: rightToken, - loc: { - start: leftToken.loc.end, - end: rightToken.loc.start - }, - message: 'Found {{spaces}} whitespaces, {{type}} expected.', - data: { - spaces: spaces === 0 ? 'none' : spaces, - type: optSpaces ? '1' : 'none' - }, - fix: (fixer) => fixer.replaceTextRange([leftToken.range[1], rightToken.range[0]], optSpaces ? ' ' : '') - }) - } - } - } + const options = context.options[0] || 'always' + const template = + context.parserServices.getTemplateBodyTokenStore && + context.parserServices.getTemplateBodyTokenStore() // ---------------------------------------------------------------------- // Public @@ -66,21 +40,52 @@ module.exports = { return utils.defineTemplateBodyVisitor(context, { 'VExpressionContainer[expression!=null]' (node) { - const tokens = template.getTokens(node, { - includeComments: true, - filter: token => token.type !== 'HTMLWhitespace' // When there is only whitespace between ignore it - }) + const openBrace = template.getFirstToken(node) + const closeBrace = template.getLastToken(node) + + if (!openBrace || !closeBrace || openBrace.type !== 'VExpressionStart' || closeBrace.type !== 'VExpressionEnd') { + return + } - const startToken = tokens.shift() - if (!startToken || startToken.type !== 'VExpressionStart') return - const endToken = tokens.pop() - if (!endToken || endToken.type !== 'VExpressionEnd') return + const firstToken = template.getTokenAfter(openBrace, { includeComments: true }) + const lastToken = template.getTokenBefore(closeBrace, { includeComments: true }) - if (tokens.length > 0) { - checkTokens(startToken, tokens[0]) - checkTokens(tokens[tokens.length - 1], endToken) + if (options === 'always') { + if (openBrace.range[1] === firstToken.range[0]) { + context.report({ + node: openBrace, + message: "Expected 1 space after '{{', but not found.", + fix: (fixer) => fixer.insertTextAfter(openBrace, ' ') + }) + } + if (closeBrace.range[0] === lastToken.range[1]) { + context.report({ + node: closeBrace, + message: "Expected 1 space before '}}', but not found.", + fix: (fixer) => fixer.insertTextBefore(closeBrace, ' ') + }) + } } else { - checkTokens(startToken, endToken) + if (openBrace.range[1] !== firstToken.range[0]) { + context.report({ + loc: { + start: openBrace.loc.start, + end: firstToken.loc.start + }, + message: "Expected no space after '{{', but found.", + fix: (fixer) => fixer.removeRange([openBrace.range[1], firstToken.range[0]]) + }) + } + if (closeBrace.range[0] !== lastToken.range[1]) { + context.report({ + loc: { + start: lastToken.loc.end, + end: closeBrace.loc.end + }, + message: "Expected no space before '}}', but found.", + fix: (fixer) => fixer.removeRange([lastToken.range[1], closeBrace.range[0]]) + }) + } } } }) diff --git a/tests/lib/rules/mustache-interpolation-spacing.js b/tests/lib/rules/mustache-interpolation-spacing.js index 84c8ef971..33ea041ca 100644 --- a/tests/lib/rules/mustache-interpolation-spacing.js +++ b/tests/lib/rules/mustache-interpolation-spacing.js @@ -90,79 +90,58 @@ ruleTester.run('mustache-interpolation-spacing', rule, { code: '', output: '', options: ['always'], - errors: [{ - message: 'Found none whitespaces, 1 expected.', - type: 'VExpressionEnd' - }] + errors: ["Expected 1 space before '}}', but not found."] }, { filename: 'test.vue', code: '', output: '', options: ['always'], - errors: [{ - message: 'Found none whitespaces, 1 expected.', - type: 'Identifier' - }] + errors: ["Expected 1 space after '{{', but not found."] }, { filename: 'test.vue', code: '', output: '', options: ['never'], - errors: [{ - message: 'Found 1 whitespaces, none expected.', - type: 'Identifier' - }] + errors: ["Expected no space after '{{', but found."] }, { filename: 'test.vue', code: '', output: '', options: ['never'], - errors: [{ - message: 'Found 1 whitespaces, none expected.', - type: 'VExpressionEnd' - }] + errors: ["Expected no space before '}}', but found."] }, { filename: 'test.vue', code: '', output: '', options: ['always'], - errors: [{ - message: 'Found none whitespaces, 1 expected.', - type: 'Identifier' - }, { - message: 'Found none whitespaces, 1 expected.', - type: 'VExpressionEnd' - }] + errors: [ + "Expected 1 space after '{{', but not found.", + "Expected 1 space before '}}', but not found." + ] }, { filename: 'test.vue', code: '', output: '', options: ['never'], - errors: [{ - message: 'Found 1 whitespaces, none expected.', - type: 'Identifier' - }, { - message: 'Found 1 whitespaces, none expected.', - type: 'VExpressionEnd' - }] + errors: [ + "Expected no space after '{{', but found.", + "Expected no space before '}}', but found." + ] }, { filename: 'test.vue', code: '', output: '', options: ['never'], - errors: [{ - message: 'Found 3 whitespaces, none expected.', - type: 'Identifier' - }, { - message: 'Found 3 whitespaces, none expected.', - type: 'VExpressionEnd' - }] + errors: [ + "Expected no space after '{{', but found.", + "Expected no space before '}}', but found." + ] } ] }) From d3a0f35996f0d4fae14b32dde1aff76b2e0fe055 Mon Sep 17 00:00:00 2001 From: Toru Nagashima Date: Sun, 3 Dec 2017 20:42:30 +0900 Subject: [PATCH 2/2] Chore: add linebreaks --- lib/rules/mustache-interpolation-spacing.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/rules/mustache-interpolation-spacing.js b/lib/rules/mustache-interpolation-spacing.js index 9b80d15cc..2b5e40a49 100644 --- a/lib/rules/mustache-interpolation-spacing.js +++ b/lib/rules/mustache-interpolation-spacing.js @@ -43,7 +43,12 @@ module.exports = { const openBrace = template.getFirstToken(node) const closeBrace = template.getLastToken(node) - if (!openBrace || !closeBrace || openBrace.type !== 'VExpressionStart' || closeBrace.type !== 'VExpressionEnd') { + if ( + !openBrace || + !closeBrace || + openBrace.type !== 'VExpressionStart' || + closeBrace.type !== 'VExpressionEnd' + ) { return }